From aaa6afed76d442bf81a97f25c31e31fe4dc69433 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 13 Mar 2011 07:46:36 -0400 Subject: [PATCH 001/384] start box2d update branch --HG-- branch : box2d-update From 57e345e91e18fe1e469c71b1c464f5142bb5f215 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 13 Mar 2011 07:59:18 -0400 Subject: [PATCH 002/384] bring in new version of Box2D and update #include paths --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 529 ++++---- src/modules/physics/box2d/Body.h | 2 +- src/modules/physics/box2d/Box2D/Box2D.h | 62 + .../Box2D/Collision/Shapes/b2CircleShape.cpp | 89 ++ .../Box2D/Collision/Shapes/b2CircleShape.h | 87 ++ .../Box2D/Collision/Shapes/b2PolygonShape.cpp | 434 +++++++ .../Box2D/Collision/Shapes/b2PolygonShape.h | 131 ++ .../box2d/Box2D/Collision/Shapes/b2Shape.h | 95 ++ .../box2d/Box2D/Collision/b2BroadPhase.cpp | 116 ++ .../box2d/Box2D/Collision/b2BroadPhase.h | 229 ++++ .../box2d/Box2D/Collision/b2CollideCircle.cpp | 154 +++ .../Collision/b2CollidePolygon.cpp} | 190 ++- .../box2d/Box2D/Collision/b2Collision.cpp | 250 ++++ .../box2d/Box2D/Collision/b2Collision.h | 240 ++++ .../box2d/Box2D/Collision/b2Distance.cpp | 571 +++++++++ .../box2d/Box2D/Collision/b2Distance.h | 141 +++ .../box2d/Box2D/Collision/b2DynamicTree.cpp | 365 ++++++ .../box2d/Box2D/Collision/b2DynamicTree.h | 286 +++++ .../box2d/Box2D/Collision/b2TimeOfImpact.cpp | 483 ++++++++ .../box2d/Box2D/Collision/b2TimeOfImpact.h | 59 + .../Common/b2BlockAllocator.cpp | 11 +- .../Common/b2BlockAllocator.h | 4 +- .../physics/box2d/Box2D/Common/b2Math.cpp | 55 + .../box2d/{Source => Box2D}/Common/b2Math.h | 444 ++++--- .../Common/b2Settings.cpp} | 24 +- .../{Source => Box2D}/Common/b2Settings.h | 113 +- .../Common/b2StackAllocator.cpp | 6 +- .../Common/b2StackAllocator.h | 4 +- .../Dynamics/Contacts/b2CircleContact.cpp | 52 + .../Dynamics/Contacts/b2CircleContact.h | 22 +- .../Box2D/Dynamics/Contacts/b2Contact.cpp | 226 ++++ .../box2d/Box2D/Dynamics/Contacts/b2Contact.h | 242 ++++ .../Dynamics/Contacts/b2ContactSolver.cpp | 623 ++++++++++ .../Dynamics/Contacts/b2ContactSolver.h | 45 +- .../Contacts/b2PolygonAndCircleContact.cpp | 52 + .../Contacts/b2PolygonAndCircleContact.h} | 24 +- .../Dynamics/Contacts/b2PolygonContact.cpp | 52 + .../Dynamics/Contacts/b2PolygonContact.h} | 20 +- .../Box2D/Dynamics/Contacts/b2TOISolver.cpp | 231 ++++ .../Box2D/Dynamics/Contacts/b2TOISolver.h | 51 + .../Dynamics/Joints/b2DistanceJoint.cpp | 77 +- .../Dynamics/Joints/b2DistanceJoint.h | 76 +- .../Box2D/Dynamics/Joints/b2FrictionJoint.cpp | 229 ++++ .../Box2D/Dynamics/Joints/b2FrictionJoint.h | 99 ++ .../Dynamics/Joints/b2GearJoint.cpp | 132 +- .../Dynamics/Joints/b2GearJoint.h | 20 +- .../Dynamics/Joints/b2Joint.cpp | 78 +- .../Dynamics/Joints/b2Joint.h | 95 +- .../Box2D/Dynamics/Joints/b2LineJoint.cpp | 591 +++++++++ .../box2d/Box2D/Dynamics/Joints/b2LineJoint.h | 170 +++ .../Box2D/Dynamics/Joints/b2MouseJoint.cpp | 197 +++ .../Dynamics/Joints/b2MouseJoint.h | 44 +- .../Dynamics/Joints/b2PrismaticJoint.cpp | 586 +++++++++ .../Dynamics/Joints/b2PrismaticJoint.h | 45 +- .../Dynamics/Joints/b2PulleyJoint.cpp | 197 ++- .../Dynamics/Joints/b2PulleyJoint.h | 81 +- .../Box2D/Dynamics/Joints/b2RevoluteJoint.cpp | 478 ++++++++ .../Dynamics/Joints/b2RevoluteJoint.h | 42 +- .../Box2D/Dynamics/Joints/b2WeldJoint.cpp | 219 ++++ .../box2d/Box2D/Dynamics/Joints/b2WeldJoint.h | 82 ++ .../physics/box2d/Box2D/Dynamics/b2Body.cpp | 470 +++++++ .../physics/box2d/Box2D/Dynamics/b2Body.h | 802 ++++++++++++ .../box2d/Box2D/Dynamics/b2ContactManager.cpp | 266 ++++ .../Dynamics/b2ContactManager.h | 36 +- .../box2d/Box2D/Dynamics/b2Fixture.cpp | 163 +++ .../physics/box2d/Box2D/Dynamics/b2Fixture.h | 326 +++++ .../{Source => Box2D}/Dynamics/b2Island.cpp | 286 ++--- .../{Source => Box2D}/Dynamics/b2Island.h | 33 +- .../Dynamics/b2TimeStep.h} | 46 +- .../physics/box2d/Box2D/Dynamics/b2World.cpp | 1076 +++++++++++++++++ .../{Source => Box2D}/Dynamics/b2World.h | 538 +++++---- .../Dynamics/b2WorldCallbacks.cpp | 20 +- .../Dynamics/b2WorldCallbacks.h | 129 +- src/modules/physics/box2d/Contact.h | 2 +- src/modules/physics/box2d/Include/Box2D.h | 52 - src/modules/physics/box2d/Joint.h | 2 +- src/modules/physics/box2d/Shape.h | 2 +- .../Source/Collision/Shapes/b2CircleShape.cpp | 120 -- .../Source/Collision/Shapes/b2CircleShape.h | 92 -- .../Collision/Shapes/b2PolygonShape.cpp | 449 ------- .../Source/Collision/Shapes/b2PolygonShape.h | 163 --- .../box2d/Source/Collision/Shapes/b2Shape.cpp | 167 --- .../box2d/Source/Collision/Shapes/b2Shape.h | 286 ----- .../box2d/Source/Collision/b2BroadPhase.cpp | 668 ---------- .../box2d/Source/Collision/b2BroadPhase.h | 146 --- .../Source/Collision/b2CollideCircle.cpp | 168 --- .../box2d/Source/Collision/b2Collision.cpp | 72 -- .../box2d/Source/Collision/b2Collision.h | 154 --- .../box2d/Source/Collision/b2Distance.cpp | 364 ------ .../box2d/Source/Collision/b2PairManager.cpp | 396 ------ .../box2d/Source/Collision/b2PairManager.h | 121 -- .../box2d/Source/Collision/b2TimeOfImpact.cpp | 112 -- .../physics/box2d/Source/Common/Fixed.h | 477 -------- .../physics/box2d/Source/Common/b2Math.cpp | 54 - .../physics/box2d/Source/Common/jtypes.h | 139 --- .../Dynamics/Contacts/b2CircleContact.cpp | 122 -- .../Source/Dynamics/Contacts/b2Contact.cpp | 172 --- .../Source/Dynamics/Contacts/b2Contact.h | 183 --- .../Dynamics/Contacts/b2ContactSolver.cpp | 360 ------ .../Contacts/b2PolyAndCircleContact.cpp | 158 --- .../Dynamics/Contacts/b2PolyContact.cpp | 157 --- .../Source/Dynamics/Joints/b2MouseJoint.cpp | 146 --- .../Dynamics/Joints/b2PrismaticJoint.cpp | 478 -------- .../Dynamics/Joints/b2RevoluteJoint.cpp | 399 ------ .../physics/box2d/Source/Dynamics/b2Body.cpp | 394 ------ .../physics/box2d/Source/Dynamics/b2Body.h | 587 --------- .../Source/Dynamics/b2ContactManager.cpp | 240 ---- .../physics/box2d/Source/Dynamics/b2World.cpp | 1064 ---------------- src/modules/physics/box2d/World.h | 2 +- 109 files changed, 12874 insertions(+), 10337 deletions(-) create mode 100644 src/modules/physics/box2d/Box2D/Box2D.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp create mode 100644 src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp create mode 100644 src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp rename src/modules/physics/box2d/{Source/Collision/b2CollidePoly.cpp => Box2D/Collision/b2CollidePolygon.cpp} (53%) create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2Collision.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2Distance.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp create mode 100644 src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h rename src/modules/physics/box2d/{Source => Box2D}/Common/b2BlockAllocator.cpp (91%) rename src/modules/physics/box2d/{Source => Box2D}/Common/b2BlockAllocator.h (91%) create mode 100644 src/modules/physics/box2d/Box2D/Common/b2Math.cpp rename src/modules/physics/box2d/{Source => Box2D}/Common/b2Math.h (60%) rename src/modules/physics/box2d/{Source/Dynamics/Contacts/b2NullContact.h => Box2D/Common/b2Settings.cpp} (70%) rename src/modules/physics/box2d/{Source => Box2D}/Common/b2Settings.h (57%) rename src/modules/physics/box2d/{Source => Box2D}/Common/b2StackAllocator.cpp (89%) rename src/modules/physics/box2d/{Source => Box2D}/Common/b2StackAllocator.h (90%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Contacts/b2CircleContact.h (66%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Contacts/b2ContactSolver.h (67%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp rename src/modules/physics/box2d/{Source/Dynamics/Contacts/b2PolyAndCircleContact.h => Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h} (63%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp rename src/modules/physics/box2d/{Source/Dynamics/Contacts/b2PolyContact.h => Box2D/Dynamics/Contacts/b2PolygonContact.h} (69%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.h rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2DistanceJoint.cpp (67%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2DistanceJoint.h (59%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2GearJoint.cpp (57%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2GearJoint.h (85%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2Joint.cpp (61%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2Joint.h (69%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2MouseJoint.h (70%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2PrismaticJoint.h (83%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2PulleyJoint.cpp (57%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2PulleyJoint.h (65%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/Joints/b2RevoluteJoint.h (82%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/b2Body.h create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/b2ContactManager.h (58%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/b2Island.cpp (62%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/b2Island.h (75%) rename src/modules/physics/box2d/{Source/Common/b2Settings.cpp => Box2D/Dynamics/b2TimeStep.h} (57%) create mode 100644 src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/b2World.h (57%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/b2WorldCallbacks.cpp (68%) rename src/modules/physics/box2d/{Source => Box2D}/Dynamics/b2WorldCallbacks.h (50%) delete mode 100644 src/modules/physics/box2d/Include/Box2D.h delete mode 100644 src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.h delete mode 100644 src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.h delete mode 100644 src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.h delete mode 100644 src/modules/physics/box2d/Source/Collision/b2BroadPhase.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/b2BroadPhase.h delete mode 100644 src/modules/physics/box2d/Source/Collision/b2CollideCircle.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/b2Collision.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/b2Collision.h delete mode 100644 src/modules/physics/box2d/Source/Collision/b2Distance.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/b2PairManager.cpp delete mode 100644 src/modules/physics/box2d/Source/Collision/b2PairManager.h delete mode 100644 src/modules/physics/box2d/Source/Collision/b2TimeOfImpact.cpp delete mode 100644 src/modules/physics/box2d/Source/Common/Fixed.h delete mode 100644 src/modules/physics/box2d/Source/Common/b2Math.cpp delete mode 100644 src/modules/physics/box2d/Source/Common/jtypes.h delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Contacts/b2CircleContact.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.h delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Contacts/b2ContactSolver.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyAndCircleContact.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyContact.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Joints/b2MouseJoint.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Joints/b2PrismaticJoint.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/Joints/b2RevoluteJoint.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/b2Body.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/b2Body.h delete mode 100644 src/modules/physics/box2d/Source/Dynamics/b2ContactManager.cpp delete mode 100644 src/modules/physics/box2d/Source/Dynamics/b2World.cpp diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index e0a8c6197..eee5e9af9 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -98,65 +98,34 @@ A946D73C10424AC7002BF36C /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AC510420AC3007D418B /* Mouse.cpp */; }; A946D73D10424AC7002BF36C /* wrap_Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AC710420AC3007D418B /* wrap_Mouse.cpp */; }; A946D7DA10424E57002BF36C /* wrap_GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5810420ACA007D418B /* wrap_GearJoint.cpp */; }; - A946D7DB10424E57002BF36C /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B3410420AC9007D418B /* b2CircleContact.cpp */; }; A946D7DC10424E57002BF36C /* wrap_Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6810420ACA007D418B /* wrap_Shape.cpp */; }; A946D7DD10424E57002BF36C /* wrap_PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6010420ACA007D418B /* wrap_PolygonShape.cpp */; }; A946D7DE10424E57002BF36C /* DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AF110420AC7007D418B /* DistanceJoint.cpp */; }; - A946D7DF10424E57002BF36C /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4A10420ACA007D418B /* b2PulleyJoint.cpp */; }; - A946D7E010424E57002BF36C /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B2D10420AC9007D418B /* b2Island.cpp */; }; - A946D7E110424E57002BF36C /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1E10420AC9007D418B /* b2BlockAllocator.cpp */; }; A946D7E210424E57002BF36C /* Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AEF10420AC7007D418B /* Contact.cpp */; }; - A946D7E310424E57002BF36C /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1210420AC8007D418B /* b2Distance.cpp */; }; A946D7E410424E57002BF36C /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AFA10420AC8007D418B /* Joint.cpp */; }; - A946D7E510424E57002BF36C /* b2PolyContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B3D10420AC9007D418B /* b2PolyContact.cpp */; }; - A946D7E610424E57002BF36C /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4410420AC9007D418B /* b2Joint.cpp */; }; - A946D7E710424E57002BF36C /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B3110420AC9007D418B /* b2WorldCallbacks.cpp */; }; A946D7E810424E57002BF36C /* wrap_PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6410420ACA007D418B /* wrap_PulleyJoint.cpp */; }; - A946D7E910424E57002BF36C /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B2910420AC9007D418B /* b2Body.cpp */; }; - A946D7EA10424E57002BF36C /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1510420AC8007D418B /* b2TimeOfImpact.cpp */; }; A946D7EB10424E57002BF36C /* wrap_DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5610420ACA007D418B /* wrap_DistanceJoint.cpp */; }; A946D7EC10424E57002BF36C /* CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AED10420AC7007D418B /* CircleShape.cpp */; }; - A946D7ED10424E57002BF36C /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B3810420AC9007D418B /* b2ContactSolver.cpp */; }; A946D7EE10424E57002BF36C /* MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AFC10420AC8007D418B /* MouseJoint.cpp */; }; A946D7EF10424E57002BF36C /* wrap_CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5210420ACA007D418B /* wrap_CircleShape.cpp */; }; A946D7F010424E57002BF36C /* wrap_Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5410420ACA007D418B /* wrap_Contact.cpp */; }; - A946D7F110424E57002BF36C /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4810420ACA007D418B /* b2PrismaticJoint.cpp */; }; A946D7F210424E57002BF36C /* RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0610420AC8007D418B /* RevoluteJoint.cpp */; }; - A946D7F310424E57002BF36C /* b2Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1B10420AC9007D418B /* b2Shape.cpp */; }; - A946D7F410424E57002BF36C /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0C10420AC8007D418B /* b2BroadPhase.cpp */; }; - A946D7F510424E57002BF36C /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1910420AC8007D418B /* b2PolygonShape.cpp */; }; A946D7F610424E57002BF36C /* PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0410420AC8007D418B /* PulleyJoint.cpp */; }; - A946D7F710424E57002BF36C /* b2CollidePoly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0F10420AC8007D418B /* b2CollidePoly.cpp */; }; A946D7F810424E57002BF36C /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0810420AC8007D418B /* Shape.cpp */; }; A946D7F910424E57002BF36C /* wrap_World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6A10420ACA007D418B /* wrap_World.cpp */; }; A946D7FA10424E57002BF36C /* wrap_RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6610420ACA007D418B /* wrap_RevoluteJoint.cpp */; }; A946D7FB10424E57002BF36C /* wrap_PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6210420ACA007D418B /* wrap_PrismaticJoint.cpp */; }; A946D7FC10424E57002BF36C /* GrahamScanConvexHull.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AF610420AC7007D418B /* GrahamScanConvexHull.cpp */; }; - A946D7FD10424E57002BF36C /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4C10420ACA007D418B /* b2RevoluteJoint.cpp */; }; A946D7FE10424E57002BF36C /* wrap_MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5C10420ACA007D418B /* wrap_MouseJoint.cpp */; }; A946D7FF10424E57002BF36C /* wrap_Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5E10420ACA007D418B /* wrap_Physics.cpp */; }; - A946D80010424E57002BF36C /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B2B10420AC9007D418B /* b2ContactManager.cpp */; }; - A946D80110424E57002BF36C /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B2410420AC9007D418B /* b2StackAllocator.cpp */; }; A946D80210424E57002BF36C /* PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0210420AC8007D418B /* PrismaticJoint.cpp */; }; - A946D80310424E57002BF36C /* b2PairManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1310420AC8007D418B /* b2PairManager.cpp */; }; - A946D80410424E57002BF36C /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B3610420AC9007D418B /* b2Contact.cpp */; }; - A946D80510424E57002BF36C /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0E10420AC8007D418B /* b2CollideCircle.cpp */; }; - A946D80610424E57002BF36C /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4010420AC9007D418B /* b2DistanceJoint.cpp */; }; A946D80710424E57002BF36C /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AEB10420AC7007D418B /* Body.cpp */; }; - A946D80810424E57002BF36C /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4210420AC9007D418B /* b2GearJoint.cpp */; }; A946D80910424E57002BF36C /* PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0010420AC8007D418B /* PolygonShape.cpp */; }; A946D80A10424E57002BF36C /* GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AF310420AC7007D418B /* GearJoint.cpp */; }; A946D80B10424E57002BF36C /* World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4E10420ACA007D418B /* World.cpp */; }; - A946D80C10424E57002BF36C /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B2010420AC9007D418B /* b2Math.cpp */; }; - A946D80D10424E57002BF36C /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1710420AC8007D418B /* b2CircleShape.cpp */; }; - A946D80E10424E57002BF36C /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B4610420AC9007D418B /* b2MouseJoint.cpp */; }; A946D80F10424E57002BF36C /* Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AFE10420AC8007D418B /* Physics.cpp */; }; - A946D81010424E57002BF36C /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B2F10420AC9007D418B /* b2World.cpp */; }; - A946D81110424E57002BF36C /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B1010420AC8007D418B /* b2Collision.cpp */; }; A946D81210424E57002BF36C /* wrap_Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5A10420ACA007D418B /* wrap_Joint.cpp */; }; - A946D81310424E57002BF36C /* b2PolyAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B3B10420AC9007D418B /* b2PolyAndCircleContact.cpp */; }; A946D81410424E57002BF36C /* wrap_Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5010420ACA007D418B /* wrap_Body.cpp */; }; - A946D81510424E57002BF36C /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B2210420AC9007D418B /* b2Settings.cpp */; }; A946D82A10424EE3002BF36C /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B7F10420ACB007D418B /* Sound.cpp */; }; A946D82B10424EE3002BF36C /* Mpg123Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B7D10420ACB007D418B /* Mpg123Decoder.cpp */; }; A946D82C10424EE3002BF36C /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B7710420ACB007D418B /* Decoder.cpp */; }; @@ -178,9 +147,43 @@ A968F0D91083A9FC00A895AA /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D81083A9FC00A895AA /* Mouse.cpp */; }; A968F0DD1083AA6600A895AA /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DB1083AA6600A895AA /* Shape.cpp */; }; A968F0DE1083AA6600A895AA /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DC1083AA6600A895AA /* Joint.cpp */; }; - A97E3843132A9EDE00198A2F /* love-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A97E3842132A9EDE00198A2F /* love-Info.plist */; }; A986DEB5113249A800810279 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB1113249A800810279 /* Thread.cpp */; }; A986DEB6113249A800810279 /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB3113249A800810279 /* wrap_Thread.cpp */; }; + A986EC64132CE6DB00F048C8 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */; }; + A986EC65132CE6DB00F048C8 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCA132CE6D800F048C8 /* b2CollideCircle.cpp */; }; + A986EC66132CE6DB00F048C8 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCB132CE6D800F048C8 /* b2CollidePolygon.cpp */; }; + A986EC67132CE6DB00F048C8 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCC132CE6D800F048C8 /* b2Collision.cpp */; }; + A986EC68132CE6DB00F048C8 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCE132CE6D800F048C8 /* b2Distance.cpp */; }; + A986EC69132CE6DB00F048C8 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD0132CE6D800F048C8 /* b2DynamicTree.cpp */; }; + A986EC6A132CE6DB00F048C8 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD2132CE6D800F048C8 /* b2TimeOfImpact.cpp */; }; + A986EC6B132CE6DB00F048C8 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD5132CE6D800F048C8 /* b2CircleShape.cpp */; }; + A986EC6C132CE6DB00F048C8 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD7132CE6D800F048C8 /* b2PolygonShape.cpp */; }; + A986EC6D132CE6DB00F048C8 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBDB132CE6D800F048C8 /* b2BlockAllocator.cpp */; }; + A986EC6E132CE6DB00F048C8 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBDD132CE6D800F048C8 /* b2Math.cpp */; }; + A986EC6F132CE6DB00F048C8 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBDF132CE6D800F048C8 /* b2Settings.cpp */; }; + A986EC70132CE6DB00F048C8 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE1132CE6D800F048C8 /* b2StackAllocator.cpp */; }; + A986EC71132CE6DB00F048C8 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE4132CE6D800F048C8 /* b2Body.cpp */; }; + A986EC72132CE6DB00F048C8 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE6132CE6D800F048C8 /* b2ContactManager.cpp */; }; + A986EC73132CE6DB00F048C8 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE8132CE6D800F048C8 /* b2Fixture.cpp */; }; + A986EC74132CE6DB00F048C8 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBEA132CE6D800F048C8 /* b2Island.cpp */; }; + A986EC75132CE6DB00F048C8 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBED132CE6D800F048C8 /* b2World.cpp */; }; + A986EC76132CE6DB00F048C8 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBEF132CE6D800F048C8 /* b2WorldCallbacks.cpp */; }; + A986EC77132CE6DB00F048C8 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF2132CE6D800F048C8 /* b2CircleContact.cpp */; }; + A986EC78132CE6DB00F048C8 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF4132CE6D800F048C8 /* b2Contact.cpp */; }; + A986EC79132CE6DB00F048C8 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */; }; + A986EC7A132CE6DB00F048C8 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */; }; + A986EC7B132CE6DB00F048C8 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */; }; + A986EC7C132CE6DB00F048C8 /* b2TOISolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFC132CE6D800F048C8 /* b2TOISolver.cpp */; }; + A986EC7D132CE6DB00F048C8 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */; }; + A986EC7E132CE6DB00F048C8 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */; }; + A986EC7F132CE6DB00F048C8 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC03132CE6D800F048C8 /* b2GearJoint.cpp */; }; + A986EC80132CE6DB00F048C8 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC05132CE6D800F048C8 /* b2Joint.cpp */; }; + A986EC81132CE6DB00F048C8 /* b2LineJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC07132CE6D800F048C8 /* b2LineJoint.cpp */; }; + A986EC82132CE6DB00F048C8 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */; }; + A986EC83132CE6DB00F048C8 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */; }; + A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */; }; + A986EC85132CE6DB00F048C8 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */; }; + A986EC86132CE6DB00F048C8 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */; }; A98D914410507C97008E03F2 /* EncodedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98D914310507C97008E03F2 /* EncodedImageData.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; A9B4BA9D1045937F001DBC80 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */; }; @@ -416,7 +419,6 @@ A93E6AF410420AC7007D418B /* GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GearJoint.h; sourceTree = ""; }; A93E6AF610420AC7007D418B /* GrahamScanConvexHull.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GrahamScanConvexHull.cpp; sourceTree = ""; }; A93E6AF710420AC8007D418B /* GrahamScanConvexHull.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrahamScanConvexHull.h; sourceTree = ""; }; - A93E6AF910420AC8007D418B /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; A93E6AFA10420AC8007D418B /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; A93E6AFB10420AC8007D418B /* Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joint.h; sourceTree = ""; }; A93E6AFC10420AC8007D418B /* MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseJoint.cpp; sourceTree = ""; }; @@ -433,67 +435,6 @@ A93E6B0710420AC8007D418B /* RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RevoluteJoint.h; sourceTree = ""; }; A93E6B0810420AC8007D418B /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = ""; }; A93E6B0910420AC8007D418B /* Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shape.h; sourceTree = ""; }; - A93E6B0C10420AC8007D418B /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; - A93E6B0D10420AC8007D418B /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; - A93E6B0E10420AC8007D418B /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; - A93E6B0F10420AC8007D418B /* b2CollidePoly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePoly.cpp; sourceTree = ""; }; - A93E6B1010420AC8007D418B /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; - A93E6B1110420AC8007D418B /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; - A93E6B1210420AC8007D418B /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; - A93E6B1310420AC8007D418B /* b2PairManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PairManager.cpp; sourceTree = ""; }; - A93E6B1410420AC8007D418B /* b2PairManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PairManager.h; sourceTree = ""; }; - A93E6B1510420AC8007D418B /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; - A93E6B1710420AC8007D418B /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; - A93E6B1810420AC8007D418B /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; - A93E6B1910420AC8007D418B /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; - A93E6B1A10420AC8007D418B /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; - A93E6B1B10420AC9007D418B /* b2Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Shape.cpp; sourceTree = ""; }; - A93E6B1C10420AC9007D418B /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; - A93E6B1E10420AC9007D418B /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; - A93E6B1F10420AC9007D418B /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; - A93E6B2010420AC9007D418B /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; - A93E6B2110420AC9007D418B /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; - A93E6B2210420AC9007D418B /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; - A93E6B2310420AC9007D418B /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; - A93E6B2410420AC9007D418B /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; - A93E6B2510420AC9007D418B /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; - A93E6B2610420AC9007D418B /* Fixed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fixed.h; sourceTree = ""; }; - A93E6B2710420AC9007D418B /* jtypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jtypes.h; sourceTree = ""; }; - A93E6B2910420AC9007D418B /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; - A93E6B2A10420AC9007D418B /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; - A93E6B2B10420AC9007D418B /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; - A93E6B2C10420AC9007D418B /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; - A93E6B2D10420AC9007D418B /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; - A93E6B2E10420AC9007D418B /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; - A93E6B2F10420AC9007D418B /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; - A93E6B3010420AC9007D418B /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; - A93E6B3110420AC9007D418B /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; - A93E6B3210420AC9007D418B /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; - A93E6B3410420AC9007D418B /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; - A93E6B3510420AC9007D418B /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; - A93E6B3610420AC9007D418B /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; - A93E6B3710420AC9007D418B /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; - A93E6B3810420AC9007D418B /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; - A93E6B3910420AC9007D418B /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; - A93E6B3A10420AC9007D418B /* b2NullContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2NullContact.h; sourceTree = ""; }; - A93E6B3B10420AC9007D418B /* b2PolyAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolyAndCircleContact.cpp; sourceTree = ""; }; - A93E6B3C10420AC9007D418B /* b2PolyAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolyAndCircleContact.h; sourceTree = ""; }; - A93E6B3D10420AC9007D418B /* b2PolyContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolyContact.cpp; sourceTree = ""; }; - A93E6B3E10420AC9007D418B /* b2PolyContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolyContact.h; sourceTree = ""; }; - A93E6B4010420AC9007D418B /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; - A93E6B4110420AC9007D418B /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; - A93E6B4210420AC9007D418B /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; - A93E6B4310420AC9007D418B /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; - A93E6B4410420AC9007D418B /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; - A93E6B4510420AC9007D418B /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; - A93E6B4610420AC9007D418B /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; - A93E6B4710420ACA007D418B /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; - A93E6B4810420ACA007D418B /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; - A93E6B4910420ACA007D418B /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; - A93E6B4A10420ACA007D418B /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; - A93E6B4B10420ACA007D418B /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; - A93E6B4C10420ACA007D418B /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; - A93E6B4D10420ACA007D418B /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; A93E6B4E10420ACA007D418B /* World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = World.cpp; sourceTree = ""; }; A93E6B4F10420ACA007D418B /* World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = World.h; sourceTree = ""; }; A93E6B5010420ACA007D418B /* wrap_Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Body.cpp; sourceTree = ""; }; @@ -586,6 +527,77 @@ A986DEB2113249A800810279 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; A986DEB3113249A800810279 /* wrap_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Thread.cpp; sourceTree = ""; }; A986DEB4113249A800810279 /* wrap_Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Thread.h; sourceTree = ""; }; + A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; + A986EBC9132CE6D800F048C8 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; + A986EBCA132CE6D800F048C8 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; + A986EBCB132CE6D800F048C8 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; + A986EBCC132CE6D800F048C8 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; + A986EBCD132CE6D800F048C8 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; + A986EBCE132CE6D800F048C8 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; + A986EBCF132CE6D800F048C8 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; + A986EBD0132CE6D800F048C8 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; + A986EBD1132CE6D800F048C8 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; + A986EBD2132CE6D800F048C8 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; + A986EBD3132CE6D800F048C8 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; + A986EBD5132CE6D800F048C8 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; + A986EBD6132CE6D800F048C8 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; + A986EBD7132CE6D800F048C8 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; + A986EBD8132CE6D800F048C8 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; + A986EBD9132CE6D800F048C8 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; + A986EBDB132CE6D800F048C8 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; + A986EBDC132CE6D800F048C8 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; + A986EBDD132CE6D800F048C8 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; + A986EBDE132CE6D800F048C8 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; + A986EBDF132CE6D800F048C8 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; + A986EBE0132CE6D800F048C8 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; + A986EBE1132CE6D800F048C8 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; + A986EBE2132CE6D800F048C8 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; + A986EBE4132CE6D800F048C8 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; + A986EBE5132CE6D800F048C8 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; + A986EBE6132CE6D800F048C8 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; + A986EBE7132CE6D800F048C8 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; + A986EBE8132CE6D800F048C8 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; + A986EBE9132CE6D800F048C8 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; + A986EBEA132CE6D800F048C8 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; + A986EBEB132CE6D800F048C8 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; + A986EBEC132CE6D800F048C8 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; + A986EBED132CE6D800F048C8 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; + A986EBEE132CE6D800F048C8 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; + A986EBEF132CE6D800F048C8 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; + A986EBF0132CE6D800F048C8 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; + A986EBF2132CE6D800F048C8 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; + A986EBF3132CE6D800F048C8 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; + A986EBF4132CE6D800F048C8 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; + A986EBF5132CE6D800F048C8 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; + A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; + A986EBF7132CE6D800F048C8 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; + A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; + A986EBF9132CE6D800F048C8 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; + A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; + A986EBFB132CE6D800F048C8 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; + A986EBFC132CE6D800F048C8 /* b2TOISolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TOISolver.cpp; sourceTree = ""; }; + A986EBFD132CE6D800F048C8 /* b2TOISolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TOISolver.h; sourceTree = ""; }; + A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; + A986EC00132CE6D800F048C8 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; + A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; + A986EC02132CE6D800F048C8 /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = ""; }; + A986EC03132CE6D800F048C8 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; + A986EC04132CE6D800F048C8 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; + A986EC05132CE6D800F048C8 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; + A986EC06132CE6D800F048C8 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; + A986EC07132CE6D800F048C8 /* b2LineJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LineJoint.cpp; sourceTree = ""; }; + A986EC08132CE6D800F048C8 /* b2LineJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LineJoint.h; sourceTree = ""; }; + A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; + A986EC0A132CE6D800F048C8 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; + A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; + A986EC0C132CE6D800F048C8 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; + A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; + A986EC0E132CE6D800F048C8 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; + A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; + A986EC10132CE6D800F048C8 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; + A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; + A986EC12132CE6D800F048C8 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; + A986ECAC132CE82F00F048C8 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; A98D913E10507BF9008E03F2 /* EncodedImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EncodedImageData.h; sourceTree = ""; }; A98D914310507C97008E03F2 /* EncodedImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EncodedImageData.cpp; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; @@ -1125,6 +1137,7 @@ children = ( A93E6AEB10420AC7007D418B /* Body.cpp */, A93E6AEC10420AC7007D418B /* Body.h */, + A986EBC3132CE6D800F048C8 /* Box2D */, A93E6AED10420AC7007D418B /* CircleShape.cpp */, A93E6AEE10420AC7007D418B /* CircleShape.h */, A93E6AEF10420AC7007D418B /* Contact.cpp */, @@ -1134,7 +1147,6 @@ A93E6AF310420AC7007D418B /* GearJoint.cpp */, A93E6AF410420AC7007D418B /* GearJoint.h */, A93E6AF510420AC7007D418B /* graham */, - A93E6AF810420AC8007D418B /* Include */, A93E6AFA10420AC8007D418B /* Joint.cpp */, A93E6AFB10420AC8007D418B /* Joint.h */, A93E6AFC10420AC8007D418B /* MouseJoint.cpp */, @@ -1151,7 +1163,6 @@ A93E6B0710420AC8007D418B /* RevoluteJoint.h */, A93E6B0810420AC8007D418B /* Shape.cpp */, A93E6B0910420AC8007D418B /* Shape.h */, - A93E6B0A10420AC8007D418B /* Source */, A93E6B4E10420ACA007D418B /* World.cpp */, A93E6B4F10420ACA007D418B /* World.h */, A93E6B5010420ACA007D418B /* wrap_Body.cpp */, @@ -1195,130 +1206,6 @@ path = graham; sourceTree = ""; }; - A93E6AF810420AC8007D418B /* Include */ = { - isa = PBXGroup; - children = ( - A93E6AF910420AC8007D418B /* Box2D.h */, - ); - path = Include; - sourceTree = ""; - }; - A93E6B0A10420AC8007D418B /* Source */ = { - isa = PBXGroup; - children = ( - A93E6B0B10420AC8007D418B /* Collision */, - A93E6B1D10420AC9007D418B /* Common */, - A93E6B2810420AC9007D418B /* Dynamics */, - ); - path = Source; - sourceTree = ""; - }; - A93E6B0B10420AC8007D418B /* Collision */ = { - isa = PBXGroup; - children = ( - A93E6B0C10420AC8007D418B /* b2BroadPhase.cpp */, - A93E6B0D10420AC8007D418B /* b2BroadPhase.h */, - A93E6B0E10420AC8007D418B /* b2CollideCircle.cpp */, - A93E6B0F10420AC8007D418B /* b2CollidePoly.cpp */, - A93E6B1010420AC8007D418B /* b2Collision.cpp */, - A93E6B1110420AC8007D418B /* b2Collision.h */, - A93E6B1210420AC8007D418B /* b2Distance.cpp */, - A93E6B1310420AC8007D418B /* b2PairManager.cpp */, - A93E6B1410420AC8007D418B /* b2PairManager.h */, - A93E6B1510420AC8007D418B /* b2TimeOfImpact.cpp */, - A93E6B1610420AC8007D418B /* Shapes */, - ); - path = Collision; - sourceTree = ""; - }; - A93E6B1610420AC8007D418B /* Shapes */ = { - isa = PBXGroup; - children = ( - A93E6B1710420AC8007D418B /* b2CircleShape.cpp */, - A93E6B1810420AC8007D418B /* b2CircleShape.h */, - A93E6B1910420AC8007D418B /* b2PolygonShape.cpp */, - A93E6B1A10420AC8007D418B /* b2PolygonShape.h */, - A93E6B1B10420AC9007D418B /* b2Shape.cpp */, - A93E6B1C10420AC9007D418B /* b2Shape.h */, - ); - path = Shapes; - sourceTree = ""; - }; - A93E6B1D10420AC9007D418B /* Common */ = { - isa = PBXGroup; - children = ( - A93E6B1E10420AC9007D418B /* b2BlockAllocator.cpp */, - A93E6B1F10420AC9007D418B /* b2BlockAllocator.h */, - A93E6B2010420AC9007D418B /* b2Math.cpp */, - A93E6B2110420AC9007D418B /* b2Math.h */, - A93E6B2210420AC9007D418B /* b2Settings.cpp */, - A93E6B2310420AC9007D418B /* b2Settings.h */, - A93E6B2410420AC9007D418B /* b2StackAllocator.cpp */, - A93E6B2510420AC9007D418B /* b2StackAllocator.h */, - A93E6B2610420AC9007D418B /* Fixed.h */, - A93E6B2710420AC9007D418B /* jtypes.h */, - ); - path = Common; - sourceTree = ""; - }; - A93E6B2810420AC9007D418B /* Dynamics */ = { - isa = PBXGroup; - children = ( - A93E6B2910420AC9007D418B /* b2Body.cpp */, - A93E6B2A10420AC9007D418B /* b2Body.h */, - A93E6B2B10420AC9007D418B /* b2ContactManager.cpp */, - A93E6B2C10420AC9007D418B /* b2ContactManager.h */, - A93E6B2D10420AC9007D418B /* b2Island.cpp */, - A93E6B2E10420AC9007D418B /* b2Island.h */, - A93E6B2F10420AC9007D418B /* b2World.cpp */, - A93E6B3010420AC9007D418B /* b2World.h */, - A93E6B3110420AC9007D418B /* b2WorldCallbacks.cpp */, - A93E6B3210420AC9007D418B /* b2WorldCallbacks.h */, - A93E6B3310420AC9007D418B /* Contacts */, - A93E6B3F10420AC9007D418B /* Joints */, - ); - path = Dynamics; - sourceTree = ""; - }; - A93E6B3310420AC9007D418B /* Contacts */ = { - isa = PBXGroup; - children = ( - A93E6B3410420AC9007D418B /* b2CircleContact.cpp */, - A93E6B3510420AC9007D418B /* b2CircleContact.h */, - A93E6B3610420AC9007D418B /* b2Contact.cpp */, - A93E6B3710420AC9007D418B /* b2Contact.h */, - A93E6B3810420AC9007D418B /* b2ContactSolver.cpp */, - A93E6B3910420AC9007D418B /* b2ContactSolver.h */, - A93E6B3A10420AC9007D418B /* b2NullContact.h */, - A93E6B3B10420AC9007D418B /* b2PolyAndCircleContact.cpp */, - A93E6B3C10420AC9007D418B /* b2PolyAndCircleContact.h */, - A93E6B3D10420AC9007D418B /* b2PolyContact.cpp */, - A93E6B3E10420AC9007D418B /* b2PolyContact.h */, - ); - path = Contacts; - sourceTree = ""; - }; - A93E6B3F10420AC9007D418B /* Joints */ = { - isa = PBXGroup; - children = ( - A93E6B4010420AC9007D418B /* b2DistanceJoint.cpp */, - A93E6B4110420AC9007D418B /* b2DistanceJoint.h */, - A93E6B4210420AC9007D418B /* b2GearJoint.cpp */, - A93E6B4310420AC9007D418B /* b2GearJoint.h */, - A93E6B4410420AC9007D418B /* b2Joint.cpp */, - A93E6B4510420AC9007D418B /* b2Joint.h */, - A93E6B4610420AC9007D418B /* b2MouseJoint.cpp */, - A93E6B4710420ACA007D418B /* b2MouseJoint.h */, - A93E6B4810420ACA007D418B /* b2PrismaticJoint.cpp */, - A93E6B4910420ACA007D418B /* b2PrismaticJoint.h */, - A93E6B4A10420ACA007D418B /* b2PulleyJoint.cpp */, - A93E6B4B10420ACA007D418B /* b2PulleyJoint.h */, - A93E6B4C10420ACA007D418B /* b2RevoluteJoint.cpp */, - A93E6B4D10420ACA007D418B /* b2RevoluteJoint.h */, - ); - path = Joints; - sourceTree = ""; - }; A93E6B7410420ACB007D418B /* sound */ = { isa = PBXGroup; children = ( @@ -1428,6 +1315,132 @@ path = sdl; sourceTree = ""; }; + A986EBC3132CE6D800F048C8 /* Box2D */ = { + isa = PBXGroup; + children = ( + A986ECAC132CE82F00F048C8 /* Box2D.h */, + A986EBC7132CE6D800F048C8 /* Collision */, + A986EBDA132CE6D800F048C8 /* Common */, + A986EBE3132CE6D800F048C8 /* Dynamics */, + ); + path = Box2D; + sourceTree = ""; + }; + A986EBC7132CE6D800F048C8 /* Collision */ = { + isa = PBXGroup; + children = ( + A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */, + A986EBC9132CE6D800F048C8 /* b2BroadPhase.h */, + A986EBCA132CE6D800F048C8 /* b2CollideCircle.cpp */, + A986EBCB132CE6D800F048C8 /* b2CollidePolygon.cpp */, + A986EBCC132CE6D800F048C8 /* b2Collision.cpp */, + A986EBCD132CE6D800F048C8 /* b2Collision.h */, + A986EBCE132CE6D800F048C8 /* b2Distance.cpp */, + A986EBCF132CE6D800F048C8 /* b2Distance.h */, + A986EBD0132CE6D800F048C8 /* b2DynamicTree.cpp */, + A986EBD1132CE6D800F048C8 /* b2DynamicTree.h */, + A986EBD2132CE6D800F048C8 /* b2TimeOfImpact.cpp */, + A986EBD3132CE6D800F048C8 /* b2TimeOfImpact.h */, + A986EBD4132CE6D800F048C8 /* Shapes */, + ); + path = Collision; + sourceTree = ""; + }; + A986EBD4132CE6D800F048C8 /* Shapes */ = { + isa = PBXGroup; + children = ( + A986EBD5132CE6D800F048C8 /* b2CircleShape.cpp */, + A986EBD6132CE6D800F048C8 /* b2CircleShape.h */, + A986EBD7132CE6D800F048C8 /* b2PolygonShape.cpp */, + A986EBD8132CE6D800F048C8 /* b2PolygonShape.h */, + A986EBD9132CE6D800F048C8 /* b2Shape.h */, + ); + path = Shapes; + sourceTree = ""; + }; + A986EBDA132CE6D800F048C8 /* Common */ = { + isa = PBXGroup; + children = ( + A986EBDB132CE6D800F048C8 /* b2BlockAllocator.cpp */, + A986EBDC132CE6D800F048C8 /* b2BlockAllocator.h */, + A986EBDD132CE6D800F048C8 /* b2Math.cpp */, + A986EBDE132CE6D800F048C8 /* b2Math.h */, + A986EBDF132CE6D800F048C8 /* b2Settings.cpp */, + A986EBE0132CE6D800F048C8 /* b2Settings.h */, + A986EBE1132CE6D800F048C8 /* b2StackAllocator.cpp */, + A986EBE2132CE6D800F048C8 /* b2StackAllocator.h */, + ); + path = Common; + sourceTree = ""; + }; + A986EBE3132CE6D800F048C8 /* Dynamics */ = { + isa = PBXGroup; + children = ( + A986EBE4132CE6D800F048C8 /* b2Body.cpp */, + A986EBE5132CE6D800F048C8 /* b2Body.h */, + A986EBE6132CE6D800F048C8 /* b2ContactManager.cpp */, + A986EBE7132CE6D800F048C8 /* b2ContactManager.h */, + A986EBE8132CE6D800F048C8 /* b2Fixture.cpp */, + A986EBE9132CE6D800F048C8 /* b2Fixture.h */, + A986EBEA132CE6D800F048C8 /* b2Island.cpp */, + A986EBEB132CE6D800F048C8 /* b2Island.h */, + A986EBEC132CE6D800F048C8 /* b2TimeStep.h */, + A986EBED132CE6D800F048C8 /* b2World.cpp */, + A986EBEE132CE6D800F048C8 /* b2World.h */, + A986EBEF132CE6D800F048C8 /* b2WorldCallbacks.cpp */, + A986EBF0132CE6D800F048C8 /* b2WorldCallbacks.h */, + A986EBF1132CE6D800F048C8 /* Contacts */, + A986EBFE132CE6D800F048C8 /* Joints */, + ); + path = Dynamics; + sourceTree = ""; + }; + A986EBF1132CE6D800F048C8 /* Contacts */ = { + isa = PBXGroup; + children = ( + A986EBF2132CE6D800F048C8 /* b2CircleContact.cpp */, + A986EBF3132CE6D800F048C8 /* b2CircleContact.h */, + A986EBF4132CE6D800F048C8 /* b2Contact.cpp */, + A986EBF5132CE6D800F048C8 /* b2Contact.h */, + A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */, + A986EBF7132CE6D800F048C8 /* b2ContactSolver.h */, + A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */, + A986EBF9132CE6D800F048C8 /* b2PolygonAndCircleContact.h */, + A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */, + A986EBFB132CE6D800F048C8 /* b2PolygonContact.h */, + A986EBFC132CE6D800F048C8 /* b2TOISolver.cpp */, + A986EBFD132CE6D800F048C8 /* b2TOISolver.h */, + ); + path = Contacts; + sourceTree = ""; + }; + A986EBFE132CE6D800F048C8 /* Joints */ = { + isa = PBXGroup; + children = ( + A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */, + A986EC00132CE6D800F048C8 /* b2DistanceJoint.h */, + A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */, + A986EC02132CE6D800F048C8 /* b2FrictionJoint.h */, + A986EC03132CE6D800F048C8 /* b2GearJoint.cpp */, + A986EC04132CE6D800F048C8 /* b2GearJoint.h */, + A986EC05132CE6D800F048C8 /* b2Joint.cpp */, + A986EC06132CE6D800F048C8 /* b2Joint.h */, + A986EC07132CE6D800F048C8 /* b2LineJoint.cpp */, + A986EC08132CE6D800F048C8 /* b2LineJoint.h */, + A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */, + A986EC0A132CE6D800F048C8 /* b2MouseJoint.h */, + A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */, + A986EC0C132CE6D800F048C8 /* b2PrismaticJoint.h */, + A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */, + A986EC0E132CE6D800F048C8 /* b2PulleyJoint.h */, + A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */, + A986EC10132CE6D800F048C8 /* b2RevoluteJoint.h */, + A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */, + A986EC12132CE6D800F048C8 /* b2WeldJoint.h */, + ); + path = Joints; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1481,7 +1494,6 @@ files = ( A9DEC1C11046EFA70049C70C /* Love.icns in Resources */, A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */, - A97E3843132A9EDE00198A2F /* love-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1565,65 +1577,34 @@ A946D73C10424AC7002BF36C /* Mouse.cpp in Sources */, A946D73D10424AC7002BF36C /* wrap_Mouse.cpp in Sources */, A946D7DA10424E57002BF36C /* wrap_GearJoint.cpp in Sources */, - A946D7DB10424E57002BF36C /* b2CircleContact.cpp in Sources */, A946D7DC10424E57002BF36C /* wrap_Shape.cpp in Sources */, A946D7DD10424E57002BF36C /* wrap_PolygonShape.cpp in Sources */, A946D7DE10424E57002BF36C /* DistanceJoint.cpp in Sources */, - A946D7DF10424E57002BF36C /* b2PulleyJoint.cpp in Sources */, - A946D7E010424E57002BF36C /* b2Island.cpp in Sources */, - A946D7E110424E57002BF36C /* b2BlockAllocator.cpp in Sources */, A946D7E210424E57002BF36C /* Contact.cpp in Sources */, - A946D7E310424E57002BF36C /* b2Distance.cpp in Sources */, A946D7E410424E57002BF36C /* Joint.cpp in Sources */, - A946D7E510424E57002BF36C /* b2PolyContact.cpp in Sources */, - A946D7E610424E57002BF36C /* b2Joint.cpp in Sources */, - A946D7E710424E57002BF36C /* b2WorldCallbacks.cpp in Sources */, A946D7E810424E57002BF36C /* wrap_PulleyJoint.cpp in Sources */, - A946D7E910424E57002BF36C /* b2Body.cpp in Sources */, - A946D7EA10424E57002BF36C /* b2TimeOfImpact.cpp in Sources */, A946D7EB10424E57002BF36C /* wrap_DistanceJoint.cpp in Sources */, A946D7EC10424E57002BF36C /* CircleShape.cpp in Sources */, - A946D7ED10424E57002BF36C /* b2ContactSolver.cpp in Sources */, A946D7EE10424E57002BF36C /* MouseJoint.cpp in Sources */, A946D7EF10424E57002BF36C /* wrap_CircleShape.cpp in Sources */, A946D7F010424E57002BF36C /* wrap_Contact.cpp in Sources */, - A946D7F110424E57002BF36C /* b2PrismaticJoint.cpp in Sources */, A946D7F210424E57002BF36C /* RevoluteJoint.cpp in Sources */, - A946D7F310424E57002BF36C /* b2Shape.cpp in Sources */, - A946D7F410424E57002BF36C /* b2BroadPhase.cpp in Sources */, - A946D7F510424E57002BF36C /* b2PolygonShape.cpp in Sources */, A946D7F610424E57002BF36C /* PulleyJoint.cpp in Sources */, - A946D7F710424E57002BF36C /* b2CollidePoly.cpp in Sources */, A946D7F810424E57002BF36C /* Shape.cpp in Sources */, A946D7F910424E57002BF36C /* wrap_World.cpp in Sources */, A946D7FA10424E57002BF36C /* wrap_RevoluteJoint.cpp in Sources */, A946D7FB10424E57002BF36C /* wrap_PrismaticJoint.cpp in Sources */, A946D7FC10424E57002BF36C /* GrahamScanConvexHull.cpp in Sources */, - A946D7FD10424E57002BF36C /* b2RevoluteJoint.cpp in Sources */, A946D7FE10424E57002BF36C /* wrap_MouseJoint.cpp in Sources */, A946D7FF10424E57002BF36C /* wrap_Physics.cpp in Sources */, - A946D80010424E57002BF36C /* b2ContactManager.cpp in Sources */, - A946D80110424E57002BF36C /* b2StackAllocator.cpp in Sources */, A946D80210424E57002BF36C /* PrismaticJoint.cpp in Sources */, - A946D80310424E57002BF36C /* b2PairManager.cpp in Sources */, - A946D80410424E57002BF36C /* b2Contact.cpp in Sources */, - A946D80510424E57002BF36C /* b2CollideCircle.cpp in Sources */, - A946D80610424E57002BF36C /* b2DistanceJoint.cpp in Sources */, A946D80710424E57002BF36C /* Body.cpp in Sources */, - A946D80810424E57002BF36C /* b2GearJoint.cpp in Sources */, A946D80910424E57002BF36C /* PolygonShape.cpp in Sources */, A946D80A10424E57002BF36C /* GearJoint.cpp in Sources */, A946D80B10424E57002BF36C /* World.cpp in Sources */, - A946D80C10424E57002BF36C /* b2Math.cpp in Sources */, - A946D80D10424E57002BF36C /* b2CircleShape.cpp in Sources */, - A946D80E10424E57002BF36C /* b2MouseJoint.cpp in Sources */, A946D80F10424E57002BF36C /* Physics.cpp in Sources */, - A946D81010424E57002BF36C /* b2World.cpp in Sources */, - A946D81110424E57002BF36C /* b2Collision.cpp in Sources */, A946D81210424E57002BF36C /* wrap_Joint.cpp in Sources */, - A946D81310424E57002BF36C /* b2PolyAndCircleContact.cpp in Sources */, A946D81410424E57002BF36C /* wrap_Body.cpp in Sources */, - A946D81510424E57002BF36C /* b2Settings.cpp in Sources */, A946D82A10424EE3002BF36C /* Sound.cpp in Sources */, A946D82B10424EE3002BF36C /* Mpg123Decoder.cpp in Sources */, A946D82C10424EE3002BF36C /* Decoder.cpp in Sources */, @@ -1656,6 +1637,41 @@ A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */, A9BD60751226C988007DEC63 /* wrap_Framebuffer.cpp in Sources */, A95684F7125D3555001B276B /* b64.cpp in Sources */, + A986EC64132CE6DB00F048C8 /* b2BroadPhase.cpp in Sources */, + A986EC65132CE6DB00F048C8 /* b2CollideCircle.cpp in Sources */, + A986EC66132CE6DB00F048C8 /* b2CollidePolygon.cpp in Sources */, + A986EC67132CE6DB00F048C8 /* b2Collision.cpp in Sources */, + A986EC68132CE6DB00F048C8 /* b2Distance.cpp in Sources */, + A986EC69132CE6DB00F048C8 /* b2DynamicTree.cpp in Sources */, + A986EC6A132CE6DB00F048C8 /* b2TimeOfImpact.cpp in Sources */, + A986EC6B132CE6DB00F048C8 /* b2CircleShape.cpp in Sources */, + A986EC6C132CE6DB00F048C8 /* b2PolygonShape.cpp in Sources */, + A986EC6D132CE6DB00F048C8 /* b2BlockAllocator.cpp in Sources */, + A986EC6E132CE6DB00F048C8 /* b2Math.cpp in Sources */, + A986EC6F132CE6DB00F048C8 /* b2Settings.cpp in Sources */, + A986EC70132CE6DB00F048C8 /* b2StackAllocator.cpp in Sources */, + A986EC71132CE6DB00F048C8 /* b2Body.cpp in Sources */, + A986EC72132CE6DB00F048C8 /* b2ContactManager.cpp in Sources */, + A986EC73132CE6DB00F048C8 /* b2Fixture.cpp in Sources */, + A986EC74132CE6DB00F048C8 /* b2Island.cpp in Sources */, + A986EC75132CE6DB00F048C8 /* b2World.cpp in Sources */, + A986EC76132CE6DB00F048C8 /* b2WorldCallbacks.cpp in Sources */, + A986EC77132CE6DB00F048C8 /* b2CircleContact.cpp in Sources */, + A986EC78132CE6DB00F048C8 /* b2Contact.cpp in Sources */, + A986EC79132CE6DB00F048C8 /* b2ContactSolver.cpp in Sources */, + A986EC7A132CE6DB00F048C8 /* b2PolygonAndCircleContact.cpp in Sources */, + A986EC7B132CE6DB00F048C8 /* b2PolygonContact.cpp in Sources */, + A986EC7C132CE6DB00F048C8 /* b2TOISolver.cpp in Sources */, + A986EC7D132CE6DB00F048C8 /* b2DistanceJoint.cpp in Sources */, + A986EC7E132CE6DB00F048C8 /* b2FrictionJoint.cpp in Sources */, + A986EC7F132CE6DB00F048C8 /* b2GearJoint.cpp in Sources */, + A986EC80132CE6DB00F048C8 /* b2Joint.cpp in Sources */, + A986EC81132CE6DB00F048C8 /* b2LineJoint.cpp in Sources */, + A986EC82132CE6DB00F048C8 /* b2MouseJoint.cpp in Sources */, + A986EC83132CE6DB00F048C8 /* b2PrismaticJoint.cpp in Sources */, + A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */, + A986EC85132CE6DB00F048C8 /* b2RevoluteJoint.cpp in Sources */, + A986EC86132CE6DB00F048C8 /* b2WeldJoint.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1683,6 +1699,7 @@ /Library/Frameworks/SDL.framework/Headers, ../../src, ../../src/modules, + ../../src/modules/physics/box2d, ); INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ( @@ -1705,6 +1722,14 @@ GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = love_Prefix.pch; + HEADER_SEARCH_PATHS = ( + /Library/Frameworks/Lua.framework/Headers, + /Library/Frameworks/FreeType.framework/Headers, + /Library/Frameworks/SDL.framework/Headers, + ../../src, + ../../src/modules, + ../../src/modules/physics/box2d, + ); INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 9444a39d5..83996e17c 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -28,7 +28,7 @@ // Box2D -#include "Include/Box2D.h" +#include namespace love { diff --git a/src/modules/physics/box2d/Box2D/Box2D.h b/src/modules/physics/box2d/Box2D/Box2D.h new file mode 100644 index 000000000..dc5701f51 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Box2D.h @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +#endif diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp new file mode 100644 index 000000000..a950b0be5 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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; +} + +bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const +{ + b2Vec2 center = transform.position + b2Mul(transform.R, 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) const +{ + b2Vec2 position = transform.position + b2Mul(transform.R, 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) const +{ + b2Vec2 p = transform.position + b2Mul(transform.R, 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/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h new file mode 100644 index 000000000..bb31da898 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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; + + /// Implement b2Shape. + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform) 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/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp new file mode 100644 index 000000000..429e64704 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp @@ -0,0 +1,434 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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_vertexCount = 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_vertexCount = 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.position = center; + xf.R.Set(angle); + + // Transform vertices and normals. + for (int32 i = 0; i < m_vertexCount; ++i) + { + m_vertices[i] = b2Mul(xf, m_vertices[i]); + m_normals[i] = b2Mul(xf.R, m_normals[i]); + } +} + +void b2PolygonShape::SetAsEdge(const b2Vec2& v1, const b2Vec2& v2) +{ + m_vertexCount = 2; + m_vertices[0] = v1; + m_vertices[1] = v2; + m_centroid = 0.5f * (v1 + v2); + m_normals[0] = b2Cross(v2 - v1, 1.0f); + m_normals[0].Normalize(); + m_normals[1] = -m_normals[0]; +} + +static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) +{ + b2Assert(count >= 2); + + b2Vec2 c; c.Set(0.0f, 0.0f); + float32 area = 0.0f; + + if (count == 2) + { + c = 0.5f * (vs[0] + vs[1]); + return c; + } + + // 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(2 <= count && count <= b2_maxPolygonVertices); + m_vertexCount = count; + + // Copy vertices. + for (int32 i = 0; i < m_vertexCount; ++i) + { + m_vertices[i] = vertices[i]; + } + + // Compute normals. Ensure the edges have non-zero length. + for (int32 i = 0; i < m_vertexCount; ++i) + { + int32 i1 = i; + int32 i2 = i + 1 < m_vertexCount ? 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(); + } + +#ifdef _DEBUG + // Ensure the polygon is convex and the interior + // is to the left of each edge. + for (int32 i = 0; i < m_vertexCount; ++i) + { + int32 i1 = i; + int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; + b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; + + for (int32 j = 0; j < m_vertexCount; ++j) + { + // Don't check vertices on the current edge. + if (j == i1 || j == i2) + { + continue; + } + + b2Vec2 r = m_vertices[j] - m_vertices[i1]; + + // Your polygon is non-convex (it has an indentation) or + // has colinear edges. + float32 s = b2Cross(edge, r); + b2Assert(s > 0.0f); + } + } +#endif + + // Compute the polygon centroid. + m_centroid = ComputeCentroid(m_vertices, m_vertexCount); +} + +bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const +{ + b2Vec2 pLocal = b2MulT(xf.R, p - xf.position); + + for (int32 i = 0; i < m_vertexCount; ++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) const +{ + // Put the ray into the polygon's frame of reference. + b2Vec2 p1 = b2MulT(xf.R, input.p1 - xf.position); + b2Vec2 p2 = b2MulT(xf.R, input.p2 - xf.position); + b2Vec2 d = p2 - p1; + + if (m_vertexCount == 2) + { + b2Vec2 v1 = m_vertices[0]; + b2Vec2 v2 = m_vertices[1]; + b2Vec2 normal = m_normals[0]; + + // 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 || 1.0f < 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 = -normal; + } + else + { + output->normal = normal; + } + return true; + } + else + { + float32 lower = 0.0f, upper = input.maxFraction; + + int32 index = -1; + + for (int32 i = 0; i < m_vertexCount; ++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.R, m_normals[index]); + return true; + } + } + + return false; +} + +void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf) const +{ + b2Vec2 lower = b2Mul(xf, m_vertices[0]); + b2Vec2 upper = lower; + + for (int32 i = 1; i < m_vertexCount; ++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_vertexCount >= 2); + + // A line segment has zero mass. + if (m_vertexCount == 2) + { + massData->center = 0.5f * (m_vertices[0] + m_vertices[1]); + massData->mass = 0.0f; + massData->I = 0.0f; + return; + } + + b2Vec2 center; center.Set(0.0f, 0.0f); + float32 area = 0.0f; + float32 I = 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 < m_vertexCount; ++i) + { + pRef += m_vertices[i]; + } + pRef *= 1.0f / count; +#endif + + const float32 k_inv3 = 1.0f / 3.0f; + + for (int32 i = 0; i < m_vertexCount; ++i) + { + // Triangle vertices. + b2Vec2 p1 = pRef; + b2Vec2 p2 = m_vertices[i]; + b2Vec2 p3 = i + 1 < m_vertexCount ? m_vertices[i+1] : m_vertices[0]; + + b2Vec2 e1 = p2 - p1; + b2Vec2 e2 = p3 - p1; + + float32 D = b2Cross(e1, e2); + + float32 triangleArea = 0.5f * D; + area += triangleArea; + + // Area weighted centroid + center += triangleArea * k_inv3 * (p1 + p2 + p3); + + float32 px = p1.x, py = p1.y; + float32 ex1 = e1.x, ey1 = e1.y; + float32 ex2 = e2.x, ey2 = e2.y; + + float32 intx2 = k_inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; + float32 inty2 = k_inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; + + I += D * (intx2 + inty2); + } + + // Total mass + massData->mass = density * area; + + // Center of mass + b2Assert(area > b2_epsilon); + center *= 1.0f / area; + massData->center = center; + + // Inertia tensor relative to the local origin. + massData->I = density * I; +} diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h new file mode 100644 index 000000000..564d4b083 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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. +class b2PolygonShape : public b2Shape +{ +public: + b2PolygonShape(); + + /// Implement b2Shape. + b2Shape* Clone(b2BlockAllocator* allocator) const; + + /// Copy vertices. This assumes the vertices define a convex polygon. + /// It is assumed that the exterior is the the right of each edge. + void Set(const b2Vec2* vertices, int32 vertexCount); + + /// Build vertices to represent an axis-aligned box. + /// @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); + + /// Set this as a single edge. + void SetAsEdge(const b2Vec2& v1, const b2Vec2& v2); + + /// @see b2Shape::TestPoint + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform) 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 m_vertexCount; } + + /// Get a vertex by index. + const b2Vec2& GetVertex(int32 index) const; + + b2Vec2 m_centroid; + b2Vec2 m_vertices[b2_maxPolygonVertices]; + b2Vec2 m_normals[b2_maxPolygonVertices]; + int32 m_vertexCount; +}; + +inline b2PolygonShape::b2PolygonShape() +{ + m_type = e_polygon; + m_radius = b2_polygonRadius; + m_vertexCount = 0; + m_centroid.SetZero(); +} + +inline int32 b2PolygonShape::GetSupport(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_vertexCount; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return bestIndex; +} + +inline const b2Vec2& b2PolygonShape::GetSupportVertex(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_vertexCount; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return m_vertices[bestIndex]; +} + +inline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const +{ + b2Assert(0 <= index && index < m_vertexCount); + return m_vertices[index]; +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h new file mode 100644 index 000000000..9082c0ef9 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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. +class b2Shape +{ +public: + + enum Type + { + e_unknown= -1, + e_circle = 0, + e_polygon = 1, + e_typeCount = 2, + }; + + b2Shape() { m_type = e_unknown; } + 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; + + /// 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 this shape. + /// @param output the ray-cast results. + /// @param input the ray-cast input parameters. + /// @param transform the transform to be applied to the shape. + virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const = 0; + + /// Given a transform, compute the associated axis aligned bounding box for this shape. + /// @param aabb returns the axis aligned box. + /// @param xf the world transform of the shape. + virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf) 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/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp new file mode 100644 index 000000000..12c79678d --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp @@ -0,0 +1,116 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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::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; + return; + } + } +} + +// 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/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h new file mode 100644 index 000000000..bff188e88 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h @@ -0,0 +1,229 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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; + int32 next; +}; + +/// 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); + + /// 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; + + /// Compute the height of the embedded tree. + int32 ComputeHeight() const; + +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::ComputeHeight() const +{ + return m_tree.ComputeHeight(); +} + +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); +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp b/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp new file mode 100644 index 000000000..6edf89d7b --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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_vertexCount; + 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/src/modules/physics/box2d/Source/Collision/b2CollidePoly.cpp b/src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp similarity index 53% rename from src/modules/physics/box2d/Source/Collision/b2CollidePoly.cpp rename to src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp index b4aac6749..b37b7ba92 100644 --- a/src/modules/physics/box2d/Source/Collision/b2CollidePoly.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,59 +16,19 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2Collision.h" -#include "Shapes/b2PolygonShape.h" - -struct ClipVertex -{ - b2Vec2 v; - b2ContactID id; -}; - -static int32 ClipSegmentToLine(ClipVertex vOut[2], ClipVertex vIn[2], - const b2Vec2& normal, float32 offset) -{ - // 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); - if (distance0 > 0.0f) - { - vOut[numOut].id = vIn[0].id; - } - else - { - vOut[numOut].id = vIn[1].id; - } - ++numOut; - } - - return numOut; -} +#include +#include // Find the separation between poly1 and poly2 for a give edge normal on poly1. -static float32 EdgeSeparation(const b2PolygonShape* poly1, const b2XForm& xf1, int32 edge1, - const b2PolygonShape* poly2, const b2XForm& xf2) +static float32 b2EdgeSeparation(const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, + const b2PolygonShape* poly2, const b2Transform& xf2) { - int32 count1 = poly1->GetVertexCount(); - const b2Vec2* vertices1 = poly1->GetVertices(); - const b2Vec2* normals1 = poly1->GetNormals(); + int32 count1 = poly1->m_vertexCount; + const b2Vec2* vertices1 = poly1->m_vertices; + const b2Vec2* normals1 = poly1->m_normals; - int32 count2 = poly2->GetVertexCount(); - const b2Vec2* vertices2 = poly2->GetVertices(); + int32 count2 = poly2->m_vertexCount; + const b2Vec2* vertices2 = poly2->m_vertices; b2Assert(0 <= edge1 && edge1 < count1); @@ -78,7 +38,7 @@ static float32 EdgeSeparation(const b2PolygonShape* poly1, const b2XForm& xf1, i // Find support vertex on poly2 for -normal. int32 index = 0; - float32 minDot = B2_FLT_MAX; + float32 minDot = b2_maxFloat; for (int32 i = 0; i < count2; ++i) { @@ -97,20 +57,20 @@ static float32 EdgeSeparation(const b2PolygonShape* poly1, const b2XForm& xf1, i } // Find the max separation between poly1 and poly2 using edge normals from poly1. -static float32 FindMaxSeparation(int32* edgeIndex, - const b2PolygonShape* poly1, const b2XForm& xf1, - const b2PolygonShape* poly2, const b2XForm& xf2) +static float32 b2FindMaxSeparation(int32* edgeIndex, + const b2PolygonShape* poly1, const b2Transform& xf1, + const b2PolygonShape* poly2, const b2Transform& xf2) { - int32 count1 = poly1->GetVertexCount(); - const b2Vec2* normals1 = poly1->GetNormals(); + int32 count1 = poly1->m_vertexCount; + const b2Vec2* normals1 = poly1->m_normals; // Vector pointing from the centroid of poly1 to the centroid of poly2. - b2Vec2 d = b2Mul(xf2, poly2->GetCentroid()) - b2Mul(xf1, poly1->GetCentroid()); + b2Vec2 d = b2Mul(xf2, poly2->m_centroid) - b2Mul(xf1, poly1->m_centroid); b2Vec2 dLocal1 = b2MulT(xf1.R, d); // Find edge normal on poly1 that has the largest projection onto d. int32 edge = 0; - float32 maxDot = -B2_FLT_MAX; + float32 maxDot = -b2_maxFloat; for (int32 i = 0; i < count1; ++i) { float32 dot = b2Dot(normals1[i], dLocal1); @@ -122,27 +82,15 @@ static float32 FindMaxSeparation(int32* edgeIndex, } // Get the separation for the edge normal. - float32 s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); - if (s > 0.0f) - { - return s; - } + float32 s = b2EdgeSeparation(poly1, xf1, edge, poly2, xf2); // Check the separation for the previous edge normal. int32 prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1; - float32 sPrev = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); - if (sPrev > 0.0f) - { - return sPrev; - } + float32 sPrev = b2EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); // Check the separation for the next edge normal. int32 nextEdge = edge + 1 < count1 ? edge + 1 : 0; - float32 sNext = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); - if (sNext > 0.0f) - { - return sNext; - } + float32 sNext = b2EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); // Find the best edge and the search direction. int32 bestEdge; @@ -174,11 +122,7 @@ static float32 FindMaxSeparation(int32* edgeIndex, else edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0; - s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); - if (s > 0.0f) - { - return s; - } + s = b2EdgeSeparation(poly1, xf1, edge, poly2, xf2); if (s > bestSeparation) { @@ -195,16 +139,16 @@ static float32 FindMaxSeparation(int32* edgeIndex, return bestSeparation; } -static void FindIncidentEdge(ClipVertex c[2], - const b2PolygonShape* poly1, const b2XForm& xf1, int32 edge1, - const b2PolygonShape* poly2, const b2XForm& xf2) +static void b2FindIncidentEdge(b2ClipVertex c[2], + const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, + const b2PolygonShape* poly2, const b2Transform& xf2) { - int32 count1 = poly1->GetVertexCount(); - const b2Vec2* normals1 = poly1->GetNormals(); + int32 count1 = poly1->m_vertexCount; + const b2Vec2* normals1 = poly1->m_normals; - int32 count2 = poly2->GetVertexCount(); - const b2Vec2* vertices2 = poly2->GetVertices(); - const b2Vec2* normals2 = poly2->GetNormals(); + int32 count2 = poly2->m_vertexCount; + const b2Vec2* vertices2 = poly2->m_vertices; + const b2Vec2* normals2 = poly2->m_normals; b2Assert(0 <= edge1 && edge1 < count1); @@ -213,7 +157,7 @@ static void FindIncidentEdge(ClipVertex c[2], // Find the incident edge on poly2. int32 index = 0; - float32 minDot = B2_FLT_MAX; + float32 minDot = b2_maxFloat; for (int32 i = 0; i < count2; ++i) { float32 dot = b2Dot(normal1, normals2[i]); @@ -247,30 +191,30 @@ static void FindIncidentEdge(ClipVertex c[2], // The normal points from 1 to 2 void b2CollidePolygons(b2Manifold* manifold, - const b2PolygonShape* polyA, const b2XForm& xfA, - const b2PolygonShape* polyB, const b2XForm& xfB) + 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 = FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); - if (separationA > 0.0f) + float32 separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); + if (separationA > totalRadius) return; int32 edgeB = 0; - float32 separationB = FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); - if (separationB > 0.0f) + float32 separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); + if (separationB > totalRadius) return; - const b2PolygonShape* poly1; // reference poly - const b2PolygonShape* poly2; // incident poly - b2XForm xf1, xf2; + const b2PolygonShape* poly1; // reference polygon + const b2PolygonShape* poly2; // incident polygon + b2Transform xf1, xf2; int32 edge1; // reference edge uint8 flip; const float32 k_relativeTol = 0.98f; const float32 k_absoluteTol = 0.001f; - // TODO_ERIN use "radius" of poly for absolute tolerance. if (separationB > k_relativeTol * separationA + k_absoluteTol) { poly1 = polyB; @@ -278,6 +222,7 @@ void b2CollidePolygons(b2Manifold* manifold, xf1 = xfB; xf2 = xfA; edge1 = edgeB; + manifold->type = b2Manifold::e_faceB; flip = 1; } else @@ -287,61 +232,70 @@ void b2CollidePolygons(b2Manifold* manifold, xf1 = xfA; xf2 = xfB; edge1 = edgeA; + manifold->type = b2Manifold::e_faceA; flip = 0; } - ClipVertex incidentEdge[2]; - FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + b2ClipVertex incidentEdge[2]; + b2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); - int32 count1 = poly1->GetVertexCount(); - const b2Vec2* vertices1 = poly1->GetVertices(); + int32 count1 = poly1->m_vertexCount; + const b2Vec2* vertices1 = poly1->m_vertices; b2Vec2 v11 = vertices1[edge1]; b2Vec2 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; - b2Vec2 dv = v12 - v11; - b2Vec2 sideNormal = b2Mul(xf1.R, v12 - v11); - sideNormal.Normalize(); - b2Vec2 frontNormal = b2Cross(sideNormal, 1.0f); + b2Vec2 localTangent = v12 - v11; + localTangent.Normalize(); + + b2Vec2 localNormal = b2Cross(localTangent, 1.0f); + b2Vec2 planePoint = 0.5f * (v11 + v12); + + b2Vec2 tangent = b2Mul(xf1.R, localTangent); + b2Vec2 normal = b2Cross(tangent, 1.0f); v11 = b2Mul(xf1, v11); v12 = b2Mul(xf1, v12); - float32 frontOffset = b2Dot(frontNormal, v11); - float32 sideOffset1 = -b2Dot(sideNormal, v11); - float32 sideOffset2 = b2Dot(sideNormal, 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. - ClipVertex clipPoints1[2]; - ClipVertex clipPoints2[2]; + b2ClipVertex clipPoints1[2]; + b2ClipVertex clipPoints2[2]; int np; // Clip to box side 1 - np = ClipSegmentToLine(clipPoints1, incidentEdge, -sideNormal, sideOffset1); + np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1); if (np < 2) return; // Clip to negative box side 1 - np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2); + np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2); if (np < 2) + { return; + } // Now clipPoints2 contains the clipped points. - manifold->normal = flip ? -frontNormal : frontNormal; + manifold->localNormal = localNormal; + manifold->localPoint = planePoint; int32 pointCount = 0; for (int32 i = 0; i < b2_maxManifoldPoints; ++i) { - float32 separation = b2Dot(frontNormal, clipPoints2[i].v) - frontOffset; + float32 separation = b2Dot(normal, clipPoints2[i].v) - frontOffset; - if (separation <= 0.0f) + if (separation <= totalRadius) { b2ManifoldPoint* cp = manifold->points + pointCount; - cp->separation = separation; - cp->localPoint1 = b2MulT(xfA, clipPoints2[i].v); - cp->localPoint2 = b2MulT(xfB, clipPoints2[i].v); + cp->localPoint = b2MulT(xf2, clipPoints2[i].v); cp->id = clipPoints2[i].id; cp->id.features.flip = flip; ++pointCount; diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp b/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp new file mode 100644 index 000000000..a86c7c5a8 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp @@ -0,0 +1,250 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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); + } + break; + + case b2Manifold::e_faceA: + { + normal = b2Mul(xfA.R, 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); + } + } + break; + + case b2Manifold::e_faceB: + { + normal = b2Mul(xfB.R, 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); + } + + // 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) +{ + // 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); + if (distance0 > 0.0f) + { + vOut[numOut].id = vIn[0].id; + } + else + { + vOut[numOut].id = vIn[1].id; + } + ++numOut; + } + + return numOut; +} + +bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, + const b2Transform& xfA, const b2Transform& xfB) +{ + b2DistanceInput input; + input.proxyA.Set(shapeA); + input.proxyB.Set(shapeB); + 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/src/modules/physics/box2d/Box2D/Collision/b2Collision.h b/src/modules/physics/box2d/Box2D/Collision/b2Collision.h new file mode 100644 index 000000000..baffdbde0 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2Collision.h @@ -0,0 +1,240 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 b2PolygonShape; + +const uint8 b2_nullFeature = UCHAR_MAX; + +/// Contact ids to facilitate warm starting. +union b2ContactID +{ + /// The features that intersect to form the contact point + struct Features + { + uint8 referenceEdge; ///< The edge that defines the outward contact normal. + uint8 incidentEdge; ///< The edge most anti-parallel to the reference edge. + uint8 incidentVertex; ///< The vertex (0 or 1) on the incident edge that was clipped. + uint8 flip; ///< A value of 1 indicates that the reference edge is on shape2. + } features; + 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) +}; + +/// 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); + } + + /// 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* circle1, const b2Transform& xf1, + const b2CircleShape* circle2, const b2Transform& xf2); + +/// Compute the collision manifold between a polygon and a circle. +void b2CollidePolygonAndCircle(b2Manifold* manifold, + const b2PolygonShape* polygon, const b2Transform& xf1, + const b2CircleShape* circle, const b2Transform& xf2); + +/// Compute the collision manifold between two polygons. +void b2CollidePolygons(b2Manifold* manifold, + const b2PolygonShape* polygon1, const b2Transform& xf1, + const b2PolygonShape* polygon2, const b2Transform& xf2); + +/// Clipping for contact manifolds. +int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], + const b2Vec2& normal, float32 offset); + +/// Determine if two generic shapes overlap. +bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, + 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/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp b/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp new file mode 100644 index 000000000..f95c82f21 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp @@ -0,0 +1,571 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +// GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. +int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; + +void b2DistanceProxy::Set(const b2Shape* shape) +{ + switch (shape->GetType()) + { + case b2Shape::e_circle: + { + const b2CircleShape* circle = (b2CircleShape*)shape; + m_vertices = &circle->m_p; + m_count = 1; + m_radius = circle->m_radius; + } + break; + + case b2Shape::e_polygon: + { + const b2PolygonShape* polygon = (b2PolygonShape*)shape; + m_vertices = polygon->m_vertices; + m_count = polygon->m_vertexCount; + m_radius = polygon->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; + 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.0; + + 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; + + b2Vec2 closestPoint = simplex.GetClosestPoint(); + float32 distanceSqr1 = closestPoint.LengthSquared(); + 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.R, -d)); + vertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA)); + b2Vec2 wBLocal; + vertex->indexB = proxyB->GetSupport(b2MulT(transformB.R, 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/src/modules/physics/box2d/Box2D/Collision/b2Distance.h b/src/modules/physics/box2d/Box2D/Collision/b2Distance.h new file mode 100644 index 000000000..e56ea0a7b --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2Distance.h @@ -0,0 +1,141 @@ + +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 +#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); + + /// 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; + + 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/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp new file mode 100644 index 000000000..d8a05ebdf --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp @@ -0,0 +1,365 @@ +/* +* Copyright (c) 2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +b2DynamicTree::b2DynamicTree() +{ + m_root = b2_nullNode; + + m_nodeCapacity = 16; + m_nodeCount = 0; + m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); + memset(m_nodes, 0, m_nodeCapacity * sizeof(b2DynamicTreeNode)); + + // 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[m_nodeCapacity-1].next = b2_nullNode; + 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. + b2DynamicTreeNode* oldNodes = m_nodes; + m_nodeCapacity *= 2; + m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); + memcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2DynamicTreeNode)); + 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[m_nodeCapacity-1].next = b2_nullNode; + 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_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_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; + + InsertLeaf(proxyId); + + // Rebalance if necessary. + int32 iterationCount = m_nodeCount >> 4; + int32 tryCount = 0; + int32 height = ComputeHeight(); + while (height > 64 && tryCount < 10) + { + Rebalance(iterationCount); + height = ComputeHeight(); + ++tryCount; + } + + 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. + b2Vec2 center = m_nodes[leaf].aabb.GetCenter(); + int32 sibling = m_root; + if (m_nodes[sibling].IsLeaf() == false) + { + do + { + int32 child1 = m_nodes[sibling].child1; + int32 child2 = m_nodes[sibling].child2; + + b2Vec2 delta1 = b2Abs(m_nodes[child1].aabb.GetCenter() - center); + b2Vec2 delta2 = b2Abs(m_nodes[child2].aabb.GetCenter() - center); + + float32 norm1 = delta1.x + delta1.y; + float32 norm2 = delta2.x + delta2.y; + + if (norm1 < norm2) + { + sibling = child1; + } + else + { + sibling = child2; + } + + } + while(m_nodes[sibling].IsLeaf() == false); + } + + // Create a parent for the siblings. + int32 node1 = m_nodes[sibling].parent; + int32 node2 = AllocateNode(); + m_nodes[node2].parent = node1; + m_nodes[node2].userData = NULL; + m_nodes[node2].aabb.Combine(m_nodes[leaf].aabb, m_nodes[sibling].aabb); + + if (node1 != b2_nullNode) + { + if (m_nodes[m_nodes[sibling].parent].child1 == sibling) + { + m_nodes[node1].child1 = node2; + } + else + { + m_nodes[node1].child2 = node2; + } + + m_nodes[node2].child1 = sibling; + m_nodes[node2].child2 = leaf; + m_nodes[sibling].parent = node2; + m_nodes[leaf].parent = node2; + + do + { + if (m_nodes[node1].aabb.Contains(m_nodes[node2].aabb)) + { + break; + } + + m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); + node2 = node1; + node1 = m_nodes[node1].parent; + } + while(node1 != b2_nullNode); + } + else + { + m_nodes[node2].child1 = sibling; + m_nodes[node2].child2 = leaf; + m_nodes[sibling].parent = node2; + m_nodes[leaf].parent = node2; + m_root = node2; + } +} + +void b2DynamicTree::RemoveLeaf(int32 leaf) +{ + if (leaf == m_root) + { + m_root = b2_nullNode; + return; + } + + int32 node2 = m_nodes[leaf].parent; + int32 node1 = m_nodes[node2].parent; + int32 sibling; + if (m_nodes[node2].child1 == leaf) + { + sibling = m_nodes[node2].child2; + } + else + { + sibling = m_nodes[node2].child1; + } + + if (node1 != b2_nullNode) + { + // Destroy node2 and connect node1 to sibling. + if (m_nodes[node1].child1 == node2) + { + m_nodes[node1].child1 = sibling; + } + else + { + m_nodes[node1].child2 = sibling; + } + m_nodes[sibling].parent = node1; + FreeNode(node2); + + // Adjust ancestor bounds. + while (node1 != b2_nullNode) + { + b2AABB oldAABB = m_nodes[node1].aabb; + m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); + + if (oldAABB.Contains(m_nodes[node1].aabb)) + { + break; + } + + node1 = m_nodes[node1].parent; + } + } + else + { + m_root = sibling; + m_nodes[sibling].parent = b2_nullNode; + FreeNode(node2); + } +} + +void b2DynamicTree::Rebalance(int32 iterations) +{ + if (m_root == b2_nullNode) + { + return; + } + + for (int32 i = 0; i < iterations; ++i) + { + int32 node = m_root; + + uint32 bit = 0; + while (m_nodes[node].IsLeaf() == false) + { + int32* children = &m_nodes[node].child1; + node = children[(m_path >> bit) & 1]; + bit = (bit + 1) & (8* sizeof(uint32) - 1); + } + ++m_path; + + RemoveLeaf(node); + InsertLeaf(node); + } +} + +// Compute the height of a sub-tree. +int32 b2DynamicTree::ComputeHeight(int32 nodeId) const +{ + if (nodeId == b2_nullNode) + { + return 0; + } + + b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); + b2DynamicTreeNode* node = m_nodes + nodeId; + int32 height1 = ComputeHeight(node->child1); + int32 height2 = ComputeHeight(node->child2); + return 1 + b2Max(height1, height2); +} + +int32 b2DynamicTree::ComputeHeight() const +{ + return ComputeHeight(m_root); +} diff --git a/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h new file mode 100644 index 000000000..b67686b5c --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h @@ -0,0 +1,286 @@ +/* +* Copyright (c) 2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. + +#define b2_nullNode (-1) + +/// A node in the dynamic tree. The client does not interact with this directly. +struct b2DynamicTreeNode +{ + bool IsLeaf() const + { + return child1 == b2_nullNode; + } + + /// This is the fattened AABB. + b2AABB aabb; + + //int32 userData; + void* userData; + + union + { + int32 parent; + int32 next; + }; + + int32 child1; + int32 child2; +}; + +/// 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); + + /// Perform some iterations to re-balance the tree. + void Rebalance(int32 iterations); + + /// 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; + + /// Compute the height of the tree. + int32 ComputeHeight() 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; + +private: + + int32 AllocateNode(); + void FreeNode(int32 node); + + void InsertLeaf(int32 node); + void RemoveLeaf(int32 node); + + int32 ComputeHeight(int32 nodeId) const; + + int32 m_root; + + b2DynamicTreeNode* m_nodes; + int32 m_nodeCount; + int32 m_nodeCapacity; + + int32 m_freeList; + + /// This is used 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 +{ + const int32 k_stackSize = 128; + int32 stack[k_stackSize]; + + int32 count = 0; + stack[count++] = m_root; + + while (count > 0) + { + int32 nodeId = stack[--count]; + if (nodeId == b2_nullNode) + { + continue; + } + + const b2DynamicTreeNode* node = m_nodes + nodeId; + + if (b2TestOverlap(node->aabb, aabb)) + { + if (node->IsLeaf()) + { + bool proceed = callback->QueryCallback(nodeId); + if (proceed == false) + { + return; + } + } + else + { + if (count < k_stackSize) + { + stack[count++] = node->child1; + } + + if (count < k_stackSize) + { + stack[count++] = 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); + } + + const int32 k_stackSize = 128; + int32 stack[k_stackSize]; + + int32 count = 0; + stack[count++] = m_root; + + while (count > 0) + { + int32 nodeId = stack[--count]; + if (nodeId == b2_nullNode) + { + continue; + } + + const b2DynamicTreeNode* 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 + { + if (count < k_stackSize) + { + stack[count++] = node->child1; + } + + if (count < k_stackSize) + { + stack[count++] = node->child2; + } + } + } +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp new file mode 100644 index 000000000..b1f2f4e5a --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp @@ -0,0 +1,483 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; +int32 b2_toiRootIters, b2_toiMaxRootIters; + +int32 b2_toiMaxOptIters; + +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) + { + 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, 0.0f); + m_sweepB.GetTransform(&xfB, 0.0f); + + 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.R, 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.R, 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.R, m_axis); + b2Vec2 axisB = b2MulT(xfB.R, -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.R, m_axis); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 axisB = b2MulT(xfB.R, -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.R, m_axis); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 axisA = b2MulT(xfA.R, -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 axisA = b2MulT(xfA.R, m_axis); + b2Vec2 axisB = b2MulT(xfB.R, -m_axis); + + 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.R, m_axis); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 axisB = b2MulT(xfB.R, -normal); + + 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.R, m_axis); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 axisA = b2MulT(xfA.R, -normal); + + 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) +{ + ++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); +#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); + } + + 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; + } + + ++rootIterCount; + ++b2_toiRootIters; + + 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); +} diff --git a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h new file mode 100644 index 000000000..b59fb831c --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 +#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/src/modules/physics/box2d/Source/Common/b2BlockAllocator.cpp b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp similarity index 91% rename from src/modules/physics/box2d/Source/Common/b2BlockAllocator.cpp rename to src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp index 99c6dcd93..ba06f0494 100644 --- a/src/modules/physics/box2d/Source/Common/b2BlockAllocator.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,11 +16,11 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2BlockAllocator.h" +#include #include -#include #include -#include +#include +#include int32 b2BlockAllocator::s_blockSizes[b2_blockSizes] = { @@ -164,14 +164,13 @@ void b2BlockAllocator::Free(void* p, int32 size) // Verify the memory address and size is valid. int32 blockSize = s_blockSizes[index]; bool found = false; - int32 gap = (int32)((int8*)&m_chunks->blocks - (int8*)m_chunks); 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 + gap <= (int8*)p); + (int8*)chunk->blocks + b2_chunkSize <= (int8*)p); } else { diff --git a/src/modules/physics/box2d/Source/Common/b2BlockAllocator.h b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h similarity index 91% rename from src/modules/physics/box2d/Source/Common/b2BlockAllocator.h rename to src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h index fa137211c..93eb2e311 100644 --- a/src/modules/physics/box2d/Source/Common/b2BlockAllocator.h +++ b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,7 +19,7 @@ #ifndef B2_BLOCK_ALLOCATOR_H #define B2_BLOCK_ALLOCATOR_H -#include "b2Settings.h" +#include const int32 b2_chunkSize = 4096; const int32 b2_maxBlockSize = 640; diff --git a/src/modules/physics/box2d/Box2D/Common/b2Math.cpp b/src/modules/physics/box2d/Box2D/Common/b2Math.cpp new file mode 100644 index 000000000..f15a43bd5 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Common/b2Math.cpp @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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); +const b2Mat22 b2Mat22_identity(1.0f, 0.0f, 0.0f, 1.0f); +const b2Transform b2Transform_identity(b2Vec2_zero, b2Mat22_identity); + +/// 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(col1, b2Cross(col2, col3)); + if (det != 0.0f) + { + det = 1.0f / det; + } + b2Vec3 x; + x.x = det * b2Dot(b, b2Cross(col2, col3)); + x.y = det * b2Dot(col1, b2Cross(b, col3)); + x.z = det * b2Dot(col1, b2Cross(col2, 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 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.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; +} diff --git a/src/modules/physics/box2d/Source/Common/b2Math.h b/src/modules/physics/box2d/Box2D/Common/b2Math.h similarity index 60% rename from src/modules/physics/box2d/Source/Common/b2Math.h rename to src/modules/physics/box2d/Box2D/Common/b2Math.h index 3b1ad56c2..c29f59430 100644 --- a/src/modules/physics/box2d/Source/Common/b2Math.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Math.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,49 +19,25 @@ #ifndef B2_MATH_H #define B2_MATH_H -#include "b2Settings.h" +#include + #include #include -#include - -#include - -#ifdef TARGET_FLOAT32_IS_FIXED - -inline Fixed b2Min(const Fixed& a, const Fixed& b) -{ - return a < b ? a : b; -} - -inline Fixed b2Max(const Fixed& a, const Fixed& b) -{ - return a > b ? a : b; -} - -inline Fixed b2Clamp(Fixed a, Fixed low, Fixed high) -{ - return b2Max(low, b2Min(a, high)); -} - -inline bool b2IsValid(Fixed x) -{ - return true; -} - -#define b2Sqrt(x) sqrt(x) -#define b2Atan2(y, x) atan2(y, x) - -#else +#include +#include /// This function is used to ensure that a floating point number is /// not a NaN or infinity. inline bool b2IsValid(float32 x) { -#ifdef _MSC_VER - return _finite(x) != 0; -#else - return finite(x) != 0; -#endif + if (x != x) + { + // NaN. + return false; + } + + float32 infinity = std::numeric_limits::infinity(); + return -infinity < x && x < infinity; } /// This is a approximate yet fast inverse square-root. @@ -84,15 +60,12 @@ inline float32 b2InvSqrt(float32 x) #define b2Sqrt(x) sqrtf(x) #define b2Atan2(y, x) atan2f(y, x) -#endif - inline float32 b2Abs(float32 a) { return a > 0.0f ? a : -a; } /// A 2D column vector. - struct b2Vec2 { /// Default constructor does nothing (for performance). @@ -110,6 +83,18 @@ struct b2Vec2 /// 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) { @@ -131,20 +116,7 @@ struct b2Vec2 /// Get the length of this vector (the norm). float32 Length() const { -#ifdef TARGET_FLOAT32_IS_FIXED - float est = b2Abs(x) + b2Abs(y); - if(est == 0.0f) { - return 0.0; - } else if(est < 0.1) { - return (1.0/256.0) * b2Vec2(x<<8, y<<8).Length(); - } else if(est < 180.0f) { - return b2Sqrt(x * x + y * y); - } else { - return 256.0 * (b2Vec2(x>>8, y>>8).Length()); - } -#else return b2Sqrt(x * x + y * y); -#endif } /// Get the length squared. For performance, use this instead of @@ -155,38 +127,10 @@ struct b2Vec2 } /// Convert this vector into a unit vector. Returns the length. -#ifdef TARGET_FLOAT32_IS_FIXED float32 Normalize() { float32 length = Length(); - if (length < B2_FLT_EPSILON) - { - return 0.0f; - } -#ifdef NORMALIZE_BY_INVERT_MULTIPLY - if (length < (1.0/16.0)) { - x = x << 4; - y = y << 4; - return (1.0/16.0)*Normalize(); - } else if(length > 16.0) { - x = x >> 4; - y = y >> 4; - return 16.0*Normalize(); - } - float32 invLength = 1.0f / length; - x *= invLength; - y *= invLength; -#else - x /= length; - y /= length; -#endif - return length; - } -#else - float32 Normalize() - { - float32 length = Length(); - if (length < B2_FLT_EPSILON) + if (length < b2_epsilon) { return 0.0f; } @@ -196,7 +140,6 @@ struct b2Vec2 return length; } -#endif /// Does this vector contain finite coordinates? bool IsValid() const @@ -207,6 +150,45 @@ struct b2Vec2 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 { @@ -231,6 +213,7 @@ struct b2Mat22 /// an orthonormal rotation matrix. explicit b2Mat22(float32 angle) { + // TODO_ERIN compute sin+cos together. float32 c = cosf(angle), s = sinf(angle); col1.x = c; col2.x = -s; col1.y = s; col2.y = c; @@ -273,79 +256,15 @@ struct b2Mat22 return b2Atan2(col1.y, col1.x); } -#ifdef TARGET_FLOAT32_IS_FIXED - - /// Compute the inverse of this matrix, such that inv(A) * A = identity. - b2Mat22 Invert() const - { - float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; - float32 det = a * d - b * c; - b2Mat22 B; - int n = 0; - - if(b2Abs(det) <= (B2_FLT_EPSILON<<8)) - { - n = 3; - a = a<= 16.0)? 4 : 0; - b2Assert(det != 0.0f); - det = float32(1<> n; B.col2.x = (-det * b) >> n; - B.col1.y = (-det * c) >> n; B.col2.y = ( det * a) >> n; - } - - return B; - } - - // Solve A * x = b - b2Vec2 Solve(const b2Vec2& b) const - { - float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; - float32 det = a11 * a22 - a12 * a21; - int n = 0; - b2Vec2 x; - - - if(b2Abs(det) <= (B2_FLT_EPSILON<<8)) - { - n = 3; - a11 = col1.x<= 16.0) ? 4 : 0; - b2Assert(det != 0.0f); - det = float32(1<> n; - x.y = (det * (a11 * b.y - a21 * b.x)) >> n; - } - - return x; - } - -#else - b2Mat22 Invert() const + b2Mat22 GetInverse() const { float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; b2Mat22 B; float32 det = a * d - b * c; - b2Assert(det != 0.0f); - det = float32(1.0f) / det; + if (det != 0.0f) + { + det = 1.0f / det; + } B.col1.x = det * d; B.col2.x = -det * b; B.col1.y = -det * c; B.col2.y = det * a; return B; @@ -357,27 +276,62 @@ struct b2Mat22 { float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; float32 det = a11 * a22 - a12 * a21; - b2Assert(det != 0.0f); - det = 1.0f / det; + 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; } -#endif b2Vec2 col1, col2; }; -/// A transform contains translation and rotation. It is used to represent -/// the position and orientation of rigid frames. -struct b2XForm +/// A 3-by-3 matrix. Stored in column-major order. +struct b2Mat33 { /// The default constructor does nothing (for performance). - b2XForm() {} + b2Mat33() {} + + /// Construct this matrix using columns. + b2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3) + { + col1 = c1; + col2 = c2; + col3 = c3; + } + + /// Set this matrix to all zeros. + void SetZero() + { + col1.SetZero(); + col2.SetZero(); + col3.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; + + b2Vec3 col1, col2, col3; +}; + +/// 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 (for performance). + b2Transform() {} /// Initialize using a position vector and a rotation matrix. - b2XForm(const b2Vec2& position, const b2Mat22& R) : position(position), R(R) {} + b2Transform(const b2Vec2& position, const b2Mat22& R) : position(position), R(R) {} /// Set this to the identity transform. void SetIdentity() @@ -386,6 +340,19 @@ struct b2XForm R.SetIdentity(); } + /// Set this based on the position and angle. + void Set(const b2Vec2& p, float32 angle) + { + position = p; + R.Set(angle); + } + + /// Calculate the angle that the rotation matrix represents. + float32 GetAngle() const + { + return b2Atan2(R.col1.y, R.col1.x); + } + b2Vec2 position; b2Mat22 R; }; @@ -397,25 +364,27 @@ struct b2XForm struct b2Sweep { /// Get the interpolated transform at a specific time. - /// @param t the normalized time in [0,1]. - void GetXForm(b2XForm* xf, float32 t) const; + /// @param alpha is a factor in [0,1], where 0 indicates t0. + void GetTransform(b2Transform* xf, float32 alpha) const; /// Advance the sweep forward, yielding a new initial state. /// @param t the new initial time. void Advance(float32 t); + /// Normalize the angles. + void Normalize(); + b2Vec2 localCenter; ///< local center of mass position b2Vec2 c0, c; ///< center world positions float32 a0, a; ///< world angles - float32 t0; ///< time interval = [t0,1], where t0 is in [0,1] }; extern const b2Vec2 b2Vec2_zero; extern const b2Mat22 b2Mat22_identity; -extern const b2XForm b2XForm_identity; +extern const b2Transform b2Transform_identity; -/// Peform the dot product on two vectors. +/// 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; @@ -431,54 +400,45 @@ inline float32 b2Cross(const b2Vec2& a, const b2Vec2& b) /// a vector. inline b2Vec2 b2Cross(const b2Vec2& a, float32 s) { - b2Vec2 v; v.Set(s * a.y, -s * a.x); - return v; + 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) { - b2Vec2 v; v.Set(-s * a.y, s * a.x); - return v; + 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) { - b2Vec2 u; - u.Set(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y); - return u; + return b2Vec2(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.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) { - b2Vec2 u; - u.Set(b2Dot(v, A.col1), b2Dot(v, A.col2)); - return u; + return b2Vec2(b2Dot(v, A.col1), b2Dot(v, A.col2)); } /// Add two vectors component-wise. inline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b) { - b2Vec2 v; v.Set(a.x + b.x, a.y + b.y); - return v; + return b2Vec2(a.x + b.x, a.y + b.y); } /// Subtract two vectors component-wise. inline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b) { - b2Vec2 v; v.Set(a.x - b.x, a.y - b.y); - return v; + return b2Vec2(a.x - b.x, a.y - b.y); } inline b2Vec2 operator * (float32 s, const b2Vec2& a) { - b2Vec2 v; v.Set(s * a.x, s * a.y); - return v; + return b2Vec2(s * a.x, s * a.y); } inline bool operator == (const b2Vec2& a, const b2Vec2& b) @@ -498,52 +458,81 @@ inline float32 b2DistanceSquared(const b2Vec2& a, const b2Vec2& 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) { - b2Mat22 C; - C.Set(A.col1 + B.col1, A.col2 + B.col2); - return C; + return b2Mat22(A.col1 + B.col1, A.col2 + B.col2); } // A * B inline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B) { - b2Mat22 C; - C.Set(b2Mul(A, B.col1), b2Mul(A, B.col2)); - return C; + return b2Mat22(b2Mul(A, B.col1), b2Mul(A, B.col2)); } // A^T * B inline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B) { - b2Vec2 c1; c1.Set(b2Dot(A.col1, B.col1), b2Dot(A.col2, B.col1)); - b2Vec2 c2; c2.Set(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2)); - b2Mat22 C; - C.Set(c1, c2); - return C; + b2Vec2 c1(b2Dot(A.col1, B.col1), b2Dot(A.col2, B.col1)); + b2Vec2 c2(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2)); + return b2Mat22(c1, c2); } -inline b2Vec2 b2Mul(const b2XForm& T, const b2Vec2& v) +/// Multiply a matrix times a vector. +inline b2Vec3 b2Mul(const b2Mat33& A, const b2Vec3& v) { - return T.position + b2Mul(T.R, v); + return v.x * A.col1 + v.y * A.col2 + v.z * A.col3; } -inline b2Vec2 b2MulT(const b2XForm& T, const b2Vec2& v) +inline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v) +{ + float32 x = T.position.x + T.R.col1.x * v.x + T.R.col2.x * v.y; + float32 y = T.position.y + T.R.col1.y * v.x + T.R.col2.y * v.y; + + return b2Vec2(x, y); +} + +inline b2Vec2 b2MulT(const b2Transform& T, const b2Vec2& v) { return b2MulT(T.R, v - T.position); } inline b2Vec2 b2Abs(const b2Vec2& a) { - b2Vec2 b; b.Set(b2Abs(a.x), b2Abs(a.y)); - return b; + return b2Vec2(b2Abs(a.x), b2Abs(a.y)); } inline b2Mat22 b2Abs(const b2Mat22& A) { - b2Mat22 B; - B.Set(b2Abs(A.col1), b2Abs(A.col2)); - return B; + return b2Mat22(b2Abs(A.col1), b2Abs(A.col2)); } template @@ -554,10 +543,7 @@ inline T b2Min(T a, T b) inline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b) { - b2Vec2 c; - c.x = b2Min(a.x, b.x); - c.y = b2Min(a.y, b.y); - return c; + return b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y)); } template @@ -568,10 +554,7 @@ inline T b2Max(T a, T b) inline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b) { - b2Vec2 c; - c.x = b2Max(a.x, b.x); - c.y = b2Max(a.y, b.y); - return c; + return b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y)); } template @@ -592,26 +575,6 @@ template inline void b2Swap(T& a, T& b) b = tmp; } -#define RAND_LIMIT 32767 - -// Random number in range [-1,1] -inline float32 b2Random() -{ - float32 r = (float32)(rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = 2.0f * r - 1.0f; - return r; -} - -/// Random floating point number in range [lo, hi] -inline float32 b2Random(float32 lo, float32 hi) -{ - float32 r = (float32)(rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = (hi - lo) * r + lo; - return r; -} - /// "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 @@ -633,4 +596,29 @@ inline bool b2IsPowerOfTwo(uint32 x) return result; } +inline void b2Sweep::GetTransform(b2Transform* xf, float32 alpha) const +{ + xf->position = (1.0f - alpha) * c0 + alpha * c; + float32 angle = (1.0f - alpha) * a0 + alpha * a; + xf->R.Set(angle); + + // Shift to origin + xf->position -= b2Mul(xf->R, localCenter); +} + +inline void b2Sweep::Advance(float32 t) +{ + c0 = (1.0f - t) * c0 + t * c; + a0 = (1.0f - t) * a0 + t * a; +} + +/// 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/src/modules/physics/box2d/Source/Dynamics/Contacts/b2NullContact.h b/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp similarity index 70% rename from src/modules/physics/box2d/Source/Dynamics/Contacts/b2NullContact.h rename to src/modules/physics/box2d/Box2D/Common/b2Settings.cpp index ce62d8b0b..da308149f 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2NullContact.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,18 +16,18 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef B2_NULL_CONTACT_H -#define B2_NULL_CONTACT_H +#include +#include -#include "../../Common/b2Math.h" -#include "b2Contact.h" +b2Version b2_version = {2, 1, 2}; -class b2NullContact : public b2Contact +// Memory allocators. Modify these to use your own allocator. +void* b2Alloc(int32 size) { -public: - b2NullContact() {} - void Evaluate(b2ContactListener*) {} - b2Manifold* GetManifolds() { return NULL; } -}; + return malloc(size); +} -#endif +void b2Free(void* mem) +{ + free(mem); +} diff --git a/src/modules/physics/box2d/Source/Common/b2Settings.h b/src/modules/physics/box2d/Box2D/Common/b2Settings.h similarity index 57% rename from src/modules/physics/box2d/Source/Common/b2Settings.h rename to src/modules/physics/box2d/Box2D/Common/b2Settings.h index 22866b0ef..1aa8c2661 100644 --- a/src/modules/physics/box2d/Source/Common/b2Settings.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Settings.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,23 +19,11 @@ #ifndef B2_SETTINGS_H #define B2_SETTINGS_H -#include -//#include +#include #include -#define B2_NOT_USED(x) x +#define B2_NOT_USED(x) ((void)(x)) #define b2Assert(A) assert(A) -//#define b2Assert(A) {if(!(A)) throw love::Exception("Box2D error: " #A);} - - -// need to include NDS jtypes.h instead of -// usual typedefs because NDS jtypes defines -// them slightly differently, oh well. -#ifdef TARGET_IS_NDS - -#include "jtypes.h" - -#else typedef signed char int8; typedef signed short int16; @@ -43,108 +31,93 @@ typedef signed int int32; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; - -#endif - -#ifdef TARGET_FLOAT32_IS_FIXED - -#include "Fixed.h" - -typedef Fixed float32; -#define B2_FLT_MAX FIXED_MAX -#define B2_FLT_EPSILON FIXED_EPSILON -#define B2FORCE_SCALE(x) ((x)<<7) -#define B2FORCE_INV_SCALE(x) ((x)>>7) - -#else - typedef float float32; -#define B2_FLT_MAX FLT_MAX -#define B2_FLT_EPSILON FLT_EPSILON -#define B2FORCE_SCALE(x) (x) -#define B2FORCE_INV_SCALE(x) (x) -#endif - -const float32 b2_pi = 3.14159265359f; +#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 -const int32 b2_maxManifoldPoints = 2; -const int32 b2_maxPolygonVertices = 8; -const int32 b2_maxProxies = 2048; // this must be a power of two -const int32 b2_maxPairs = 8 * b2_maxProxies; // this must be a power of two -// Dynamics +/// The maximum number of contact points between two convex shapes. +#define b2_maxManifoldPoints 2 + +/// The maximum number of vertices on a convex polygon. +#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. -const float32 b2_linearSlop = 0.005f; // 0.5 cm +#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. -const float32 b2_angularSlop = 2.0f / 180.0f * b2_pi; // 2 degrees +#define b2_angularSlop (2.0f / 180.0f * b2_pi) -/// Continuous collision detection (CCD) works with core, shrunken shapes. This is the -/// amount by which shapes are automatically shrunk to work with CCD. This must be -/// larger than b2_linearSlop. -const float32 b2_toiSlop = 8.0f * b2_linearSlop; +/// 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 contacts to be handled to solve a TOI island. -const int32 b2_maxTOIContactsPerIsland = 32; + +// 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. -const float32 b2_velocityThreshold = 1.0f; // 1 m/s +#define b2_velocityThreshold 1.0f /// The maximum linear position correction used when solving constraints. This helps to /// prevent overshoot. -const float32 b2_maxLinearCorrection = 0.2f; // 20 cm +#define b2_maxLinearCorrection 0.2f /// The maximum angular position correction used when solving constraints. This helps to /// prevent overshoot. -const float32 b2_maxAngularCorrection = 8.0f / 180.0f * b2_pi; // 8 degrees +#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. -#ifdef TARGET_FLOAT32_IS_FIXED -const float32 b2_maxLinearVelocity = 100.0f; -#else -const float32 b2_maxLinearVelocity = 200.0f; -const float32 b2_maxLinearVelocitySquared = b2_maxLinearVelocity * b2_maxLinearVelocity; -#endif +#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. -const float32 b2_maxAngularVelocity = 250.0f; -#ifndef TARGET_FLOAT32_IS_FIXED -const float32 b2_maxAngularVelocitySquared = b2_maxAngularVelocity * b2_maxAngularVelocity; -#endif +#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. -const float32 b2_contactBaumgarte = 0.2f; +#define b2_contactBaumgarte 0.2f // Sleep /// The time that a body must be still before it will go to sleep. -const float32 b2_timeToSleep = 0.5f; // half a second +#define b2_timeToSleep 0.5f /// A body cannot sleep if its linear velocity is above this tolerance. -const float32 b2_linearSleepTolerance = 0.01f; // 1 cm/s +#define b2_linearSleepTolerance 0.01f /// A body cannot sleep if its angular velocity is above this tolerance. -const float32 b2_angularSleepTolerance = 2.0f / 180.0f; // 2 degrees/s +#define b2_angularSleepTolerance (2.0f / 180.0f * b2_pi) // Memory Allocation -/// The current number of bytes allocated through b2Alloc. -extern int32 b2_byteCount; - /// Implement this function to use your own memory allocator. void* b2Alloc(int32 size); diff --git a/src/modules/physics/box2d/Source/Common/b2StackAllocator.cpp b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp similarity index 89% rename from src/modules/physics/box2d/Source/Common/b2StackAllocator.cpp rename to src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp index c58c97af0..cb2c42e01 100644 --- a/src/modules/physics/box2d/Source/Common/b2StackAllocator.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,8 +16,8 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2StackAllocator.h" -#include "b2Math.h" +#include +#include b2StackAllocator::b2StackAllocator() { diff --git a/src/modules/physics/box2d/Source/Common/b2StackAllocator.h b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h similarity index 90% rename from src/modules/physics/box2d/Source/Common/b2StackAllocator.h rename to src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h index e8faa840b..315cc02ff 100644 --- a/src/modules/physics/box2d/Source/Common/b2StackAllocator.h +++ b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,7 +19,7 @@ #ifndef B2_STACK_ALLOCATOR_H #define B2_STACK_ALLOCATOR_H -#include "b2Settings.h" +#include const int32 b2_stackSize = 100 * 1024; // 100k const int32 b2_maxStackEntries = 32; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp new file mode 100644 index 000000000..6df009125 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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, b2Fixture* fixtureB, 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, fixtureB) +{ + 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/src/modules/physics/box2d/Source/Dynamics/Contacts/b2CircleContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h similarity index 66% rename from src/modules/physics/box2d/Source/Dynamics/Contacts/b2CircleContact.h rename to src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h index ba2afbdcf..afc277aa0 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2CircleContact.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,31 +16,23 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef CIRCLE_CONTACT_H -#define CIRCLE_CONTACT_H +#ifndef B2_CIRCLE_CONTACT_H +#define B2_CIRCLE_CONTACT_H -#include "../../Common/b2Math.h" -#include "../../Collision/b2Collision.h" -#include "b2Contact.h" +#include class b2BlockAllocator; class b2CircleContact : public b2Contact { public: - static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); + static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - b2CircleContact(b2Shape* shape1, b2Shape* shape2); + b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); ~b2CircleContact() {} - void Evaluate(b2ContactListener* listener); - b2Manifold* GetManifolds() - { - return &m_manifold; - } - - b2Manifold m_manifold; + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); }; #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp new file mode 100644 index 000000000..e7ad1ca5b --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp @@ -0,0 +1,226 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +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); +} + +void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn, + b2Shape::Type type1, b2Shape::Type type2) +{ + b2Assert(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); + b2Assert(b2Shape::e_unknown < 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, b2Fixture* fixtureB, b2BlockAllocator* allocator) +{ + if (s_initialized == false) + { + InitializeRegisters(); + s_initialized = true; + } + + b2Shape::Type type1 = fixtureA->GetType(); + b2Shape::Type type2 = fixtureB->GetType(); + + b2Assert(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); + b2Assert(b2Shape::e_unknown < type2 && type2 < b2Shape::e_typeCount); + + b2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn; + if (createFcn) + { + if (s_registers[type1][type2].primary) + { + return createFcn(fixtureA, fixtureB, allocator); + } + else + { + return createFcn(fixtureB, fixtureA, allocator); + } + } + else + { + return NULL; + } +} + +void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + b2Assert(s_initialized == true); + + if (contact->m_manifold.pointCount > 0) + { + contact->GetFixtureA()->GetBody()->SetAwake(true); + contact->GetFixtureB()->GetBody()->SetAwake(true); + } + + b2Shape::Type typeA = contact->GetFixtureA()->GetType(); + b2Shape::Type typeB = contact->GetFixtureB()->GetType(); + + b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); + b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); + + b2ContactDestroyFcn* destroyFcn = s_registers[typeA][typeB].destroyFcn; + destroyFcn(contact, allocator); +} + +b2Contact::b2Contact(b2Fixture* fA, b2Fixture* fB) +{ + m_flags = e_enabledFlag; + + m_fixtureA = fA; + m_fixtureB = fB; + + 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; +} + +// 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, shapeB, 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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h new file mode 100644 index 000000000..a6add3dc4 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 +#include + +class b2Body; +class b2Contact; +class b2Fixture; +class b2World; +class b2BlockAllocator; +class b2StackAllocator; +class b2ContactListener; + +typedef b2Contact* b2ContactCreateFcn(b2Fixture* fixtureA, b2Fixture* fixtureB, 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 the first fixture in this contact. + b2Fixture* GetFixtureA(); + const b2Fixture* GetFixtureA() const; + + /// Get the second fixture in this contact. + b2Fixture* GetFixtureB(); + const b2Fixture* GetFixtureB() 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, + + }; + + /// 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, b2Fixture* fixtureB, 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, b2Fixture* fixtureB); + 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; + + b2Manifold m_manifold; + + int32 m_toiCount; +// float32 m_toi; +}; + +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 const b2Fixture* b2Contact::GetFixtureB() const +{ + return m_fixtureB; +} + +inline void b2Contact::FlagForFiltering() +{ + m_flags |= e_filterFlag; +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp new file mode 100644 index 000000000..f65fb60ee --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp @@ -0,0 +1,623 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +b2ContactSolver::b2ContactSolver(b2Contact** contacts, int32 contactCount, + b2StackAllocator* allocator, float32 impulseRatio) +{ + m_allocator = allocator; + + m_constraintCount = contactCount; + m_constraints = (b2ContactConstraint*)m_allocator->Allocate(m_constraintCount * sizeof(b2ContactConstraint)); + + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2Contact* contact = 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(); + + float32 friction = b2MixFriction(fixtureA->GetFriction(), fixtureB->GetFriction()); + float32 restitution = b2MixRestitution(fixtureA->GetRestitution(), fixtureB->GetRestitution()); + + b2Vec2 vA = bodyA->m_linearVelocity; + b2Vec2 vB = bodyB->m_linearVelocity; + float32 wA = bodyA->m_angularVelocity; + float32 wB = bodyB->m_angularVelocity; + + b2Assert(manifold->pointCount > 0); + + b2WorldManifold worldManifold; + worldManifold.Initialize(manifold, bodyA->m_xf, radiusA, bodyB->m_xf, radiusB); + + b2ContactConstraint* cc = m_constraints + i; + cc->bodyA = bodyA; + cc->bodyB = bodyB; + cc->manifold = manifold; + cc->normal = worldManifold.normal; + cc->pointCount = manifold->pointCount; + cc->friction = friction; + + cc->localNormal = manifold->localNormal; + cc->localPoint = manifold->localPoint; + cc->radius = radiusA + radiusB; + cc->type = manifold->type; + + for (int32 j = 0; j < cc->pointCount; ++j) + { + b2ManifoldPoint* cp = manifold->points + j; + b2ContactConstraintPoint* ccp = cc->points + j; + + ccp->normalImpulse = impulseRatio * cp->normalImpulse; + ccp->tangentImpulse = impulseRatio * cp->tangentImpulse; + + ccp->localPoint = cp->localPoint; + + ccp->rA = worldManifold.points[j] - bodyA->m_sweep.c; + ccp->rB = worldManifold.points[j] - bodyB->m_sweep.c; + + float32 rnA = b2Cross(ccp->rA, cc->normal); + float32 rnB = b2Cross(ccp->rB, cc->normal); + rnA *= rnA; + rnB *= rnB; + + float32 kNormal = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rnA + bodyB->m_invI * rnB; + + b2Assert(kNormal > b2_epsilon); + ccp->normalMass = 1.0f / kNormal; + + b2Vec2 tangent = b2Cross(cc->normal, 1.0f); + + float32 rtA = b2Cross(ccp->rA, tangent); + float32 rtB = b2Cross(ccp->rB, tangent); + rtA *= rtA; + rtB *= rtB; + + float32 kTangent = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rtA + bodyB->m_invI * rtB; + + b2Assert(kTangent > b2_epsilon); + ccp->tangentMass = 1.0f / kTangent; + + // Setup a velocity bias for restitution. + ccp->velocityBias = 0.0f; + float32 vRel = b2Dot(cc->normal, vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA)); + if (vRel < -b2_velocityThreshold) + { + ccp->velocityBias = -restitution * vRel; + } + } + + // If we have two points, then prepare the block solver. + if (cc->pointCount == 2) + { + b2ContactConstraintPoint* ccp1 = cc->points + 0; + b2ContactConstraintPoint* ccp2 = cc->points + 1; + + float32 invMassA = bodyA->m_invMass; + float32 invIA = bodyA->m_invI; + float32 invMassB = bodyB->m_invMass; + float32 invIB = bodyB->m_invI; + + float32 rn1A = b2Cross(ccp1->rA, cc->normal); + float32 rn1B = b2Cross(ccp1->rB, cc->normal); + float32 rn2A = b2Cross(ccp2->rA, cc->normal); + float32 rn2B = b2Cross(ccp2->rB, cc->normal); + + float32 k11 = invMassA + invMassB + invIA * rn1A * rn1A + invIB * rn1B * rn1B; + float32 k22 = invMassA + invMassB + invIA * rn2A * rn2A + invIB * rn2B * rn2B; + float32 k12 = invMassA + invMassB + invIA * rn1A * rn2A + invIB * rn1B * rn2B; + + // Ensure a reasonable condition number. + const float32 k_maxConditionNumber = 100.0f; + if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) + { + // K is safe to invert. + cc->K.col1.Set(k11, k12); + cc->K.col2.Set(k12, k22); + cc->normalMass = cc->K.GetInverse(); + } + else + { + // The constraints are redundant, just use one. + // TODO_ERIN use deepest? + cc->pointCount = 1; + } + } + } +} + +b2ContactSolver::~b2ContactSolver() +{ + m_allocator->Free(m_constraints); +} + +void b2ContactSolver::WarmStart() +{ + // Warm start. + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + float32 invMassA = bodyA->m_invMass; + float32 invIA = bodyA->m_invI; + float32 invMassB = bodyB->m_invMass; + float32 invIB = bodyB->m_invI; + b2Vec2 normal = c->normal; + b2Vec2 tangent = b2Cross(normal, 1.0f); + + for (int32 j = 0; j < c->pointCount; ++j) + { + b2ContactConstraintPoint* ccp = c->points + j; + b2Vec2 P = ccp->normalImpulse * normal + ccp->tangentImpulse * tangent; + bodyA->m_angularVelocity -= invIA * b2Cross(ccp->rA, P); + bodyA->m_linearVelocity -= invMassA * P; + bodyB->m_angularVelocity += invIB * b2Cross(ccp->rB, P); + bodyB->m_linearVelocity += invMassB * P; + } + } +} + +void b2ContactSolver::SolveVelocityConstraints() +{ + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + float32 wA = bodyA->m_angularVelocity; + float32 wB = bodyB->m_angularVelocity; + b2Vec2 vA = bodyA->m_linearVelocity; + b2Vec2 vB = bodyB->m_linearVelocity; + float32 invMassA = bodyA->m_invMass; + float32 invIA = bodyA->m_invI; + float32 invMassB = bodyB->m_invMass; + float32 invIB = bodyB->m_invI; + b2Vec2 normal = c->normal; + b2Vec2 tangent = b2Cross(normal, 1.0f); + float32 friction = c->friction; + + b2Assert(c->pointCount == 1 || c->pointCount == 2); + + // Solve tangent constraints + for (int32 j = 0; j < c->pointCount; ++j) + { + b2ContactConstraintPoint* ccp = c->points + j; + + // Relative velocity at contact + b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); + + // Compute tangent force + float32 vt = b2Dot(dv, tangent); + float32 lambda = ccp->tangentMass * (-vt); + + // b2Clamp the accumulated force + float32 maxFriction = friction * ccp->normalImpulse; + float32 newImpulse = b2Clamp(ccp->tangentImpulse + lambda, -maxFriction, maxFriction); + lambda = newImpulse - ccp->tangentImpulse; + + // Apply contact impulse + b2Vec2 P = lambda * tangent; + + vA -= invMassA * P; + wA -= invIA * b2Cross(ccp->rA, P); + + vB += invMassB * P; + wB += invIB * b2Cross(ccp->rB, P); + + ccp->tangentImpulse = newImpulse; + } + + // Solve normal constraints + if (c->pointCount == 1) + { + b2ContactConstraintPoint* ccp = c->points + 0; + + // Relative velocity at contact + b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); + + // Compute normal impulse + float32 vn = b2Dot(dv, normal); + float32 lambda = -ccp->normalMass * (vn - ccp->velocityBias); + + // b2Clamp the accumulated impulse + float32 newImpulse = b2Max(ccp->normalImpulse + lambda, 0.0f); + lambda = newImpulse - ccp->normalImpulse; + + // Apply contact impulse + b2Vec2 P = lambda * normal; + vA -= invMassA * P; + wA -= invIA * b2Cross(ccp->rA, P); + + vB += invMassB * P; + wB += invIB * b2Cross(ccp->rB, P); + ccp->normalImpulse = newImpulse; + } + 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 = vn_0 - 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 = x' - a + // + // Plug into above equation: + // + // vn = A * x + b + // = A * (x' - a) + b + // = A * x' + b - A * a + // = A * x' + b' + // b' = b - A * a; + + b2ContactConstraintPoint* cp1 = c->points + 0; + b2ContactConstraintPoint* cp2 = c->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; + b -= b2Mul(c->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(c->normalMass, b); + + if (x.x >= 0.0f && x.y >= 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 -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (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 = c->K.col1.y * x.x + b.y; + + if (x.x >= 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 -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (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 = c->K.col2.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 -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (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 -= invMassA * (P1 + P2); + wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += invMassB * (P1 + P2); + wB += invIB * (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; + } + } + + bodyA->m_linearVelocity = vA; + bodyA->m_angularVelocity = wA; + bodyB->m_linearVelocity = vB; + bodyB->m_angularVelocity = wB; + } +} + +void b2ContactSolver::StoreImpulses() +{ + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + b2Manifold* m = c->manifold; + + for (int32 j = 0; j < c->pointCount; ++j) + { + m->points[j].normalImpulse = c->points[j].normalImpulse; + m->points[j].tangentImpulse = c->points[j].tangentImpulse; + } + } +} + +struct b2PositionSolverManifold +{ + void Initialize(b2ContactConstraint* cc, int32 index) + { + b2Assert(cc->pointCount > 0); + + switch (cc->type) + { + case b2Manifold::e_circles: + { + b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); + b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->points[0].localPoint); + if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) + { + normal = pointB - pointA; + normal.Normalize(); + } + else + { + normal.Set(1.0f, 0.0f); + } + + point = 0.5f * (pointA + pointB); + separation = b2Dot(pointB - pointA, normal) - cc->radius; + } + break; + + case b2Manifold::e_faceA: + { + normal = cc->bodyA->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->points[index].localPoint); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + } + break; + + case b2Manifold::e_faceB: + { + normal = cc->bodyB->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->points[index].localPoint); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + + // Ensure normal points from A to B + normal = -normal; + } + break; + } + } + + b2Vec2 normal; + b2Vec2 point; + float32 separation; +}; + +// Sequential solver. +bool b2ContactSolver::SolvePositionConstraints(float32 baumgarte) +{ + float32 minSeparation = 0.0f; + + for (int32 i = 0; i < m_constraintCount; ++i) + { + b2ContactConstraint* c = m_constraints + i; + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + + float32 invMassA = bodyA->m_mass * bodyA->m_invMass; + float32 invIA = bodyA->m_mass * bodyA->m_invI; + float32 invMassB = bodyB->m_mass * bodyB->m_invMass; + float32 invIB = bodyB->m_mass * bodyB->m_invI; + + // Solve normal constraints + for (int32 j = 0; j < c->pointCount; ++j) + { + b2PositionSolverManifold psm; + psm.Initialize(c, j); + b2Vec2 normal = psm.normal; + + b2Vec2 point = psm.point; + float32 separation = psm.separation; + + b2Vec2 rA = point - bodyA->m_sweep.c; + b2Vec2 rB = point - bodyB->m_sweep.c; + + // Track max constraint error. + minSeparation = b2Min(minSeparation, separation); + + // Prevent large corrections and allow slop. + float32 C = b2Clamp(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); + + // Compute the effective mass. + float32 rnA = b2Cross(rA, normal); + float32 rnB = b2Cross(rB, normal); + float32 K = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; + + // Compute normal impulse + float32 impulse = K > 0.0f ? - C / K : 0.0f; + + b2Vec2 P = impulse * normal; + + bodyA->m_sweep.c -= invMassA * P; + bodyA->m_sweep.a -= invIA * b2Cross(rA, P); + bodyA->SynchronizeTransform(); + + bodyB->m_sweep.c += invMassB * P; + bodyB->m_sweep.a += invIB * b2Cross(rB, P); + bodyB->SynchronizeTransform(); + } + } + + // 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/src/modules/physics/box2d/Source/Dynamics/Contacts/b2ContactSolver.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h similarity index 67% rename from src/modules/physics/box2d/Source/Dynamics/Contacts/b2ContactSolver.h rename to src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h index 04118c79e..b8555bbb4 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2ContactSolver.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,59 +16,60 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef CONTACT_SOLVER_H -#define CONTACT_SOLVER_H +#ifndef B2_CONTACT_SOLVER_H +#define B2_CONTACT_SOLVER_H -#include "../../Common/b2Math.h" -#include "../../Collision/b2Collision.h" -#include "../b2World.h" +#include +#include +#include class b2Contact; class b2Body; -class b2Island; class b2StackAllocator; struct b2ContactConstraintPoint { - b2Vec2 localAnchor1; - b2Vec2 localAnchor2; - b2Vec2 r1; - b2Vec2 r2; + b2Vec2 localPoint; + b2Vec2 rA; + b2Vec2 rB; float32 normalImpulse; float32 tangentImpulse; - float32 positionImpulse; float32 normalMass; float32 tangentMass; - float32 equalizedMass; - float32 separation; float32 velocityBias; }; struct b2ContactConstraint { b2ContactConstraintPoint points[b2_maxManifoldPoints]; + b2Vec2 localNormal; + b2Vec2 localPoint; b2Vec2 normal; - b2Manifold* manifold; - b2Body* body1; - b2Body* body2; + b2Mat22 normalMass; + b2Mat22 K; + b2Body* bodyA; + b2Body* bodyB; + b2Manifold::Type type; + float32 radius; float32 friction; - float32 restitution; int32 pointCount; + b2Manifold* manifold; }; class b2ContactSolver { public: - b2ContactSolver(const b2TimeStep& step, b2Contact** contacts, int32 contactCount, b2StackAllocator* allocator); + b2ContactSolver(b2Contact** contacts, int32 contactCount, + b2StackAllocator* allocator, float32 impulseRatio); + ~b2ContactSolver(); - void InitVelocityConstraints(const b2TimeStep& step); + void WarmStart(); void SolveVelocityConstraints(); - void FinalizeVelocityConstraints(); + void StoreImpulses(); bool SolvePositionConstraints(float32 baumgarte); - b2TimeStep m_step; b2StackAllocator* m_allocator; b2ContactConstraint* m_constraints; int m_constraintCount; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp new file mode 100644 index 000000000..837722d92 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, 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, fixtureB) +{ + 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/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyAndCircleContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h similarity index 63% rename from src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyAndCircleContact.h rename to src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h index 47b3cb87c..684b2ae04 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyAndCircleContact.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,29 +16,23 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef POLY_AND_CIRCLE_CONTACT_H -#define POLY_AND_CIRCLE_CONTACT_H +#ifndef B2_POLYGON_AND_CIRCLE_CONTACT_H +#define B2_POLYGON_AND_CIRCLE_CONTACT_H -#include "b2Contact.h" +#include class b2BlockAllocator; -class b2PolyAndCircleContact : public b2Contact +class b2PolygonAndCircleContact : public b2Contact { public: - static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); + static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - b2PolyAndCircleContact(b2Shape* shape1, b2Shape* shape2); - ~b2PolyAndCircleContact() {} + b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2PolygonAndCircleContact() {} - void Evaluate(b2ContactListener* listener); - b2Manifold* GetManifolds() - { - return &m_manifold; - } - - b2Manifold m_manifold; + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); }; #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp new file mode 100644 index 000000000..eab2af579 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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, b2Fixture* fixtureB, 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, fixtureB) +{ + 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/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h similarity index 69% rename from src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyContact.h rename to src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h index b8a3e73c0..af544c2e7 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyContact.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,29 +16,23 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef POLYCONTACT_H -#define POLYCONTACT_H +#ifndef B2_POLYGON_CONTACT_H +#define B2_POLYGON_CONTACT_H -#include "b2Contact.h" +#include class b2BlockAllocator; class b2PolygonContact : public b2Contact { public: - static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); + static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - b2PolygonContact(b2Shape* shape1, b2Shape* shape2); + b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB); ~b2PolygonContact() {} - void Evaluate(b2ContactListener* listener); - b2Manifold* GetManifolds() - { - return &m_manifold; - } - - b2Manifold m_manifold; + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); }; #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp new file mode 100644 index 000000000..567cd7125 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp @@ -0,0 +1,231 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +struct b2TOIConstraint +{ + b2Vec2 localPoints[b2_maxManifoldPoints]; + b2Vec2 localNormal; + b2Vec2 localPoint; + b2Manifold::Type type; + float32 radius; + int32 pointCount; + b2Body* bodyA; + b2Body* bodyB; +}; + +b2TOISolver::b2TOISolver(b2StackAllocator* allocator) +{ + m_allocator = allocator; + m_constraints = NULL; + m_count = NULL; + m_toiBody = NULL; +} + +b2TOISolver::~b2TOISolver() +{ + Clear(); +} + +void b2TOISolver::Clear() +{ + if (m_allocator && m_constraints) + { + m_allocator->Free(m_constraints); + m_constraints = NULL; + } +} + +void b2TOISolver::Initialize(b2Contact** contacts, int32 count, b2Body* toiBody) +{ + Clear(); + + m_count = count; + m_toiBody = toiBody; + + m_constraints = (b2TOIConstraint*) m_allocator->Allocate(m_count * sizeof(b2TOIConstraint)); + + for (int32 i = 0; i < m_count; ++i) + { + b2Contact* contact = contacts[i]; + + b2Fixture* fixtureA = contact->GetFixtureA(); + b2Fixture* fixtureB = contact->GetFixtureB(); + 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(); + + b2Assert(manifold->pointCount > 0); + + b2TOIConstraint* constraint = m_constraints + i; + constraint->bodyA = bodyA; + constraint->bodyB = bodyB; + constraint->localNormal = manifold->localNormal; + constraint->localPoint = manifold->localPoint; + constraint->type = manifold->type; + constraint->pointCount = manifold->pointCount; + constraint->radius = radiusA + radiusB; + + for (int32 j = 0; j < constraint->pointCount; ++j) + { + b2ManifoldPoint* cp = manifold->points + j; + constraint->localPoints[j] = cp->localPoint; + } + } +} + +struct b2TOISolverManifold +{ + void Initialize(b2TOIConstraint* cc, int32 index) + { + b2Assert(cc->pointCount > 0); + + switch (cc->type) + { + case b2Manifold::e_circles: + { + b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); + b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->localPoints[0]); + if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) + { + normal = pointB - pointA; + normal.Normalize(); + } + else + { + normal.Set(1.0f, 0.0f); + } + + point = 0.5f * (pointA + pointB); + separation = b2Dot(pointB - pointA, normal) - cc->radius; + } + break; + + case b2Manifold::e_faceA: + { + normal = cc->bodyA->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->localPoints[index]); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + } + break; + + case b2Manifold::e_faceB: + { + normal = cc->bodyB->GetWorldVector(cc->localNormal); + b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); + + b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->localPoints[index]); + separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + point = clipPoint; + + // Ensure normal points from A to B + normal = -normal; + } + break; + } + } + + b2Vec2 normal; + b2Vec2 point; + float32 separation; +}; + +// Push out the toi body to provide clearance for further simulation. +bool b2TOISolver::Solve(float32 baumgarte) +{ + float32 minSeparation = 0.0f; + + for (int32 i = 0; i < m_count; ++i) + { + b2TOIConstraint* c = m_constraints + i; + b2Body* bodyA = c->bodyA; + b2Body* bodyB = c->bodyB; + + float32 massA = bodyA->m_mass; + float32 massB = bodyB->m_mass; + + // Only the TOI body should move. + if (bodyA == m_toiBody) + { + massB = 0.0f; + } + else + { + massA = 0.0f; + } + + float32 invMassA = massA * bodyA->m_invMass; + float32 invIA = massA * bodyA->m_invI; + float32 invMassB = massB * bodyB->m_invMass; + float32 invIB = massB * bodyB->m_invI; + + // Solve normal constraints + for (int32 j = 0; j < c->pointCount; ++j) + { + b2TOISolverManifold psm; + psm.Initialize(c, j); + b2Vec2 normal = psm.normal; + + b2Vec2 point = psm.point; + float32 separation = psm.separation; + + b2Vec2 rA = point - bodyA->m_sweep.c; + b2Vec2 rB = point - bodyB->m_sweep.c; + + // Track max constraint error. + minSeparation = b2Min(minSeparation, separation); + + // Prevent large corrections and allow slop. + float32 C = b2Clamp(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); + + // Compute the effective mass. + float32 rnA = b2Cross(rA, normal); + float32 rnB = b2Cross(rB, normal); + float32 K = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; + + // Compute normal impulse + float32 impulse = K > 0.0f ? - C / K : 0.0f; + + b2Vec2 P = impulse * normal; + + bodyA->m_sweep.c -= invMassA * P; + bodyA->m_sweep.a -= invIA * b2Cross(rA, P); + bodyA->SynchronizeTransform(); + + bodyB->m_sweep.c += invMassB * P; + bodyB->m_sweep.a += invIB * b2Cross(rB, P); + bodyB->SynchronizeTransform(); + } + } + + // 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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.h new file mode 100644 index 000000000..c092e2a81 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.h @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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_TOI_SOLVER_H +#define B2_TOI_SOLVER_H + +#include + +class b2Contact; +class b2Body; +struct b2TOIConstraint; +class b2StackAllocator; + +/// This is a pure position solver for a single movable body in contact with +/// multiple non-moving bodies. +class b2TOISolver +{ +public: + b2TOISolver(b2StackAllocator* allocator); + ~b2TOISolver(); + + void Initialize(b2Contact** contacts, int32 contactCount, b2Body* toiBody); + void Clear(); + + // Perform one solver iteration. Returns true if converged. + bool Solve(float32 baumgarte); + +private: + + b2TOIConstraint* m_constraints; + int32 m_count; + b2Body* m_toiBody; + b2StackAllocator* m_allocator; +}; + +#endif diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2DistanceJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp similarity index 67% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2DistanceJoint.cpp rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp index a52e2f971..3469bd9e1 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2DistanceJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp @@ -16,9 +16,9 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2DistanceJoint.h" -#include "../b2Body.h" -#include "../b2World.h" +#include +#include +#include // 1-D constrained system // m (v2 - v1) = lambda @@ -38,10 +38,10 @@ void b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor1, const b2Vec2& anchor2) { - body1 = b1; - body2 = b2; - localAnchor1 = body1->GetLocalPoint(anchor1); - localAnchor2 = body2->GetLocalPoint(anchor2); + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor1); + localAnchorB = bodyB->GetLocalPoint(anchor2); b2Vec2 d = anchor2 - anchor1; length = d.Length(); } @@ -50,27 +50,24 @@ void b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2, b2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def) : b2Joint(def) { - m_localAnchor1 = def->localAnchor1; - m_localAnchor2 = def->localAnchor2; + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = 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; - m_inv_dt = 0.0f; } void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) { - m_inv_dt = step.inv_dt; - - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; // Compute the effective mass matrix. - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); m_u = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; // Handle singularity. @@ -87,8 +84,8 @@ void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) float32 cr1u = b2Cross(r1, m_u); float32 cr2u = b2Cross(r2, m_u); float32 invMass = b1->m_invMass + b1->m_invI * cr1u * cr1u + b2->m_invMass + b2->m_invI * cr2u * cr2u; - b2Assert(invMass > B2_FLT_EPSILON); - m_mass = 1.0f / invMass; + + m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f; if (m_frequencyHz > 0.0f) { @@ -104,15 +101,19 @@ void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) float32 k = m_mass * omega * omega; // magic formulas - m_gamma = 1.0f / (step.dt * (d + step.dt * k)); + m_gamma = step.dt * (d + step.dt * k); + m_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f; m_bias = C * step.dt * k * m_gamma; - m_mass = 1.0f / (invMass + m_gamma); + m_mass = invMass + m_gamma; + m_mass = m_mass != 0.0f ? 1.0f / m_mass : 0.0f; } if (step.warmStarting) { + // Scale the impulse to support a variable time step. m_impulse *= step.dtRatio; + b2Vec2 P = m_impulse * m_u; b1->m_linearVelocity -= b1->m_invMass * P; b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); @@ -129,11 +130,11 @@ void b2DistanceJoint::SolveVelocityConstraints(const b2TimeStep& step) { B2_NOT_USED(step); - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); // Cdot = dot(u, v + cross(w, r)) b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); @@ -150,18 +151,21 @@ void b2DistanceJoint::SolveVelocityConstraints(const b2TimeStep& step) b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); } -bool b2DistanceJoint::SolvePositionConstraints() +bool b2DistanceJoint::SolvePositionConstraints(float32 baumgarte) { + B2_NOT_USED(baumgarte); + if (m_frequencyHz > 0.0f) { + // There is no position correction for soft distance constraints. return true; } - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; @@ -184,23 +188,24 @@ bool b2DistanceJoint::SolvePositionConstraints() return b2Abs(C) < b2_linearSlop; } -b2Vec2 b2DistanceJoint::GetAnchor1() const +b2Vec2 b2DistanceJoint::GetAnchorA() const { - return m_body1->GetWorldPoint(m_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchor1); } -b2Vec2 b2DistanceJoint::GetAnchor2() const +b2Vec2 b2DistanceJoint::GetAnchorB() const { - return m_body2->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchor2); } -b2Vec2 b2DistanceJoint::GetReactionForce() const +b2Vec2 b2DistanceJoint::GetReactionForce(float32 inv_dt) const { - b2Vec2 F = (m_inv_dt * m_impulse) * m_u; + b2Vec2 F = (inv_dt * m_impulse) * m_u; return F; } -float32 b2DistanceJoint::GetReactionTorque() const +float32 b2DistanceJoint::GetReactionTorque(float32 inv_dt) const { + B2_NOT_USED(inv_dt); return 0.0f; } diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2DistanceJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h similarity index 59% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2DistanceJoint.h rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h index b97aad8b7..448faa668 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2DistanceJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h @@ -19,7 +19,7 @@ #ifndef B2_DISTANCE_JOINT_H #define B2_DISTANCE_JOINT_H -#include "b2Joint.h" +#include /// Distance joint definition. This requires defining an /// anchor point on both bodies and the non-zero length of the @@ -32,8 +32,8 @@ struct b2DistanceJointDef : public b2JointDef b2DistanceJointDef() { type = e_distanceJoint; - localAnchor1.Set(0.0f, 0.0f); - localAnchor2.Set(0.0f, 0.0f); + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); length = 1.0f; frequencyHz = 0.0f; dampingRatio = 0.0f; @@ -41,19 +41,19 @@ struct b2DistanceJointDef : public b2JointDef /// Initialize the bodies, anchors, and length using the world /// anchors. - void Initialize(b2Body* body1, b2Body* body2, - const b2Vec2& anchor1, const b2Vec2& anchor2); + void Initialize(b2Body* bodyA, b2Body* bodyB, + const b2Vec2& anchorA, const b2Vec2& anchorB); /// The local anchor point relative to body1's origin. - b2Vec2 localAnchor1; + b2Vec2 localAnchorA; /// The local anchor point relative to body2's origin. - b2Vec2 localAnchor2; + b2Vec2 localAnchorB; - /// The equilibrium length between the anchor points. + /// The natural length between the anchor points. float32 length; - /// The response speed. + /// The mass-spring-damper frequency in Hertz. float32 frequencyHz; /// The damping ratio. 0 = no damping, 1 = critical damping. @@ -67,19 +67,33 @@ class b2DistanceJoint : public b2Joint { public: - b2Vec2 GetAnchor1() const; - b2Vec2 GetAnchor2() const; + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; - b2Vec2 GetReactionForce() const; - float32 GetReactionTorque() const; + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; - //--------------- Internals Below ------------------- + /// 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; + +protected: + + friend class b2Joint; b2DistanceJoint(const b2DistanceJointDef* data); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(); + bool SolvePositionConstraints(float32 baumgarte); b2Vec2 m_localAnchor1; b2Vec2 m_localAnchor2; @@ -89,8 +103,38 @@ public: float32 m_gamma; float32 m_bias; float32 m_impulse; - float32 m_mass; // effective mass for the constraint. + float32 m_mass; float32 m_length; }; +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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp new file mode 100644 index 000000000..9097deec3 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp @@ -0,0 +1,229 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 b2TimeStep& step) +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + // Compute the effective mass matrix. + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // 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 = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Mat22 K1; + K1.col1.x = mA + mB; K1.col2.x = 0.0f; + K1.col1.y = 0.0f; K1.col2.y = mA + mB; + + b2Mat22 K2; + K2.col1.x = iA * rA.y * rA.y; K2.col2.x = -iA * rA.x * rA.y; + K2.col1.y = -iA * rA.x * rA.y; K2.col2.y = iA * rA.x * rA.x; + + b2Mat22 K3; + K3.col1.x = iB * rB.y * rB.y; K3.col2.x = -iB * rB.x * rB.y; + K3.col1.y = -iB * rB.x * rB.y; K3.col2.y = iB * rB.x * rB.x; + + b2Mat22 K = K1 + K2 + K3; + m_linearMass = K.GetInverse(); + + m_angularMass = iA + iB; + if (m_angularMass > 0.0f) + { + m_angularMass = 1.0f / m_angularMass; + } + + if (step.warmStarting) + { + // Scale impulses to support a variable time step. + m_linearImpulse *= step.dtRatio; + m_angularImpulse *= step.dtRatio; + + b2Vec2 P(m_linearImpulse.x, m_linearImpulse.y); + + bA->m_linearVelocity -= mA * P; + bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_angularImpulse); + + bB->m_linearVelocity += mB * P; + bB->m_angularVelocity += iB * (b2Cross(rB, P) + m_angularImpulse); + } + else + { + m_linearImpulse.SetZero(); + m_angularImpulse = 0.0f; + } +} + +void b2FrictionJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + B2_NOT_USED(step); + + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + b2Vec2 vA = bA->m_linearVelocity; + float32 wA = bA->m_angularVelocity; + b2Vec2 vB = bB->m_linearVelocity; + float32 wB = bB->m_angularVelocity; + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // Solve angular friction + { + float32 Cdot = wB - wA; + float32 impulse = -m_angularMass * Cdot; + + float32 oldImpulse = m_angularImpulse; + float32 maxImpulse = step.dt * 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, rB) - vA - b2Cross(wA, rA); + + b2Vec2 impulse = -b2Mul(m_linearMass, Cdot); + b2Vec2 oldImpulse = m_linearImpulse; + m_linearImpulse += impulse; + + float32 maxImpulse = step.dt * m_maxForce; + + if (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) + { + m_linearImpulse.Normalize(); + m_linearImpulse *= maxImpulse; + } + + impulse = m_linearImpulse - oldImpulse; + + vA -= mA * impulse; + wA -= iA * b2Cross(rA, impulse); + + vB += mB * impulse; + wB += iB * b2Cross(rB, impulse); + } + + bA->m_linearVelocity = vA; + bA->m_angularVelocity = wA; + bB->m_linearVelocity = vB; + bB->m_angularVelocity = wB; +} + +bool b2FrictionJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + 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; +} diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h new file mode 100644 index 000000000..b4c4af261 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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; + + /// 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; + +protected: + + friend class b2Joint; + + b2FrictionJoint(const b2FrictionJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + + b2Mat22 m_linearMass; + float32 m_angularMass; + + b2Vec2 m_linearImpulse; + float32 m_angularImpulse; + + float32 m_maxForce; + float32 m_maxTorque; +}; + +#endif diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2GearJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp similarity index 57% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2GearJoint.cpp rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp index 08eda2d52..89b17ee2c 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2GearJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp @@ -16,11 +16,11 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2GearJoint.h" -#include "b2RevoluteJoint.h" -#include "b2PrismaticJoint.h" -#include "../b2Body.h" -#include "../b2World.h" +#include +#include +#include +#include +#include // Gear Joint: // C0 = (coordinate1 + ratio * coordinate2)_initial @@ -50,8 +50,8 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) b2Assert(type1 == e_revoluteJoint || type1 == e_prismaticJoint); b2Assert(type2 == e_revoluteJoint || type2 == e_prismaticJoint); - b2Assert(def->joint1->GetBody1()->IsStatic()); - b2Assert(def->joint2->GetBody1()->IsStatic()); + b2Assert(def->joint1->GetBodyA()->GetType() == b2_staticBody); + b2Assert(def->joint2->GetBodyA()->GetType() == b2_staticBody); m_revolute1 = NULL; m_prismatic1 = NULL; @@ -60,8 +60,8 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) float32 coordinate1, coordinate2; - m_ground1 = def->joint1->GetBody1(); - m_body1 = def->joint1->GetBody2(); + m_ground1 = def->joint1->GetBodyA(); + m_bodyA = def->joint1->GetBodyB(); if (type1 == e_revoluteJoint) { m_revolute1 = (b2RevoluteJoint*)def->joint1; @@ -77,8 +77,8 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) coordinate1 = m_prismatic1->GetJointTranslation(); } - m_ground2 = def->joint2->GetBody1(); - m_body2 = def->joint2->GetBody2(); + m_ground2 = def->joint2->GetBodyA(); + m_bodyB = def->joint2->GetBodyB(); if (type2 == e_revoluteJoint) { m_revolute2 = (b2RevoluteJoint*)def->joint2; @@ -98,92 +98,93 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) m_constant = coordinate1 + m_ratio * coordinate2; - m_force = 0.0f; + m_impulse = 0.0f; } void b2GearJoint::InitVelocityConstraints(const b2TimeStep& step) { b2Body* g1 = m_ground1; b2Body* g2 = m_ground2; - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; float32 K = 0.0f; m_J.SetZero(); if (m_revolute1) { - m_J.angular1 = -1.0f; + m_J.angularA = -1.0f; K += b1->m_invI; } else { - b2Vec2 ug = b2Mul(g1->GetXForm().R, m_prismatic1->m_localXAxis1); - b2Vec2 r = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 ug = b2Mul(g1->GetTransform().R, m_prismatic1->m_localXAxis1); + b2Vec2 r = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); float32 crug = b2Cross(r, ug); - m_J.linear1 = -ug; - m_J.angular1 = -crug; + m_J.linearA = -ug; + m_J.angularA = -crug; K += b1->m_invMass + b1->m_invI * crug * crug; } if (m_revolute2) { - m_J.angular2 = -m_ratio; + m_J.angularB = -m_ratio; K += m_ratio * m_ratio * b2->m_invI; } else { - b2Vec2 ug = b2Mul(g2->GetXForm().R, m_prismatic2->m_localXAxis1); - b2Vec2 r = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 ug = b2Mul(g2->GetTransform().R, m_prismatic2->m_localXAxis1); + b2Vec2 r = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); float32 crug = b2Cross(r, ug); - m_J.linear2 = -m_ratio * ug; - m_J.angular2 = -m_ratio * crug; + m_J.linearB = -m_ratio * ug; + m_J.angularB = -m_ratio * crug; K += m_ratio * m_ratio * (b2->m_invMass + b2->m_invI * crug * crug); } // Compute effective mass. - b2Assert(K > 0.0f); - m_mass = 1.0f / K; + m_mass = K > 0.0f ? 1.0f / K : 0.0f; if (step.warmStarting) { // Warm starting. - float32 P = B2FORCE_SCALE(step.dt) * m_force; - b1->m_linearVelocity += b1->m_invMass * P * m_J.linear1; - b1->m_angularVelocity += b1->m_invI * P * m_J.angular1; - b2->m_linearVelocity += b2->m_invMass * P * m_J.linear2; - b2->m_angularVelocity += b2->m_invI * P * m_J.angular2; + b1->m_linearVelocity += b1->m_invMass * m_impulse * m_J.linearA; + b1->m_angularVelocity += b1->m_invI * m_impulse * m_J.angularA; + b2->m_linearVelocity += b2->m_invMass * m_impulse * m_J.linearB; + b2->m_angularVelocity += b2->m_invI * m_impulse * m_J.angularB; } else { - m_force = 0.0f; + m_impulse = 0.0f; } } void b2GearJoint::SolveVelocityConstraints(const b2TimeStep& step) { - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + B2_NOT_USED(step); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; float32 Cdot = m_J.Compute( b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity); - float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_mass * Cdot; - m_force += force; + float32 impulse = m_mass * (-Cdot); + m_impulse += impulse; - float32 P = B2FORCE_SCALE(step.dt) * force; - b1->m_linearVelocity += b1->m_invMass * P * m_J.linear1; - b1->m_angularVelocity += b1->m_invI * P * m_J.angular1; - b2->m_linearVelocity += b2->m_invMass * P * m_J.linear2; - b2->m_angularVelocity += b2->m_invI * P * m_J.angular2; + b1->m_linearVelocity += b1->m_invMass * impulse * m_J.linearA; + b1->m_angularVelocity += b1->m_invI * impulse * m_J.angularA; + b2->m_linearVelocity += b2->m_invMass * impulse * m_J.linearB; + b2->m_angularVelocity += b2->m_invI * impulse * m_J.angularB; } -bool b2GearJoint::SolvePositionConstraints() +bool b2GearJoint::SolvePositionConstraints(float32 baumgarte) { + B2_NOT_USED(baumgarte); + float32 linearError = 0.0f; - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; float32 coordinate1, coordinate2; if (m_revolute1) @@ -206,48 +207,53 @@ bool b2GearJoint::SolvePositionConstraints() float32 C = m_constant - (coordinate1 + m_ratio * coordinate2); - float32 impulse = -m_mass * C; + float32 impulse = m_mass * (-C); - b1->m_sweep.c += b1->m_invMass * impulse * m_J.linear1; - b1->m_sweep.a += b1->m_invI * impulse * m_J.angular1; - b2->m_sweep.c += b2->m_invMass * impulse * m_J.linear2; - b2->m_sweep.a += b2->m_invI * impulse * m_J.angular2; + b1->m_sweep.c += b1->m_invMass * impulse * m_J.linearA; + b1->m_sweep.a += b1->m_invI * impulse * m_J.angularA; + b2->m_sweep.c += b2->m_invMass * impulse * m_J.linearB; + b2->m_sweep.a += b2->m_invI * impulse * m_J.angularB; b1->SynchronizeTransform(); b2->SynchronizeTransform(); + // TODO_ERIN not implemented return linearError < b2_linearSlop; } -b2Vec2 b2GearJoint::GetAnchor1() const +b2Vec2 b2GearJoint::GetAnchorA() const { - return m_body1->GetWorldPoint(m_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchor1); } -b2Vec2 b2GearJoint::GetAnchor2() const +b2Vec2 b2GearJoint::GetAnchorB() const { - return m_body2->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchor2); } -b2Vec2 b2GearJoint::GetReactionForce() const +b2Vec2 b2GearJoint::GetReactionForce(float32 inv_dt) const { // TODO_ERIN not tested - b2Vec2 F = B2FORCE_SCALE(m_force) * m_J.linear2; - return F; + b2Vec2 P = m_impulse * m_J.linearB; + return inv_dt * P; } -float32 b2GearJoint::GetReactionTorque() const +float32 b2GearJoint::GetReactionTorque(float32 inv_dt) const { // TODO_ERIN not tested - b2Vec2 r = b2Mul(m_body2->GetXForm().R, m_localAnchor2 - m_body2->GetLocalCenter()); - b2Vec2 F = m_force * m_J.linear2; - float32 T = B2FORCE_SCALE(m_force * m_J.angular2 - b2Cross(r, F)); - return T; + b2Vec2 r = b2Mul(m_bodyB->GetTransform().R, m_localAnchor2 - m_bodyB->GetLocalCenter()); + b2Vec2 P = m_impulse * m_J.linearB; + float32 L = m_impulse * m_J.angularB - b2Cross(r, P); + return inv_dt * L; +} + +void b2GearJoint::SetRatio(float32 ratio) +{ + b2Assert(b2IsValid(ratio)); + m_ratio = ratio; } float32 b2GearJoint::GetRatio() const { return m_ratio; } - - diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2GearJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h similarity index 85% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2GearJoint.h rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h index f48f53c44..eccca0da0 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2GearJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h @@ -19,7 +19,7 @@ #ifndef B2_GEAR_JOINT_H #define B2_GEAR_JOINT_H -#include "b2Joint.h" +#include class b2RevoluteJoint; class b2PrismaticJoint; @@ -60,22 +60,24 @@ struct b2GearJointDef : public b2JointDef class b2GearJoint : public b2Joint { public: - b2Vec2 GetAnchor1() const; - b2Vec2 GetAnchor2() const; + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; - b2Vec2 GetReactionForce() const; - float32 GetReactionTorque() const; + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; - /// Get the gear ratio. + /// Set/Get the gear ratio. + void SetRatio(float32 ratio); float32 GetRatio() const; - //--------------- Internals Below ------------------- +protected: + friend class b2Joint; b2GearJoint(const b2GearJointDef* data); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(); + bool SolvePositionConstraints(float32 baumgarte); b2Body* m_ground1; b2Body* m_ground2; @@ -103,7 +105,7 @@ public: float32 m_mass; // Impulse for accumulation/warm starting. - float32 m_force; + float32 m_impulse; }; #endif diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2Joint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp similarity index 61% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2Joint.cpp rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp index 77dcef47f..a7e19d34d 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2Joint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp @@ -16,17 +16,19 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2Joint.h" -#include "b2DistanceJoint.h" -#include "b2MouseJoint.h" -#include "b2RevoluteJoint.h" -#include "b2PrismaticJoint.h" -#include "b2PulleyJoint.h" -#include "b2GearJoint.h" -#include "../b2Body.h" -#include "../b2World.h" -#include "../../Common/b2BlockAllocator.h" -#include "../../Collision/b2BroadPhase.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -78,6 +80,27 @@ b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) } break; + case e_lineJoint: + { + void* mem = allocator->Allocate(sizeof(b2LineJoint)); + joint = new (mem) b2LineJoint((b2LineJointDef*)def); + } + break; + + case e_weldJoint: + { + void* mem = allocator->Allocate(sizeof(b2WeldJoint)); + joint = new (mem) b2WeldJoint((b2WeldJointDef*)def); + } + break; + + case e_frictionJoint: + { + void* mem = allocator->Allocate(sizeof(b2FrictionJoint)); + joint = new (mem) b2FrictionJoint((b2FrictionJointDef*)def); + } + break; + default: b2Assert(false); break; @@ -115,6 +138,18 @@ void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) allocator->Free(joint, sizeof(b2GearJoint)); break; + case e_lineJoint: + allocator->Free(joint, sizeof(b2LineJoint)); + break; + + case e_weldJoint: + allocator->Free(joint, sizeof(b2WeldJoint)); + break; + + case e_frictionJoint: + allocator->Free(joint, sizeof(b2FrictionJoint)); + break; + default: b2Assert(false); break; @@ -123,12 +158,29 @@ void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) b2Joint::b2Joint(const b2JointDef* def) { + b2Assert(def->bodyA != def->bodyB); + m_type = def->type; m_prev = NULL; m_next = NULL; - m_body1 = def->body1; - m_body2 = def->body2; + m_bodyA = def->bodyA; + m_bodyB = def->bodyB; 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/src/modules/physics/box2d/Source/Dynamics/Joints/b2Joint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h similarity index 69% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2Joint.h rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h index 03dcfdebc..213ad7d1d 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2Joint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h @@ -16,10 +16,10 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef JOINT_H -#define JOINT_H +#ifndef B2_JOINT_H +#define B2_JOINT_H -#include "../../Common/b2Math.h" +#include class b2Body; class b2Joint; @@ -34,7 +34,10 @@ enum b2JointType e_distanceJoint, e_pulleyJoint, e_mouseJoint, - e_gearJoint + e_gearJoint, + e_lineJoint, + e_weldJoint, + e_frictionJoint, }; enum b2LimitState @@ -47,10 +50,10 @@ enum b2LimitState struct b2Jacobian { - b2Vec2 linear1; - float32 angular1; - b2Vec2 linear2; - float32 angular2; + b2Vec2 linearA; + float32 angularA; + b2Vec2 linearB; + float32 angularB; void SetZero(); void Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); @@ -77,8 +80,8 @@ struct b2JointDef { type = e_unknownJoint; userData = NULL; - body1 = NULL; - body2 = NULL; + bodyA = NULL; + bodyB = NULL; collideConnected = false; } @@ -89,10 +92,10 @@ struct b2JointDef void* userData; /// The first attached body. - b2Body* body1; + b2Body* bodyA; /// The second attached body. - b2Body* body2; + b2Body* bodyB; /// Set this flag to true if the attached bodies should collide. bool collideConnected; @@ -108,33 +111,35 @@ public: b2JointType GetType() const; /// Get the first body attached to this joint. - b2Body* GetBody1(); + b2Body* GetBodyA(); /// Get the second body attached to this joint. - b2Body* GetBody2(); + b2Body* GetBodyB(); - /// Get the anchor point on body1 in world coordinates. - virtual b2Vec2 GetAnchor1() const = 0; + /// Get the anchor point on bodyA in world coordinates. + virtual b2Vec2 GetAnchorA() const = 0; - /// Get the anchor point on body2 in world coordinates. - virtual b2Vec2 GetAnchor2() const = 0; + /// Get the anchor point on bodyB in world coordinates. + virtual b2Vec2 GetAnchorB() const = 0; - /// Get the reaction force on body2 at the joint anchor. - virtual b2Vec2 GetReactionForce() const = 0; + /// Get the reaction force on body2 at the joint anchor in Newtons. + virtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0; - /// Get the reaction torque on body2. - virtual float32 GetReactionTorque() const = 0; + /// Get the reaction torque on body2 in N*m. + virtual float32 GetReactionTorque(float32 inv_dt) const = 0; /// Get the next joint the world joint list. b2Joint* GetNext(); /// Get the user data pointer. - void* GetUserData(); + void* GetUserData() const; /// Set the user data pointer. void SetUserData(void* data); - //--------------- Internals Below ------------------- + /// Short-cut function to determine if either body is inactive. + bool IsActive() const; + protected: friend class b2World; friend class b2Body; @@ -150,42 +155,42 @@ protected: virtual void SolveVelocityConstraints(const b2TimeStep& step) = 0; // This returns true if the position errors are within tolerance. - virtual void InitPositionConstraints() {} - virtual bool SolvePositionConstraints() = 0; + virtual bool SolvePositionConstraints(float32 baumgarte) = 0; b2JointType m_type; b2Joint* m_prev; b2Joint* m_next; - b2JointEdge m_node1; - b2JointEdge m_node2; - b2Body* m_body1; - b2Body* m_body2; - - float32 m_inv_dt; + b2JointEdge m_edgeA; + b2JointEdge m_edgeB; + b2Body* m_bodyA; + b2Body* m_bodyB; bool m_islandFlag; - + bool m_collideConnected; void* m_userData; -public: - bool m_collideConnected; + + // Cache here per time step to reduce cache misses. + b2Vec2 m_localCenterA, m_localCenterB; + float32 m_invMassA, m_invIA; + float32 m_invMassB, m_invIB; }; inline void b2Jacobian::SetZero() { - linear1.SetZero(); angular1 = 0.0f; - linear2.SetZero(); angular2 = 0.0f; + linearA.SetZero(); angularA = 0.0f; + linearB.SetZero(); angularB = 0.0f; } inline void b2Jacobian::Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) { - linear1 = x1; angular1 = a1; - linear2 = x2; angular2 = a2; + linearA = x1; angularA = a1; + linearB = x2; angularB = a2; } inline float32 b2Jacobian::Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) { - return b2Dot(linear1, x1) + angular1 * a1 + b2Dot(linear2, x2) + angular2 * a2; + return b2Dot(linearA, x1) + angularA * a1 + b2Dot(linearB, x2) + angularB * a2; } inline b2JointType b2Joint::GetType() const @@ -193,14 +198,14 @@ inline b2JointType b2Joint::GetType() const return m_type; } -inline b2Body* b2Joint::GetBody1() +inline b2Body* b2Joint::GetBodyA() { - return m_body1; + return m_bodyA; } -inline b2Body* b2Joint::GetBody2() +inline b2Body* b2Joint::GetBodyB() { - return m_body2; + return m_bodyB; } inline b2Joint* b2Joint::GetNext() @@ -208,7 +213,7 @@ inline b2Joint* b2Joint::GetNext() return m_next; } -inline void* b2Joint::GetUserData() +inline void* b2Joint::GetUserData() const { return m_userData; } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp new file mode 100644 index 000000000..b6b0a1cb2 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp @@ -0,0 +1,591 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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)] +// +// K = J * invM * JT +// +// J = [-a -s1 a s2] +// 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 +// [-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(2) = max(f2(2), 0) +// upper: f2(2) = min(f2(2), 0) +// +// Solve for correct f2(1) +// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * f2(2) + K(1,1:2) * f1 +// = -Cdot(1) - K(1,2) * f2(2) + K(1,1) * f1(1) + K(1,2) * f1(2) +// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * (f2(2) - f1(2)) + K(1,1) * f1(1) +// f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) +// +// Now compute impulse to be applied: +// df = f2 - f1 + +void b2LineJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + localAxisA = bodyA->GetLocalVector(axis); +} + +b2LineJoint::b2LineJoint(const b2LineJointDef* def) +: b2Joint(def) +{ + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; + m_localXAxis1 = def->localAxisA; + m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); + + m_impulse.SetZero(); + m_motorMass = 0.0; + 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 b2LineJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + m_localCenterA = b1->GetLocalCenter(); + m_localCenterB = b2->GetLocalCenter(); + + b2Transform xf1 = b1->GetTransform(); + b2Transform xf2 = b2->GetTransform(); + + // Compute the effective masses. + b2Vec2 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); + b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + + m_invMassA = b1->m_invMass; + m_invIA = b1->m_invI; + m_invMassB = b2->m_invMass; + m_invIB = b2->m_invI; + + // Compute motor Jacobian and effective mass. + { + m_axis = b2Mul(xf1.R, m_localXAxis1); + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; + if (m_motorMass > b2_epsilon) + { + m_motorMass = 1.0f / m_motorMass; + } + else + { + m_motorMass = 0.0f; + } + } + + // Prismatic constraint. + { + m_perp = b2Mul(xf1.R, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12); + m_K.col2.Set(k12, k22); + } + + // 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.y = 0.0f; + } + } + else if (jointTranslation >= m_upperTranslation) + { + if (m_limitState != e_atUpperLimit) + { + m_limitState = e_atUpperLimit; + m_impulse.y = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.y = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + } + + if (m_enableMotor == false) + { + m_motorImpulse = 0.0f; + } + + if (step.warmStarting) + { + // Account for variable time step. + m_impulse *= step.dtRatio; + m_motorImpulse *= step.dtRatio; + + b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis; + float32 L1 = m_impulse.x * m_s1 + (m_motorImpulse + m_impulse.y) * m_a1; + float32 L2 = m_impulse.x * m_s2 + (m_motorImpulse + m_impulse.y) * m_a2; + + b1->m_linearVelocity -= m_invMassA * P; + b1->m_angularVelocity -= m_invIA * L1; + + b2->m_linearVelocity += m_invMassB * P; + b2->m_angularVelocity += m_invIB * L2; + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } +} + +void b2LineJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 v1 = b1->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w2 = b2->m_angularVelocity; + + // Solve linear motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits) + { + float32 Cdot = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + float32 impulse = m_motorMass * (m_motorSpeed - Cdot); + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = step.dt * m_maxMotorForce; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + b2Vec2 P = impulse * m_axis; + float32 L1 = impulse * m_a1; + float32 L2 = impulse * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + float32 Cdot1 = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; + + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + // Solve prismatic and limit constraint in block form. + float32 Cdot2 = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + b2Vec2 Cdot(Cdot1, Cdot2); + + b2Vec2 f1 = m_impulse; + b2Vec2 df = m_K.Solve(-Cdot); + m_impulse += df; + + if (m_limitState == e_atLowerLimit) + { + m_impulse.y = b2Max(m_impulse.y, 0.0f); + } + else if (m_limitState == e_atUpperLimit) + { + m_impulse.y = b2Min(m_impulse.y, 0.0f); + } + + // f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) + float32 b = -Cdot1 - (m_impulse.y - f1.y) * m_K.col2.x; + float32 f2r; + if (m_K.col1.x != 0.0f) + { + f2r = b / m_K.col1.x + f1.x; + } + else + { + f2r = f1.x; + } + + m_impulse.x = f2r; + + df = m_impulse - f1; + + b2Vec2 P = df.x * m_perp + df.y * m_axis; + float32 L1 = df.x * m_s1 + df.y * m_a1; + float32 L2 = df.x * m_s2 + df.y * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + else + { + // Limit is inactive, just solve the prismatic constraint in block form. + float32 df; + if (m_K.col1.x != 0.0f) + { + df = - Cdot1 / m_K.col1.x; + } + else + { + df = 0.0f; + } + m_impulse.x += df; + + b2Vec2 P = df * m_perp; + float32 L1 = df * m_s1; + float32 L2 = df * m_s2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + b1->m_linearVelocity = v1; + b1->m_angularVelocity = w1; + b2->m_linearVelocity = v2; + b2->m_angularVelocity = w2; +} + +bool b2LineJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 c1 = b1->m_sweep.c; + float32 a1 = b1->m_sweep.a; + + b2Vec2 c2 = b2->m_sweep.c; + float32 a2 = b2->m_sweep.a; + + // Solve linear limit constraint. + float32 linearError = 0.0f, angularError = 0.0f; + bool active = false; + float32 C2 = 0.0f; + + b2Mat22 R1(a1), R2(a2); + + b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); + b2Vec2 d = c2 + r2 - c1 - r1; + + if (m_enableLimit) + { + m_axis = b2Mul(R1, m_localXAxis1); + + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + float32 translation = b2Dot(m_axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + // Prevent large angular corrections + C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); + 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 = 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 = translation - m_upperTranslation; + active = true; + } + } + + m_perp = b2Mul(R1, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + b2Vec2 impulse; + float32 C1; + C1 = b2Dot(m_perp, d); + + linearError = b2Max(linearError, b2Abs(C1)); + angularError = 0.0f; + + if (active) + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12); + m_K.col2.Set(k12, k22); + + b2Vec2 C; + C.x = C1; + C.y = C2; + + impulse = m_K.Solve(-C); + } + else + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + + float32 impulse1; + if (k11 != 0.0f) + { + impulse1 = - C1 / k11; + } + else + { + impulse1 = 0.0f; + } + + impulse.x = impulse1; + impulse.y = 0.0f; + } + + b2Vec2 P = impulse.x * m_perp + impulse.y * m_axis; + float32 L1 = impulse.x * m_s1 + impulse.y * m_a1; + float32 L2 = impulse.x * m_s2 + impulse.y * m_a2; + + c1 -= m_invMassA * P; + a1 -= m_invIA * L1; + c2 += m_invMassB * P; + a2 += m_invIB * L2; + + // TODO_ERIN remove need for this. + b1->m_sweep.c = c1; + b1->m_sweep.a = a1; + b2->m_sweep.c = c2; + b2->m_sweep.a = a2; + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + + return linearError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2LineJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2LineJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +b2Vec2 b2LineJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis); +} + +float32 b2LineJoint::GetReactionTorque(float32 inv_dt) const +{ + B2_NOT_USED(inv_dt); + return 0.0f; +} + +float32 b2LineJoint::GetJointTranslation() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); + b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + float32 translation = b2Dot(d, axis); + return translation; +} + +float32 b2LineJoint::GetJointSpeed() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 p1 = b1->m_sweep.c + r1; + b2Vec2 p2 = b2->m_sweep.c + r2; + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + b2Vec2 v1 = b1->m_linearVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + float32 w2 = b2->m_angularVelocity; + + float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); + return speed; +} + +bool b2LineJoint::IsLimitEnabled() const +{ + return m_enableLimit; +} + +void b2LineJoint::EnableLimit(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; +} + +float32 b2LineJoint::GetLowerLimit() const +{ + return m_lowerTranslation; +} + +float32 b2LineJoint::GetUpperLimit() const +{ + return m_upperTranslation; +} + +void b2LineJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_lowerTranslation = lower; + m_upperTranslation = upper; +} + +bool b2LineJoint::IsMotorEnabled() const +{ + return m_enableMotor; +} + +void b2LineJoint::EnableMotor(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableMotor = flag; +} + +void b2LineJoint::SetMotorSpeed(float32 speed) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_motorSpeed = speed; +} + +void b2LineJoint::SetMaxMotorForce(float32 force) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_maxMotorForce = force; +} + +float32 b2LineJoint::GetMotorForce() const +{ + return m_motorImpulse; +} + + + + + diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h new file mode 100644 index 000000000..803e4c12d --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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_LINE_JOINT_H +#define B2_LINE_JOINT_H + +#include + +/// Line 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 b2LineJointDef : public b2JointDef +{ + b2LineJointDef() + { + type = e_lineJoint; + localAnchorA.SetZero(); + localAnchorB.SetZero(); + localAxisA.Set(1.0f, 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 world axis. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); + + /// The local anchor point relative to body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The local translation axis in body1. + b2Vec2 localAxisA; + + /// 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 line joint. This joint provides two degrees of freedom: translation +/// along an axis fixed in body1 and rotation in the plane. 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 b2LineJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// 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/Get the maximum motor force, usually in N. + void SetMaxMotorForce(float32 force); + float32 GetMaxMotorForce() const; + + /// Get the current motor force, usually in N. + float32 GetMotorForce() const; + +protected: + + friend class b2Joint; + b2LineJoint(const b2LineJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchor1; + b2Vec2 m_localAnchor2; + b2Vec2 m_localXAxis1; + b2Vec2 m_localYAxis1; + + b2Vec2 m_axis, m_perp; + float32 m_s1, m_s2; + float32 m_a1, m_a2; + + b2Mat22 m_K; + b2Vec2 m_impulse; + + float32 m_motorMass; // effective mass for motor/limit translational constraint. + float32 m_motorImpulse; + + float32 m_lowerTranslation; + float32 m_upperTranslation; + float32 m_maxMotorForce; + float32 m_motorSpeed; + + bool m_enableLimit; + bool m_enableMotor; + b2LimitState m_limitState; +}; + +inline float32 b2LineJoint::GetMotorSpeed() const +{ + return m_motorSpeed; +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp new file mode 100644 index 000000000..b72ac5f30 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp @@ -0,0 +1,197 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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_target = def->target; + m_localAnchor = b2MulT(m_bodyB->GetTransform(), m_target); + + 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_target = target; +} + +const b2Vec2& b2MouseJoint::GetTarget() const +{ + return m_target; +} + +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 b2TimeStep& step) +{ + b2Body* b = m_bodyB; + + float32 mass = b->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. + b2Assert(d + step.dt * k > b2_epsilon); + m_gamma = step.dt * (d + step.dt * k); + if (m_gamma != 0.0f) + { + m_gamma = 1.0f / m_gamma; + } + m_beta = step.dt * k * m_gamma; + + // Compute the effective mass matrix. + b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); + + // 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] + float32 invMass = b->m_invMass; + float32 invI = b->m_invI; + + b2Mat22 K1; + K1.col1.x = invMass; K1.col2.x = 0.0f; + K1.col1.y = 0.0f; K1.col2.y = invMass; + + b2Mat22 K2; + K2.col1.x = invI * r.y * r.y; K2.col2.x = -invI * r.x * r.y; + K2.col1.y = -invI * r.x * r.y; K2.col2.y = invI * r.x * r.x; + + b2Mat22 K = K1 + K2; + K.col1.x += m_gamma; + K.col2.y += m_gamma; + + m_mass = K.GetInverse(); + + m_C = b->m_sweep.c + r - m_target; + + // Cheat with some damping + b->m_angularVelocity *= 0.98f; + + // Warm starting. + m_impulse *= step.dtRatio; + b->m_linearVelocity += invMass * m_impulse; + b->m_angularVelocity += invI * b2Cross(r, m_impulse); +} + +void b2MouseJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b = m_bodyB; + + b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); + + // Cdot = v + cross(w, r) + b2Vec2 Cdot = b->m_linearVelocity + b2Cross(b->m_angularVelocity, r); + b2Vec2 impulse = b2Mul(m_mass, -(Cdot + m_beta * m_C + m_gamma * m_impulse)); + + b2Vec2 oldImpulse = m_impulse; + m_impulse += impulse; + float32 maxImpulse = step.dt * m_maxForce; + if (m_impulse.LengthSquared() > maxImpulse * maxImpulse) + { + m_impulse *= maxImpulse / m_impulse.Length(); + } + impulse = m_impulse - oldImpulse; + + b->m_linearVelocity += b->m_invMass * impulse; + b->m_angularVelocity += b->m_invI * b2Cross(r, impulse); +} + +b2Vec2 b2MouseJoint::GetAnchorA() const +{ + return m_target; +} + +b2Vec2 b2MouseJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor); +} + +b2Vec2 b2MouseJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * m_impulse; +} + +float32 b2MouseJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * 0.0f; +} diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2MouseJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h similarity index 70% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2MouseJoint.h rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h index 3d9e59005..cd1959a42 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2MouseJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h @@ -19,7 +19,7 @@ #ifndef B2_MOUSE_JOINT_H #define B2_MOUSE_JOINT_H -#include "b2Joint.h" +#include /// Mouse joint definition. This requires a world target point, /// tuning parameters, and the time step. @@ -32,7 +32,6 @@ struct b2MouseJointDef : public b2JointDef maxForce = 0.0f; frequencyHz = 5.0f; dampingRatio = 0.7f; - timeStep = 1.0f / 60.0f; } /// The initial world target point. This is assumed @@ -49,44 +48,55 @@ struct b2MouseJointDef : public b2JointDef /// The damping ratio. 0 = no damping, 1 = critical damping. float32 dampingRatio; - - /// The time step used in the simulation. - float32 timeStep; }; /// 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 GetAnchor1() const; + b2Vec2 GetAnchorA() const; /// Implements b2Joint. - b2Vec2 GetAnchor2() const; + b2Vec2 GetAnchorB() const; /// Implements b2Joint. - b2Vec2 GetReactionForce() const; + b2Vec2 GetReactionForce(float32 inv_dt) const; /// Implements b2Joint. - float32 GetReactionTorque() const; + float32 GetReactionTorque(float32 inv_dt) const; /// Use this to update the target point. void SetTarget(const b2Vec2& target); + const b2Vec2& GetTarget() const; - //--------------- Internals Below ------------------- + /// 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; + +protected: + friend class b2Joint; b2MouseJoint(const b2MouseJointDef* def); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints() - { - return true; - } + bool SolvePositionConstraints(float32 baumgarte) { B2_NOT_USED(baumgarte); return true; } b2Vec2 m_localAnchor; b2Vec2 m_target; @@ -95,8 +105,10 @@ public: b2Mat22 m_mass; // effective mass for point-to-point constraint. b2Vec2 m_C; // position error float32 m_maxForce; - float32 m_beta; // bias factor - float32 m_gamma; // softness + float32 m_frequencyHz; + float32 m_dampingRatio; + float32 m_beta; + float32 m_gamma; }; #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp new file mode 100644 index 000000000..a019888a4 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp @@ -0,0 +1,586 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + localAxis1 = bodyA->GetLocalVector(axis); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) +: b2Joint(def) +{ + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; + m_localXAxis1 = def->localAxis1; + m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); + m_refAngle = def->referenceAngle; + + m_impulse.SetZero(); + m_motorMass = 0.0; + 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 b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + m_localCenterA = b1->GetLocalCenter(); + m_localCenterB = b2->GetLocalCenter(); + + b2Transform xf1 = b1->GetTransform(); + b2Transform xf2 = b2->GetTransform(); + + // Compute the effective masses. + b2Vec2 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); + b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + + m_invMassA = b1->m_invMass; + m_invIA = b1->m_invI; + m_invMassB = b2->m_invMass; + m_invIB = b2->m_invI; + + // Compute motor Jacobian and effective mass. + { + m_axis = b2Mul(xf1.R, m_localXAxis1); + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; + if (m_motorMass > b2_epsilon) + { + m_motorMass = 1.0f / m_motorMass; + } + } + + // Prismatic constraint. + { + m_perp = b2Mul(xf1.R, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 + i2 * m_s2; + float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = i1 + i2; + float32 k23 = i1 * m_a1 + i2 * m_a2; + float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12, k13); + m_K.col2.Set(k12, k22, k23); + m_K.col3.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 (step.warmStarting) + { + // Account for variable time step. + m_impulse *= step.dtRatio; + m_motorImpulse *= step.dtRatio; + + b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis; + float32 L1 = m_impulse.x * m_s1 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a1; + float32 L2 = m_impulse.x * m_s2 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a2; + + b1->m_linearVelocity -= m_invMassA * P; + b1->m_angularVelocity -= m_invIA * L1; + + b2->m_linearVelocity += m_invMassB * P; + b2->m_angularVelocity += m_invIB * L2; + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } +} + +void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 v1 = b1->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w2 = b2->m_angularVelocity; + + // Solve linear motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits) + { + float32 Cdot = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + float32 impulse = m_motorMass * (m_motorSpeed - Cdot); + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = step.dt * m_maxMotorForce; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + b2Vec2 P = impulse * m_axis; + float32 L1 = impulse * m_a1; + float32 L2 = impulse * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + b2Vec2 Cdot1; + Cdot1.x = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; + Cdot1.y = w2 - w1; + + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + // Solve prismatic and limit constraint in block form. + float32 Cdot2; + Cdot2 = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; + 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.col3.x, m_K.col3.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 L1 = df.x * m_s1 + df.y + df.z * m_a1; + float32 L2 = df.x * m_s2 + df.y + df.z * m_a2; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + 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 L1 = df.x * m_s1 + df.y; + float32 L2 = df.x * m_s2 + df.y; + + v1 -= m_invMassA * P; + w1 -= m_invIA * L1; + + v2 += m_invMassB * P; + w2 += m_invIB * L2; + } + + b1->m_linearVelocity = v1; + b1->m_angularVelocity = w1; + b2->m_linearVelocity = v2; + b2->m_angularVelocity = w2; +} + +bool b2PrismaticJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 c1 = b1->m_sweep.c; + float32 a1 = b1->m_sweep.a; + + b2Vec2 c2 = b2->m_sweep.c; + float32 a2 = b2->m_sweep.a; + + // Solve linear limit constraint. + float32 linearError = 0.0f, angularError = 0.0f; + bool active = false; + float32 C2 = 0.0f; + + b2Mat22 R1(a1), R2(a2); + + b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); + b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); + b2Vec2 d = c2 + r2 - c1 - r1; + + if (m_enableLimit) + { + m_axis = b2Mul(R1, m_localXAxis1); + + m_a1 = b2Cross(d + r1, m_axis); + m_a2 = b2Cross(r2, m_axis); + + float32 translation = b2Dot(m_axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + // Prevent large angular corrections + C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); + 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 = 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 = translation - m_upperTranslation; + active = true; + } + } + + m_perp = b2Mul(R1, m_localYAxis1); + + m_s1 = b2Cross(d + r1, m_perp); + m_s2 = b2Cross(r2, m_perp); + + b2Vec3 impulse; + b2Vec2 C1; + C1.x = b2Dot(m_perp, d); + C1.y = a2 - a1 - m_refAngle; + + linearError = b2Max(linearError, b2Abs(C1.x)); + angularError = b2Abs(C1.y); + + if (active) + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 + i2 * m_s2; + float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; + float32 k22 = i1 + i2; + float32 k23 = i1 * m_a1 + i2 * m_a2; + float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; + + m_K.col1.Set(k11, k12, k13); + m_K.col2.Set(k12, k22, k23); + m_K.col3.Set(k13, k23, k33); + + b2Vec3 C; + C.x = C1.x; + C.y = C1.y; + C.z = C2; + + impulse = m_K.Solve33(-C); + } + else + { + float32 m1 = m_invMassA, m2 = m_invMassB; + float32 i1 = m_invIA, i2 = m_invIB; + + float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; + float32 k12 = i1 * m_s1 + i2 * m_s2; + float32 k22 = i1 + i2; + + m_K.col1.Set(k11, k12, 0.0f); + m_K.col2.Set(k12, k22, 0.0f); + + b2Vec2 impulse1 = m_K.Solve22(-C1); + impulse.x = impulse1.x; + impulse.y = impulse1.y; + impulse.z = 0.0f; + } + + b2Vec2 P = impulse.x * m_perp + impulse.z * m_axis; + float32 L1 = impulse.x * m_s1 + impulse.y + impulse.z * m_a1; + float32 L2 = impulse.x * m_s2 + impulse.y + impulse.z * m_a2; + + c1 -= m_invMassA * P; + a1 -= m_invIA * L1; + c2 += m_invMassB * P; + a2 += m_invIB * L2; + + // TODO_ERIN remove need for this. + b1->m_sweep.c = c1; + b1->m_sweep.a = a1; + b2->m_sweep.c = c2; + b2->m_sweep.a = a2; + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + + return linearError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2PrismaticJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2PrismaticJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +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 +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); + b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + float32 translation = b2Dot(d, axis); + return translation; +} + +float32 b2PrismaticJoint::GetJointSpeed() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 p1 = b1->m_sweep.c + r1; + b2Vec2 p2 = b2->m_sweep.c + r2; + b2Vec2 d = p2 - p1; + b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + + b2Vec2 v1 = b1->m_linearVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + float32 w2 = b2->m_angularVelocity; + + float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); + return speed; +} + +bool b2PrismaticJoint::IsLimitEnabled() const +{ + return m_enableLimit; +} + +void b2PrismaticJoint::EnableLimit(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; +} + +float32 b2PrismaticJoint::GetLowerLimit() const +{ + return m_lowerTranslation; +} + +float32 b2PrismaticJoint::GetUpperLimit() const +{ + return m_upperTranslation; +} + +void b2PrismaticJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_lowerTranslation = lower; + m_upperTranslation = upper; +} + +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() const +{ + return m_motorImpulse; +} diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PrismaticJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h similarity index 83% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2PrismaticJoint.h rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h index 23a1a07db..7a12c5df8 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PrismaticJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h @@ -19,7 +19,7 @@ #ifndef B2_PRISMATIC_JOINT_H #define B2_PRISMATIC_JOINT_H -#include "b2Joint.h" +#include /// Prismatic joint definition. This requires defining a line of /// motion using an axis and an anchor point. The definition uses local @@ -27,13 +27,14 @@ /// 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. +/// @warning at least one body should by dynamic with a non-fixed rotation. struct b2PrismaticJointDef : public b2JointDef { b2PrismaticJointDef() { type = e_prismaticJoint; - localAnchor1.SetZero(); - localAnchor2.SetZero(); + localAnchorA.SetZero(); + localAnchorB.SetZero(); localAxis1.Set(1.0f, 0.0f); referenceAngle = 0.0f; enableLimit = false; @@ -46,13 +47,13 @@ struct b2PrismaticJointDef : public b2JointDef /// Initialize the bodies, anchors, axis, and reference angle using the world /// anchor and world axis. - void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor, const b2Vec2& axis); + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); /// The local anchor point relative to body1's origin. - b2Vec2 localAnchor1; + b2Vec2 localAnchorA; /// The local anchor point relative to body2's origin. - b2Vec2 localAnchor2; + b2Vec2 localAnchorB; /// The local translation axis in body1. b2Vec2 localAxis1; @@ -86,11 +87,11 @@ struct b2PrismaticJointDef : public b2JointDef class b2PrismaticJoint : public b2Joint { public: - b2Vec2 GetAnchor1() const; - b2Vec2 GetAnchor2() const; + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; - b2Vec2 GetReactionForce() const; - float32 GetReactionTorque() const; + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; /// Get the current joint translation, usually in meters. float32 GetJointTranslation() const; @@ -131,13 +132,14 @@ public: /// Get the current motor force, usually in N. float32 GetMotorForce() const; - //--------------- Internals Below ------------------- - +protected: + friend class b2Joint; + friend class b2GearJoint; b2PrismaticJoint(const b2PrismaticJointDef* def); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(); + bool SolvePositionConstraints(float32 baumgarte); b2Vec2 m_localAnchor1; b2Vec2 m_localAnchor2; @@ -145,18 +147,15 @@ public: b2Vec2 m_localYAxis1; float32 m_refAngle; - b2Jacobian m_linearJacobian; - float32 m_linearMass; // effective mass for point-to-line constraint. - float32 m_force; - - float32 m_angularMass; // effective mass for angular constraint. - float32 m_torque; + b2Vec2 m_axis, m_perp; + float32 m_s1, m_s2; + float32 m_a1, m_a2; + + b2Mat33 m_K; + b2Vec3 m_impulse; - b2Jacobian m_motorJacobian; float32 m_motorMass; // effective mass for motor/limit translational constraint. - float32 m_motorForce; - float32 m_limitForce; - float32 m_limitPositionImpulse; + float32 m_motorImpulse; float32 m_lowerTranslation; float32 m_upperTranslation; diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PulleyJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp similarity index 57% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2PulleyJoint.cpp rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp index 3311910cf..beb7db8fb 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PulleyJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp @@ -16,9 +16,9 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2PulleyJoint.h" -#include "../b2Body.h" -#include "../b2World.h" +#include +#include +#include // Pulley: // length1 = norm(p1 - s1) @@ -44,58 +44,57 @@ void b2PulleyJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor1, const b2Vec2& anchor2, float32 r) { - body1 = b1; - body2 = b2; - groundAnchor1 = ga1; - groundAnchor2 = ga2; - localAnchor1 = body1->GetLocalPoint(anchor1); - localAnchor2 = body2->GetLocalPoint(anchor2); + bodyA = b1; + bodyB = b2; + groundAnchorA = ga1; + groundAnchorB = ga2; + localAnchorA = bodyA->GetLocalPoint(anchor1); + localAnchorB = bodyB->GetLocalPoint(anchor2); b2Vec2 d1 = anchor1 - ga1; - length1 = d1.Length(); + lengthA = d1.Length(); b2Vec2 d2 = anchor2 - ga2; - length2 = d2.Length(); + lengthB = d2.Length(); ratio = r; - b2Assert(ratio > B2_FLT_EPSILON); - float32 C = length1 + ratio * length2; - maxLength1 = C - ratio * b2_minPulleyLength; - maxLength2 = (C - b2_minPulleyLength) / ratio; + b2Assert(ratio > b2_epsilon); + float32 C = lengthA + ratio * lengthB; + maxLengthA = C - ratio * b2_minPulleyLength; + maxLengthB = (C - b2_minPulleyLength) / ratio; } b2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def) : b2Joint(def) { - m_ground = m_body1->GetWorld()->GetGroundBody(); - m_groundAnchor1 = def->groundAnchor1 - m_ground->GetXForm().position; - m_groundAnchor2 = def->groundAnchor2 - m_ground->GetXForm().position; - m_localAnchor1 = def->localAnchor1; - m_localAnchor2 = def->localAnchor2; + m_groundAnchor1 = def->groundAnchorA; + m_groundAnchor2 = def->groundAnchorB; + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = def->localAnchorB; b2Assert(def->ratio != 0.0f); m_ratio = def->ratio; - m_constant = def->length1 + m_ratio * def->length2; + m_constant = def->lengthA + m_ratio * def->lengthB; - m_maxLength1 = b2Min(def->maxLength1, m_constant - m_ratio * b2_minPulleyLength); - m_maxLength2 = b2Min(def->maxLength2, (m_constant - b2_minPulleyLength) / m_ratio); + m_maxLength1 = b2Min(def->maxLengthA, m_constant - m_ratio * b2_minPulleyLength); + m_maxLength2 = b2Min(def->maxLengthB, (m_constant - b2_minPulleyLength) / m_ratio); - m_force = 0.0f; - m_limitForce1 = 0.0f; - m_limitForce2 = 0.0f; + m_impulse = 0.0f; + m_limitImpulse1 = 0.0f; + m_limitImpulse2 = 0.0f; } void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) { - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 s1 = m_ground->GetXForm().position + m_groundAnchor1; - b2Vec2 s2 = m_ground->GetXForm().position + m_groundAnchor2; + b2Vec2 s1 = m_groundAnchor1; + b2Vec2 s2 = m_groundAnchor2; // Get the pulley axes. m_u1 = p1 - s1; @@ -126,34 +125,31 @@ void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) if (C > 0.0f) { m_state = e_inactiveLimit; - m_force = 0.0f; + m_impulse = 0.0f; } else { m_state = e_atUpperLimit; - m_positionImpulse = 0.0f; } if (length1 < m_maxLength1) { m_limitState1 = e_inactiveLimit; - m_limitForce1 = 0.0f; + m_limitImpulse1 = 0.0f; } else { m_limitState1 = e_atUpperLimit; - m_limitPositionImpulse1 = 0.0f; } if (length2 < m_maxLength2) { m_limitState2 = e_inactiveLimit; - m_limitForce2 = 0.0f; + m_limitImpulse2 = 0.0f; } else { m_limitState2 = e_atUpperLimit; - m_limitPositionImpulse2 = 0.0f; } // Compute effective mass. @@ -163,18 +159,23 @@ void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) m_limitMass1 = b1->m_invMass + b1->m_invI * cr1u1 * cr1u1; m_limitMass2 = b2->m_invMass + b2->m_invI * cr2u2 * cr2u2; m_pulleyMass = m_limitMass1 + m_ratio * m_ratio * m_limitMass2; - b2Assert(m_limitMass1 > B2_FLT_EPSILON); - b2Assert(m_limitMass2 > B2_FLT_EPSILON); - b2Assert(m_pulleyMass > B2_FLT_EPSILON); + b2Assert(m_limitMass1 > b2_epsilon); + b2Assert(m_limitMass2 > b2_epsilon); + b2Assert(m_pulleyMass > b2_epsilon); m_limitMass1 = 1.0f / m_limitMass1; m_limitMass2 = 1.0f / m_limitMass2; m_pulleyMass = 1.0f / m_pulleyMass; if (step.warmStarting) { + // Scale impulses to support variable time steps. + m_impulse *= step.dtRatio; + m_limitImpulse1 *= step.dtRatio; + m_limitImpulse2 *= step.dtRatio; + // Warm starting. - b2Vec2 P1 = B2FORCE_SCALE(step.dt) * (-m_force - m_limitForce1) * m_u1; - b2Vec2 P2 = B2FORCE_SCALE(step.dt) * (-m_ratio * m_force - m_limitForce2) * m_u2; + b2Vec2 P1 = -(m_impulse + m_limitImpulse1) * m_u1; + b2Vec2 P2 = (-m_ratio * m_impulse - m_limitImpulse2) * m_u2; b1->m_linearVelocity += b1->m_invMass * P1; b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); b2->m_linearVelocity += b2->m_invMass * P2; @@ -182,19 +183,21 @@ void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) } else { - m_force = 0.0f; - m_limitForce1 = 0.0f; - m_limitForce2 = 0.0f; + m_impulse = 0.0f; + m_limitImpulse1 = 0.0f; + m_limitImpulse2 = 0.0f; } } void b2PulleyJoint::SolveVelocityConstraints(const b2TimeStep& step) { - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + B2_NOT_USED(step); - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); if (m_state == e_atUpperLimit) { @@ -202,13 +205,13 @@ void b2PulleyJoint::SolveVelocityConstraints(const b2TimeStep& step) b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); float32 Cdot = -b2Dot(m_u1, v1) - m_ratio * b2Dot(m_u2, v2); - float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_pulleyMass * Cdot; - float32 oldForce = m_force; - m_force = b2Max(0.0f, m_force + force); - force = m_force - oldForce; + float32 impulse = m_pulleyMass * (-Cdot); + float32 oldImpulse = m_impulse; + m_impulse = b2Max(0.0f, m_impulse + impulse); + impulse = m_impulse - oldImpulse; - b2Vec2 P1 = -B2FORCE_SCALE(step.dt) * force * m_u1; - b2Vec2 P2 = -B2FORCE_SCALE(step.dt) * m_ratio * force * m_u2; + b2Vec2 P1 = -impulse * m_u1; + b2Vec2 P2 = -m_ratio * impulse * m_u2; b1->m_linearVelocity += b1->m_invMass * P1; b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); b2->m_linearVelocity += b2->m_invMass * P2; @@ -220,12 +223,12 @@ void b2PulleyJoint::SolveVelocityConstraints(const b2TimeStep& step) b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); float32 Cdot = -b2Dot(m_u1, v1); - float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_limitMass1 * Cdot; - float32 oldForce = m_limitForce1; - m_limitForce1 = b2Max(0.0f, m_limitForce1 + force); - force = m_limitForce1 - oldForce; + float32 impulse = -m_limitMass1 * Cdot; + float32 oldImpulse = m_limitImpulse1; + m_limitImpulse1 = b2Max(0.0f, m_limitImpulse1 + impulse); + impulse = m_limitImpulse1 - oldImpulse; - b2Vec2 P1 = -B2FORCE_SCALE(step.dt) * force * m_u1; + b2Vec2 P1 = -impulse * m_u1; b1->m_linearVelocity += b1->m_invMass * P1; b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); } @@ -235,31 +238,33 @@ void b2PulleyJoint::SolveVelocityConstraints(const b2TimeStep& step) b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); float32 Cdot = -b2Dot(m_u2, v2); - float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_limitMass2 * Cdot; - float32 oldForce = m_limitForce2; - m_limitForce2 = b2Max(0.0f, m_limitForce2 + force); - force = m_limitForce2 - oldForce; + float32 impulse = -m_limitMass2 * Cdot; + float32 oldImpulse = m_limitImpulse2; + m_limitImpulse2 = b2Max(0.0f, m_limitImpulse2 + impulse); + impulse = m_limitImpulse2 - oldImpulse; - b2Vec2 P2 = -B2FORCE_SCALE(step.dt) * force * m_u2; + b2Vec2 P2 = -impulse * m_u2; b2->m_linearVelocity += b2->m_invMass * P2; b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); } } -bool b2PulleyJoint::SolvePositionConstraints() +bool b2PulleyJoint::SolvePositionConstraints(float32 baumgarte) { - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; + B2_NOT_USED(baumgarte); - b2Vec2 s1 = m_ground->GetXForm().position + m_groundAnchor1; - b2Vec2 s2 = m_ground->GetXForm().position + m_groundAnchor2; + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 s1 = m_groundAnchor1; + b2Vec2 s2 = m_groundAnchor2; float32 linearError = 0.0f; if (m_state == e_atUpperLimit) { - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; @@ -294,9 +299,6 @@ bool b2PulleyJoint::SolvePositionConstraints() C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); float32 impulse = -m_pulleyMass * C; - float32 oldImpulse = m_positionImpulse; - m_positionImpulse = b2Max(0.0f, m_positionImpulse + impulse); - impulse = m_positionImpulse - oldImpulse; b2Vec2 P1 = -impulse * m_u1; b2Vec2 P2 = -m_ratio * impulse * m_u2; @@ -312,7 +314,7 @@ bool b2PulleyJoint::SolvePositionConstraints() if (m_limitState1 == e_atUpperLimit) { - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; m_u1 = p1 - s1; @@ -331,9 +333,6 @@ bool b2PulleyJoint::SolvePositionConstraints() linearError = b2Max(linearError, -C); C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); float32 impulse = -m_limitMass1 * C; - float32 oldLimitPositionImpulse = m_limitPositionImpulse1; - m_limitPositionImpulse1 = b2Max(0.0f, m_limitPositionImpulse1 + impulse); - impulse = m_limitPositionImpulse1 - oldLimitPositionImpulse; b2Vec2 P1 = -impulse * m_u1; b1->m_sweep.c += b1->m_invMass * P1; @@ -344,7 +343,7 @@ bool b2PulleyJoint::SolvePositionConstraints() if (m_limitState2 == e_atUpperLimit) { - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p2 = b2->m_sweep.c + r2; m_u2 = p2 - s2; @@ -363,9 +362,6 @@ bool b2PulleyJoint::SolvePositionConstraints() linearError = b2Max(linearError, -C); C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); float32 impulse = -m_limitMass2 * C; - float32 oldLimitPositionImpulse = m_limitPositionImpulse2; - m_limitPositionImpulse2 = b2Max(0.0f, m_limitPositionImpulse2 + impulse); - impulse = m_limitPositionImpulse2 - oldLimitPositionImpulse; b2Vec2 P2 = -impulse * m_u2; b2->m_sweep.c += b2->m_invMass * P2; @@ -377,49 +373,50 @@ bool b2PulleyJoint::SolvePositionConstraints() return linearError < b2_linearSlop; } -b2Vec2 b2PulleyJoint::GetAnchor1() const +b2Vec2 b2PulleyJoint::GetAnchorA() const { - return m_body1->GetWorldPoint(m_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchor1); } -b2Vec2 b2PulleyJoint::GetAnchor2() const +b2Vec2 b2PulleyJoint::GetAnchorB() const { - return m_body2->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchor2); } -b2Vec2 b2PulleyJoint::GetReactionForce() const +b2Vec2 b2PulleyJoint::GetReactionForce(float32 inv_dt) const { - b2Vec2 F = B2FORCE_SCALE(m_force) * m_u2; - return F; + b2Vec2 P = m_impulse * m_u2; + return inv_dt * P; } -float32 b2PulleyJoint::GetReactionTorque() const +float32 b2PulleyJoint::GetReactionTorque(float32 inv_dt) const { + B2_NOT_USED(inv_dt); return 0.0f; } -b2Vec2 b2PulleyJoint::GetGroundAnchor1() const +b2Vec2 b2PulleyJoint::GetGroundAnchorA() const { - return m_ground->GetXForm().position + m_groundAnchor1; + return m_groundAnchor1; } -b2Vec2 b2PulleyJoint::GetGroundAnchor2() const +b2Vec2 b2PulleyJoint::GetGroundAnchorB() const { - return m_ground->GetXForm().position + m_groundAnchor2; + return m_groundAnchor2; } float32 b2PulleyJoint::GetLength1() const { - b2Vec2 p = m_body1->GetWorldPoint(m_localAnchor1); - b2Vec2 s = m_ground->GetXForm().position + m_groundAnchor1; + b2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchor1); + b2Vec2 s = m_groundAnchor1; b2Vec2 d = p - s; return d.Length(); } float32 b2PulleyJoint::GetLength2() const { - b2Vec2 p = m_body2->GetWorldPoint(m_localAnchor2); - b2Vec2 s = m_ground->GetXForm().position + m_groundAnchor2; + b2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchor2); + b2Vec2 s = m_groundAnchor2; b2Vec2 d = p - s; return d.Length(); } diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PulleyJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h similarity index 65% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2PulleyJoint.h rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h index fb65797ea..189decb31 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PulleyJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h @@ -19,7 +19,7 @@ #ifndef B2_PULLEY_JOINT_H #define B2_PULLEY_JOINT_H -#include "b2Joint.h" +#include const float32 b2_minPulleyLength = 2.0f; @@ -31,47 +31,47 @@ struct b2PulleyJointDef : public b2JointDef b2PulleyJointDef() { type = e_pulleyJoint; - groundAnchor1.Set(-1.0f, 1.0f); - groundAnchor2.Set(1.0f, 1.0f); - localAnchor1.Set(-1.0f, 0.0f); - localAnchor2.Set(1.0f, 0.0f); - length1 = 0.0f; - maxLength1 = 0.0f; - length2 = 0.0f; - maxLength2 = 0.0f; + 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; + maxLengthA = 0.0f; + lengthB = 0.0f; + maxLengthB = 0.0f; ratio = 1.0f; collideConnected = true; } /// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors. - void Initialize(b2Body* body1, b2Body* body2, - const b2Vec2& groundAnchor1, const b2Vec2& groundAnchor2, - const b2Vec2& anchor1, const b2Vec2& anchor2, + 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 groundAnchor1; + b2Vec2 groundAnchorA; /// The second ground anchor in world coordinates. This point never moves. - b2Vec2 groundAnchor2; + b2Vec2 groundAnchorB; - /// The local anchor point relative to body1's origin. - b2Vec2 localAnchor1; + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; - /// The local anchor point relative to body2's origin. - b2Vec2 localAnchor2; + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; - /// The a reference length for the segment attached to body1. - float32 length1; + /// The a reference length for the segment attached to bodyA. + float32 lengthA; - /// The maximum length of the segment attached to body1. - float32 maxLength1; + /// The maximum length of the segment attached to bodyA. + float32 maxLengthA; - /// The a reference length for the segment attached to body2. - float32 length2; + /// The a reference length for the segment attached to bodyB. + float32 lengthB; - /// The maximum length of the segment attached to body2. - float32 maxLength2; + /// The maximum length of the segment attached to bodyB. + float32 maxLengthB; /// The pulley ratio, used to simulate a block-and-tackle. float32 ratio; @@ -86,17 +86,17 @@ struct b2PulleyJointDef : public b2JointDef class b2PulleyJoint : public b2Joint { public: - b2Vec2 GetAnchor1() const; - b2Vec2 GetAnchor2() const; + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; - b2Vec2 GetReactionForce() const; - float32 GetReactionTorque() const; + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; /// Get the first ground anchor. - b2Vec2 GetGroundAnchor1() const; + b2Vec2 GetGroundAnchorA() const; /// Get the second ground anchor. - b2Vec2 GetGroundAnchor2() const; + b2Vec2 GetGroundAnchorB() const; /// Get the current length of the segment attached to body1. float32 GetLength1() const; @@ -107,15 +107,15 @@ public: /// Get the pulley ratio. float32 GetRatio() const; - //--------------- Internals Below ------------------- +protected: + friend class b2Joint; b2PulleyJoint(const b2PulleyJointDef* data); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(); + bool SolvePositionConstraints(float32 baumgarte); - b2Body* m_ground; b2Vec2 m_groundAnchor1; b2Vec2 m_groundAnchor2; b2Vec2 m_localAnchor1; @@ -136,14 +136,9 @@ public: float32 m_limitMass2; // Impulses for accumulation/warm starting. - float32 m_force; - float32 m_limitForce1; - float32 m_limitForce2; - - // Position impulses for accumulation. - float32 m_positionImpulse; - float32 m_limitPositionImpulse1; - float32 m_limitPositionImpulse2; + float32 m_impulse; + float32 m_limitImpulse1; + float32 m_limitImpulse2; b2LimitState m_state; b2LimitState m_limitState1; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp new file mode 100644 index 000000000..f9845265a --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp @@ -0,0 +1,478 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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* b1, b2Body* b2, const b2Vec2& anchor) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) +: b2Joint(def) +{ + m_localAnchor1 = def->localAnchorA; + m_localAnchor2 = 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 b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + if (m_enableMotor || m_enableLimit) + { + // You cannot create a rotation limit between bodies that + // both have fixed rotation. + b2Assert(b1->m_invI > 0.0f || b2->m_invI > 0.0f); + } + + // Compute the effective mass matrix. + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ m1+r1y^2*i1+m2+r2y^2*i2, -r1y*i1*r1x-r2y*i2*r2x, -r1y*i1-r2y*i2] + // [ -r1y*i1*r1x-r2y*i2*r2x, m1+r1x^2*i1+m2+r2x^2*i2, r1x*i1+r2x*i2] + // [ -r1y*i1-r2y*i2, r1x*i1+r2x*i2, i1+i2] + + float32 m1 = b1->m_invMass, m2 = b2->m_invMass; + float32 i1 = b1->m_invI, i2 = b2->m_invI; + + m_mass.col1.x = m1 + m2 + r1.y * r1.y * i1 + r2.y * r2.y * i2; + m_mass.col2.x = -r1.y * r1.x * i1 - r2.y * r2.x * i2; + m_mass.col3.x = -r1.y * i1 - r2.y * i2; + m_mass.col1.y = m_mass.col2.x; + m_mass.col2.y = m1 + m2 + r1.x * r1.x * i1 + r2.x * r2.x * i2; + m_mass.col3.y = r1.x * i1 + r2.x * i2; + m_mass.col1.z = m_mass.col3.x; + m_mass.col2.z = m_mass.col3.y; + m_mass.col3.z = i1 + i2; + + m_motorMass = i1 + i2; + if (m_motorMass > 0.0f) + { + m_motorMass = 1.0f / m_motorMass; + } + + if (m_enableMotor == false) + { + m_motorImpulse = 0.0f; + } + + if (m_enableLimit) + { + float32 jointAngle = b2->m_sweep.a - b1->m_sweep.a - 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 (step.warmStarting) + { + // Scale impulses to support a variable time step. + m_impulse *= step.dtRatio; + m_motorImpulse *= step.dtRatio; + + b2Vec2 P(m_impulse.x, m_impulse.y); + + b1->m_linearVelocity -= m1 * P; + b1->m_angularVelocity -= i1 * (b2Cross(r1, P) + m_motorImpulse + m_impulse.z); + + b2->m_linearVelocity += m2 * P; + b2->m_angularVelocity += i2 * (b2Cross(r2, P) + m_motorImpulse + m_impulse.z); + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } +} + +void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + b2Vec2 v1 = b1->m_linearVelocity; + float32 w1 = b1->m_angularVelocity; + b2Vec2 v2 = b2->m_linearVelocity; + float32 w2 = b2->m_angularVelocity; + + float32 m1 = b1->m_invMass, m2 = b2->m_invMass; + float32 i1 = b1->m_invI, i2 = b2->m_invI; + + // Solve motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits) + { + float32 Cdot = w2 - w1 - m_motorSpeed; + float32 impulse = m_motorMass * (-Cdot); + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = step.dt * m_maxMotorTorque; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + w1 -= i1 * impulse; + w2 += i2 * impulse; + } + + // Solve limit constraint. + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + // Solve point-to-point constraint + b2Vec2 Cdot1 = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); + float32 Cdot2 = w2 - w1; + 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 reduced = m_mass.Solve22(-Cdot1); + 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 if (m_limitState == e_atUpperLimit) + { + float32 newImpulse = m_impulse.z + impulse.z; + if (newImpulse > 0.0f) + { + b2Vec2 reduced = m_mass.Solve22(-Cdot1); + 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; + } + } + + b2Vec2 P(impulse.x, impulse.y); + + v1 -= m1 * P; + w1 -= i1 * (b2Cross(r1, P) + impulse.z); + + v2 += m2 * P; + w2 += i2 * (b2Cross(r2, P) + impulse.z); + } + else + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + // Solve point-to-point constraint + b2Vec2 Cdot = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); + b2Vec2 impulse = m_mass.Solve22(-Cdot); + + m_impulse.x += impulse.x; + m_impulse.y += impulse.y; + + v1 -= m1 * impulse; + w1 -= i1 * b2Cross(r1, impulse); + + v2 += m2 * impulse; + w2 += i2 * b2Cross(r2, impulse); + } + + b1->m_linearVelocity = v1; + b1->m_angularVelocity = w1; + b2->m_linearVelocity = v2; + b2->m_angularVelocity = w2; +} + +bool b2RevoluteJoint::SolvePositionConstraints(float32 baumgarte) +{ + // TODO_ERIN block solve with limit. + + B2_NOT_USED(baumgarte); + + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + + float32 angularError = 0.0f; + float32 positionError = 0.0f; + + // Solve angular limit constraint. + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + float32 angle = b2->m_sweep.a - b1->m_sweep.a - 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; + } + + b1->m_sweep.a -= b1->m_invI * limitImpulse; + b2->m_sweep.a += b2->m_invI * limitImpulse; + + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + } + + // Solve point-to-point constraint. + { + b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); + b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + + b2Vec2 C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + positionError = C.Length(); + + float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; + float32 invI1 = b1->m_invI, invI2 = b2->m_invI; + + // Handle large detachment. + const float32 k_allowedStretch = 10.0f * b2_linearSlop; + if (C.LengthSquared() > k_allowedStretch * k_allowedStretch) + { + // Use a particle solution (no rotation). + b2Vec2 u = C; u.Normalize(); + float32 m = invMass1 + invMass2; + if (m > 0.0f) + { + m = 1.0f / m; + } + b2Vec2 impulse = m * (-C); + const float32 k_beta = 0.5f; + b1->m_sweep.c -= k_beta * invMass1 * impulse; + b2->m_sweep.c += k_beta * invMass2 * impulse; + + C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + } + + b2Mat22 K1; + K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; + K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; + + b2Mat22 K2; + K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; + K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; + + b2Mat22 K3; + K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; + K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; + + b2Mat22 K = K1 + K2 + K3; + b2Vec2 impulse = K.Solve(-C); + + b1->m_sweep.c -= b1->m_invMass * impulse; + b1->m_sweep.a -= b1->m_invI * b2Cross(r1, impulse); + + b2->m_sweep.c += b2->m_invMass * impulse; + b2->m_sweep.a += b2->m_invI * b2Cross(r2, impulse); + + b1->SynchronizeTransform(); + b2->SynchronizeTransform(); + } + + return positionError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2RevoluteJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchor1); +} + +b2Vec2 b2RevoluteJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchor2); +} + +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* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + return b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; +} + +float32 b2RevoluteJoint::GetJointSpeed() const +{ + b2Body* b1 = m_bodyA; + b2Body* b2 = m_bodyB; + return b2->m_angularVelocity - b1->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() const +{ + return 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) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; +} + +float32 b2RevoluteJoint::GetLowerLimit() const +{ + return m_lowerAngle; +} + +float32 b2RevoluteJoint::GetUpperLimit() const +{ + return m_upperAngle; +} + +void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_lowerAngle = lower; + m_upperAngle = upper; +} diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2RevoluteJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h similarity index 82% rename from src/modules/physics/box2d/Source/Dynamics/Joints/b2RevoluteJoint.h rename to src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h index ebec2f5ef..c0180beba 100644 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2RevoluteJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h @@ -19,7 +19,7 @@ #ifndef B2_REVOLUTE_JOINT_H #define B2_REVOLUTE_JOINT_H -#include "b2Joint.h" +#include /// Revolute joint definition. This requires defining an /// anchor point where the bodies are joined. The definition @@ -37,8 +37,8 @@ struct b2RevoluteJointDef : public b2JointDef b2RevoluteJointDef() { type = e_revoluteJoint; - localAnchor1.Set(0.0f, 0.0f); - localAnchor2.Set(0.0f, 0.0f); + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); referenceAngle = 0.0f; lowerAngle = 0.0f; upperAngle = 0.0f; @@ -48,15 +48,15 @@ struct b2RevoluteJointDef : public b2JointDef enableMotor = false; } - /// Initialize the bodies, anchors, and reference angle using the world - /// anchor. - void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor); + /// 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 body1's origin. - b2Vec2 localAnchor1; + b2Vec2 localAnchorA; /// The local anchor point relative to body2's origin. - b2Vec2 localAnchor2; + b2Vec2 localAnchorB; /// The body2 angle minus body1 angle in the reference state (radians). float32 referenceAngle; @@ -81,7 +81,7 @@ struct b2RevoluteJointDef : public b2JointDef float32 maxMotorTorque; }; -/// A revolute joint constrains to bodies to share a common point while they +/// 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 @@ -90,11 +90,11 @@ struct b2RevoluteJointDef : public b2JointDef class b2RevoluteJoint : public b2Joint { public: - b2Vec2 GetAnchor1() const; - b2Vec2 GetAnchor2() const; + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; - b2Vec2 GetReactionForce() const; - float32 GetReactionTorque() const; + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; /// Get the current joint angle in radians. float32 GetJointAngle() const; @@ -135,22 +135,24 @@ public: /// Get the current motor torque, usually in N-m. float32 GetMotorTorque() const; - //--------------- Internals Below ------------------- +protected: + + friend class b2Joint; + friend class b2GearJoint; + b2RevoluteJoint(const b2RevoluteJointDef* def); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(); + bool SolvePositionConstraints(float32 baumgarte); b2Vec2 m_localAnchor1; // relative b2Vec2 m_localAnchor2; - b2Vec2 m_pivotForce; - float32 m_motorForce; - float32 m_limitForce; - float32 m_limitPositionImpulse; + b2Vec3 m_impulse; + float32 m_motorImpulse; - b2Mat22 m_pivotMass; // effective mass for point-to-point constraint. + b2Mat33 m_mass; // effective mass for point-to-point constraint. float32 m_motorMass; // effective mass for motor/limit angular constraint. bool m_enableMotor; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp new file mode 100644 index 000000000..49b5513ba --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp @@ -0,0 +1,219 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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_impulse.SetZero(); +} + +void b2WeldJoint::InitVelocityConstraints(const b2TimeStep& step) +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + // Compute the effective mass matrix. + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // 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 = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + m_mass.col3.x = -rA.y * iA - rB.y * iB; + m_mass.col1.y = m_mass.col2.x; + m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + m_mass.col3.y = rA.x * iA + rB.x * iB; + m_mass.col1.z = m_mass.col3.x; + m_mass.col2.z = m_mass.col3.y; + m_mass.col3.z = iA + iB; + + if (step.warmStarting) + { + // Scale impulses to support a variable time step. + m_impulse *= step.dtRatio; + + b2Vec2 P(m_impulse.x, m_impulse.y); + + bA->m_linearVelocity -= mA * P; + bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_impulse.z); + + bB->m_linearVelocity += mB * P; + bB->m_angularVelocity += iB * (b2Cross(rB, P) + m_impulse.z); + } + else + { + m_impulse.SetZero(); + } +} + +void b2WeldJoint::SolveVelocityConstraints(const b2TimeStep& step) +{ + B2_NOT_USED(step); + + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + b2Vec2 vA = bA->m_linearVelocity; + float32 wA = bA->m_angularVelocity; + b2Vec2 vB = bB->m_linearVelocity; + float32 wB = bB->m_angularVelocity; + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + // Solve point-to-point constraint + b2Vec2 Cdot1 = vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA); + float32 Cdot2 = wB - wA; + b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + + b2Vec3 impulse = m_mass.Solve33(-Cdot); + m_impulse += impulse; + + b2Vec2 P(impulse.x, impulse.y); + + vA -= mA * P; + wA -= iA * (b2Cross(rA, P) + impulse.z); + + vB += mB * P; + wB += iB * (b2Cross(rB, P) + impulse.z); + + bA->m_linearVelocity = vA; + bA->m_angularVelocity = wA; + bB->m_linearVelocity = vB; + bB->m_angularVelocity = wB; +} + +bool b2WeldJoint::SolvePositionConstraints(float32 baumgarte) +{ + B2_NOT_USED(baumgarte); + + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + float32 mA = bA->m_invMass, mB = bB->m_invMass; + float32 iA = bA->m_invI, iB = bB->m_invI; + + b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); + b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + + b2Vec2 C1 = bB->m_sweep.c + rB - bA->m_sweep.c - rA; + float32 C2 = bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle; + + // Handle large detachment. + const float32 k_allowedStretch = 10.0f * b2_linearSlop; + float32 positionError = C1.Length(); + float32 angularError = b2Abs(C2); + if (positionError > k_allowedStretch) + { + iA *= 1.0f; + iB *= 1.0f; + } + + m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + m_mass.col3.x = -rA.y * iA - rB.y * iB; + m_mass.col1.y = m_mass.col2.x; + m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + m_mass.col3.y = rA.x * iA + rB.x * iB; + m_mass.col1.z = m_mass.col3.x; + m_mass.col2.z = m_mass.col3.y; + m_mass.col3.z = iA + iB; + + b2Vec3 C(C1.x, C1.y, C2); + + b2Vec3 impulse = m_mass.Solve33(-C); + + b2Vec2 P(impulse.x, impulse.y); + + bA->m_sweep.c -= mA * P; + bA->m_sweep.a -= iA * (b2Cross(rA, P) + impulse.z); + + bB->m_sweep.c += mB * P; + bB->m_sweep.a += iB * (b2Cross(rB, P) + impulse.z); + + bA->SynchronizeTransform(); + bB->SynchronizeTransform(); + + 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; +} diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h new file mode 100644 index 000000000..4e63b6aa6 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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; + } + + /// Initialize the bodies, anchors, and reference angle using a world + /// anchor point. + void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor); + + /// The local anchor point relative to body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The body2 angle minus body1 angle in the reference state (radians). + float32 referenceAngle; +}; + +/// 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; + +protected: + + friend class b2Joint; + + b2WeldJoint(const b2WeldJointDef* def); + + void InitVelocityConstraints(const b2TimeStep& step); + void SolveVelocityConstraints(const b2TimeStep& step); + + bool SolvePositionConstraints(float32 baumgarte); + + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + float32 m_referenceAngle; + + b2Vec3 m_impulse; + + b2Mat33 m_mass; +}; + +#endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp new file mode 100644 index 000000000..4b8865148 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp @@ -0,0 +1,470 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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->inertiaScale) && bd->inertiaScale >= 0.0f); + 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.position = bd->position; + m_xf.R.Set(bd->angle); + + m_sweep.localCenter.SetZero(); + m_sweep.a0 = m_sweep.a = bd->angle; + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + + 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_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) +{ + if (m_type == type) + { + return; + } + + m_type = type; + + ResetMassData(); + + if (m_type == b2_staticBody) + { + m_linearVelocity.SetZero(); + m_angularVelocity = 0.0f; + } + + SetAwake(true); + + m_force.SetZero(); + m_torque = 0.0f; + + // Since the body type changed, we need to flag contacts for filtering. + for (b2ContactEdge* ce = m_contactList; ce; ce = ce->next) + { + ce->contact->FlagForFiltering(); + } +} + +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->CreateProxy(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) + { + b2Assert(fixture->m_proxyId != b2BroadPhase::e_nullProxy); + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + fixture->DestroyProxy(broadPhase); + } + else + { + b2Assert(fixture->m_proxyId == b2BroadPhase::e_nullProxy); + } + + 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_sweep.c = m_xf.position; + return; + } + + b2Assert(m_type == b2_dynamicBody); + + // Accumulate mass over all fixtures. + b2Vec2 center = 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; + center += massData.mass * massData.center; + m_I += massData.I; + } + + // Compute center of mass. + if (m_mass > 0.0f) + { + m_invMass = 1.0f / m_mass; + center *= 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(center, center); + 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 = 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); +} + +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.R.Set(angle); + m_xf.position = position; + + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + m_sweep.a0 = m_sweep.a = 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); + } + + m_world->m_contactManager.FindNewContacts(); +} + +void b2Body::SynchronizeFixtures() +{ + b2Transform xf1; + xf1.R.Set(m_sweep.a0); + xf1.position = m_sweep.c0 - b2Mul(xf1.R, 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) +{ + 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->CreateProxy(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->DestroyProxy(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; + } +} \ No newline at end of file diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h new file mode 100644 index 000000000..f2f915faa --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h @@ -0,0 +1,802 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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, +}; + +/// 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; + inertiaScale = 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; + + /// Experimental: scales the inertia tensor. + float32 inertiaScale; +}; + +/// 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. + /// This breaks any contacts and wakes the other bodies. + /// Manipulating a body's transform may cause non-physical behavior. + /// @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. + 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. + void ApplyForce(const b2Vec2& force, const b2Vec2& point); + + /// 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. + void ApplyTorque(float32 torque); + + /// 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. + void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point); + + /// Apply an angular impulse. + /// @param impulse the angular impulse in units of kg*m*m/s + void ApplyAngularImpulse(float32 impulse); + + /// 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); + + /// 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 put body to sleep, false to wake it. + void SetAwake(bool flag); + + /// Get the sleeping state of this body. + /// @return true if the body is sleeping. + 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; + +private: + + friend class b2World; + friend class b2Island; + friend class b2ContactManager; + friend class b2ContactSolver; + friend class b2TOISolver; + + friend class b2DistanceJoint; + friend class b2GearJoint; + friend class b2LineJoint; + friend class b2MouseJoint; + friend class b2PrismaticJoint; + friend class b2PulleyJoint; + friend class b2RevoluteJoint; + friend class b2WeldJoint; + friend class b2FrictionJoint; + + // 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_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.position; +} + +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 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.R, 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.R, 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 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 void b2Body::SetFixedRotation(bool flag) +{ + if (flag) + { + m_flags |= e_fixedRotationFlag; + } + else + { + m_flags &= ~e_fixedRotationFlag; + } + + ResetMassData(); +} + +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) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + + m_force += force; + m_torque += b2Cross(point - m_sweep.c, force); +} + +inline void b2Body::ApplyTorque(float32 torque) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + + m_torque += torque; +} + +inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + m_linearVelocity += m_invMass * impulse; + m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse); +} + +inline void b2Body::ApplyAngularImpulse(float32 impulse) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + m_angularVelocity += m_invI * impulse; +} + +inline void b2Body::SynchronizeTransform() +{ + m_xf.R.Set(m_sweep.a); + m_xf.position = m_sweep.c - b2Mul(m_xf.R, m_sweep.localCenter); +} + +inline void b2Body::Advance(float32 t) +{ + // Advance to the new safe time. + m_sweep.Advance(t); + m_sweep.c = m_sweep.c0; + m_sweep.a = m_sweep.a0; + SynchronizeTransform(); +} + +inline b2World* b2Body::GetWorld() +{ + return m_world; +} + +inline const b2World* b2Body::GetWorld() const +{ + return m_world; +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp new file mode 100644 index 000000000..d8d96ddbc --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp @@ -0,0 +1,266 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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(); + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + if (bodyA->IsAwake() == false && bodyB->IsAwake() == false) + { + c = c->GetNext(); + continue; + } + + // 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; + } + + int32 proxyIdA = fixtureA->m_proxyId; + int32 proxyIdB = fixtureB->m_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) +{ + b2Fixture* fixtureA = (b2Fixture*)proxyUserDataA; + b2Fixture* fixtureB = (b2Fixture*)proxyUserDataB; + + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + // Are the fixtures on the same body? + if (bodyA == bodyB) + { + return; + } + + // 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(); + if (fA == fixtureA && fB == fixtureB) + { + // A contact already exists. + return; + } + + if (fA == fixtureB && fB == fixtureA) + { + // 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, fixtureB, m_allocator); + + // Contact creation may swap fixtures. + fixtureA = c->GetFixtureA(); + fixtureB = c->GetFixtureB(); + 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; + + ++m_contactCount; +} diff --git a/src/modules/physics/box2d/Source/Dynamics/b2ContactManager.h b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h similarity index 58% rename from src/modules/physics/box2d/Source/Dynamics/b2ContactManager.h rename to src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h index 7bba1a103..fcba54ae7 100644 --- a/src/modules/physics/box2d/Source/Dynamics/b2ContactManager.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,36 +19,34 @@ #ifndef B2_CONTACT_MANAGER_H #define B2_CONTACT_MANAGER_H -#include "../Collision/b2BroadPhase.h" -#include "../Dynamics/Contacts/b2NullContact.h" +#include -class b2World; class b2Contact; -struct b2TimeStep; +class b2ContactFilter; +class b2ContactListener; +class b2BlockAllocator; // Delegate of b2World. -class b2ContactManager : public b2PairCallback +class b2ContactManager { public: - b2ContactManager() : m_world(NULL), m_destroyImmediate(false) {} + b2ContactManager(); - // Implements PairCallback - void* PairAdded(void* proxyUserData1, void* proxyUserData2); + // Broad-phase callback. + void AddPair(void* proxyUserDataA, void* proxyUserDataB); - // Implements PairCallback - void PairRemoved(void* proxyUserData1, void* proxyUserData2, void* pairUserData); + void FindNewContacts(); void Destroy(b2Contact* c); void Collide(); - - b2World* m_world; - - // This lets us provide broadphase proxy pair user data for - // contacts that shouldn't exist. - b2NullContact m_nullContact; - - bool m_destroyImmediate; + + b2BroadPhase m_broadPhase; + b2Contact* m_contactList; + int32 m_contactCount; + b2ContactFilter* m_contactFilter; + b2ContactListener* m_contactListener; + b2BlockAllocator* m_allocator; }; #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp new file mode 100644 index 000000000..31355b572 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp @@ -0,0 +1,163 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + + +b2Fixture::b2Fixture() +{ + m_userData = NULL; + m_body = NULL; + m_next = NULL; + m_proxyId = b2BroadPhase::e_nullProxy; + m_shape = NULL; + m_density = 0.0f; +} + +b2Fixture::~b2Fixture() +{ + b2Assert(m_shape == NULL); + b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); +} + +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); + + m_density = def->density; +} + +void b2Fixture::Destroy(b2BlockAllocator* allocator) +{ + // The proxy must be destroyed before calling this. + b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); + + // 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_polygon: + { + b2PolygonShape* s = (b2PolygonShape*)m_shape; + s->~b2PolygonShape(); + allocator->Free(s, sizeof(b2PolygonShape)); + } + break; + + default: + b2Assert(false); + break; + } + + m_shape = NULL; +} + +void b2Fixture::CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf) +{ + b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); + + // Create proxy in the broad-phase. + m_shape->ComputeAABB(&m_aabb, xf); + m_proxyId = broadPhase->CreateProxy(m_aabb, this); +} + +void b2Fixture::DestroyProxy(b2BroadPhase* broadPhase) +{ + if (m_proxyId == b2BroadPhase::e_nullProxy) + { + return; + } + + // Destroy proxy in the broad-phase. + broadPhase->DestroyProxy(m_proxyId); + m_proxyId = b2BroadPhase::e_nullProxy; +} + +void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2) +{ + if (m_proxyId == b2BroadPhase::e_nullProxy) + { + return; + } + + // Compute an AABB that covers the swept shape (may miss some rotation effect). + b2AABB aabb1, aabb2; + m_shape->ComputeAABB(&aabb1, transform1); + m_shape->ComputeAABB(&aabb2, transform2); + + m_aabb.Combine(aabb1, aabb2); + + b2Vec2 displacement = transform2.position - transform1.position; + + broadPhase->MoveProxy(m_proxyId, m_aabb, displacement); +} + +void b2Fixture::SetFilterData(const b2Filter& filter) +{ + m_filter = filter; + + 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; + } +} + +void b2Fixture::SetSensor(bool sensor) +{ + m_isSensor = sensor; +} + diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h new file mode 100644 index 000000000..d9d325554 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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; + +/// This holds contact filtering data. +struct b2Filter +{ + /// 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; + filter.categoryBits = 0x0001; + filter.maskBits = 0xFFFF; + filter.groupIndex = 0; + isSensor = false; + } + + virtual ~b2FixtureDef() {} + + /// 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; +}; + + +/// 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. + void SetFilterData(const b2Filter& filter); + + /// Get the contact filtering data. + const b2Filter& GetFilterData() const; + + /// 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 xf the shape world transform. + /// @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) 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. + void SetFriction(float32 friction); + + /// Get the coefficient of restitution. + float32 GetRestitution() const; + + /// Set the coefficient of restitution. + 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() const; + +protected: + + friend class b2Body; + friend class b2World; + friend class b2Contact; + friend class b2ContactManager; + + b2Fixture(); + ~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 CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf); + void DestroyProxy(b2BroadPhase* broadPhase); + + void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2); + + b2AABB m_aabb; + + float32 m_density; + + b2Fixture* m_next; + b2Body* m_body; + + b2Shape* m_shape; + + float32 m_friction; + float32 m_restitution; + + int32 m_proxyId; + 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) const +{ + return m_shape->RayCast(output, input, m_body->GetTransform()); +} + +inline void b2Fixture::GetMassData(b2MassData* massData) const +{ + m_shape->ComputeMass(massData, m_density); +} + +inline const b2AABB& b2Fixture::GetAABB() const +{ + return m_aabb; +} + +#endif diff --git a/src/modules/physics/box2d/Source/Dynamics/b2Island.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp similarity index 62% rename from src/modules/physics/box2d/Source/Dynamics/b2Island.cpp rename to src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp index 4096c1ba3..009249979 100644 --- a/src/modules/physics/box2d/Source/Dynamics/b2Island.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,13 +16,14 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2Island.h" -#include "b2Body.h" -#include "b2World.h" -#include "Contacts/b2Contact.h" -#include "Contacts/b2ContactSolver.h" -#include "Joints/b2Joint.h" -#include "../Common/b2StackAllocator.h" +#include +#include +#include +#include +#include +#include +#include +#include /* Position Correction Notes @@ -103,6 +104,45 @@ 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, @@ -124,35 +164,36 @@ b2Island::b2Island( m_contacts = (b2Contact**)m_allocator->Allocate(contactCapacity * sizeof(b2Contact*)); m_joints = (b2Joint**)m_allocator->Allocate(jointCapacity * sizeof(b2Joint*)); - m_positionIterationCount = 0; + 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(const b2TimeStep& step, const b2Vec2& gravity, bool correctPositions, bool allowSleep) +void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep) { // Integrate velocities and apply damping. for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; - if (b->IsStatic()) + if (b->GetType() != b2_dynamicBody) + { continue; + } // Integrate velocities. b->m_linearVelocity += step.dt * (gravity + b->m_invMass * b->m_force); b->m_angularVelocity += step.dt * b->m_invI * b->m_torque; - // Reset forces. - b->m_force.Set(0.0f, 0.0f); - b->m_torque = 0.0f; - // Apply damping. // ODE: dv/dt + c * v = 0 // Solution: v(t) = v0 * exp(-c * t) @@ -162,72 +203,70 @@ void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool correct // v2 = (1.0f - c * dt) * v1 b->m_linearVelocity *= b2Clamp(1.0f - step.dt * b->m_linearDamping, 0.0f, 1.0f); b->m_angularVelocity *= b2Clamp(1.0f - step.dt * b->m_angularDamping, 0.0f, 1.0f); - - // Check for large velocities. -#ifdef TARGET_FLOAT32_IS_FIXED - // Fixed point code written this way to prevent - // overflows, float code is optimized for speed - - float32 vMagnitude = b->m_linearVelocity.Length(); - if(vMagnitude > b2_maxLinearVelocity) { - b->m_linearVelocity *= b2_maxLinearVelocity/vMagnitude; - } - b->m_angularVelocity = b2Clamp(b->m_angularVelocity, - -b2_maxAngularVelocity, b2_maxAngularVelocity); - -#else - - if (b2Dot(b->m_linearVelocity, b->m_linearVelocity) > b2_maxLinearVelocitySquared) - { - b->m_linearVelocity.Normalize(); - b->m_linearVelocity *= b2_maxLinearVelocity; - } - if (b->m_angularVelocity * b->m_angularVelocity > b2_maxAngularVelocitySquared) - { - if (b->m_angularVelocity < 0.0f) - { - b->m_angularVelocity = -b2_maxAngularVelocity; - } - else - { - b->m_angularVelocity = b2_maxAngularVelocity; - } - } -#endif - } - b2ContactSolver contactSolver(step, m_contacts, m_contactCount, m_allocator); + // Partition contacts so that contacts with static bodies are solved last. + int32 i1 = -1; + for (int32 i2 = 0; i2 < m_contactCount; ++i2) + { + b2Fixture* fixtureA = m_contacts[i2]->GetFixtureA(); + b2Fixture* fixtureB = m_contacts[i2]->GetFixtureB(); + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + bool nonStatic = bodyA->GetType() != b2_staticBody && bodyB->GetType() != b2_staticBody; + if (nonStatic) + { + ++i1; + b2Swap(m_contacts[i1], m_contacts[i2]); + } + } // Initialize velocity constraints. - contactSolver.InitVelocityConstraints(step); - + b2ContactSolver contactSolver(m_contacts, m_contactCount, m_allocator, step.dtRatio); + contactSolver.WarmStart(); for (int32 i = 0; i < m_jointCount; ++i) { m_joints[i]->InitVelocityConstraints(step); } // Solve velocity constraints. - for (int32 i = 0; i < step.maxIterations; ++i) + for (int32 i = 0; i < step.velocityIterations; ++i) { - contactSolver.SolveVelocityConstraints(); - for (int32 j = 0; j < m_jointCount; ++j) { m_joints[j]->SolveVelocityConstraints(step); } + + contactSolver.SolveVelocityConstraints(); } // Post-solve (store impulses for warm starting). - contactSolver.FinalizeVelocityConstraints(); + contactSolver.StoreImpulses(); // Integrate positions. for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; - if (b->IsStatic()) + if (b->GetType() == b2_staticBody) + { continue; + } + + // Check for large velocities. + b2Vec2 translation = step.dt * b->m_linearVelocity; + if (b2Dot(translation, translation) > b2_maxTranslationSquared) + { + float32 ratio = b2_maxTranslation / translation.Length(); + b->m_linearVelocity *= ratio; + } + + float32 rotation = step.dt * b->m_angularVelocity; + if (rotation * rotation > b2_maxRotationSquared) + { + float32 ratio = b2_maxRotation / b2Abs(rotation); + b->m_angularVelocity *= ratio; + } // Store positions for continuous collision. b->m_sweep.c0 = b->m_sweep.c; @@ -243,31 +282,22 @@ void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool correct // Note: shapes are synchronized later. } - if (correctPositions) + // Iterate over constraints. + for (int32 i = 0; i < step.positionIterations; ++i) { - // Initialize position constraints. - // Contacts don't need initialization. + bool contactsOkay = contactSolver.SolvePositionConstraints(b2_contactBaumgarte); + + bool jointsOkay = true; for (int32 i = 0; i < m_jointCount; ++i) { - m_joints[i]->InitPositionConstraints(); + bool jointOkay = m_joints[i]->SolvePositionConstraints(b2_contactBaumgarte); + jointsOkay = jointsOkay && jointOkay; } - // Iterate over constraints. - for (m_positionIterationCount = 0; m_positionIterationCount < step.maxIterations; ++m_positionIterationCount) + if (contactsOkay && jointsOkay) { - bool contactsOkay = contactSolver.SolvePositionConstraints(b2_contactBaumgarte); - - bool jointsOkay = true; - for (int i = 0; i < m_jointCount; ++i) - { - bool jointOkay = m_joints[i]->SolvePositionConstraints(); - jointsOkay = jointsOkay && jointOkay; - } - - if (contactsOkay && jointsOkay) - { - break; - } + // Exit early if the position errors are small. + break; } } @@ -275,36 +305,28 @@ void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool correct if (allowSleep) { - float32 minSleepTime = B2_FLT_MAX; + float32 minSleepTime = b2_maxFloat; -#ifndef TARGET_FLOAT32_IS_FIXED const float32 linTolSqr = b2_linearSleepTolerance * b2_linearSleepTolerance; const float32 angTolSqr = b2_angularSleepTolerance * b2_angularSleepTolerance; -#endif for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; - if (b->m_invMass == 0.0f) + if (b->GetType() == b2_staticBody) { continue; } - if ((b->m_flags & b2Body::e_allowSleepFlag) == 0) + if ((b->m_flags & b2Body::e_autoSleepFlag) == 0) { b->m_sleepTime = 0.0f; minSleepTime = 0.0f; } - if ((b->m_flags & b2Body::e_allowSleepFlag) == 0 || -#ifdef TARGET_FLOAT32_IS_FIXED - b2Abs(b->m_angularVelocity) > b2_angularSleepTolerance || - b2Abs(b->m_linearVelocity.x) > b2_linearSleepTolerance || - b2Abs(b->m_linearVelocity.y) > b2_linearSleepTolerance) -#else + if ((b->m_flags & b2Body::e_autoSleepFlag) == 0 || b->m_angularVelocity * b->m_angularVelocity > angTolSqr || b2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr) -#endif { b->m_sleepTime = 0.0f; minSleepTime = 0.0f; @@ -321,66 +343,13 @@ void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool correct for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; - b->m_flags |= b2Body::e_sleepFlag; - b->m_linearVelocity = b2Vec2_zero; - b->m_angularVelocity = 0.0f; + b->SetAwake(false); } } } } -void b2Island::SolveTOI(const b2TimeStep& subStep) -{ - b2ContactSolver contactSolver(subStep, m_contacts, m_contactCount, m_allocator); - - // No warm starting needed for TOI events. - - // Solve velocity constraints. - for (int32 i = 0; i < subStep.maxIterations; ++i) - { - contactSolver.SolveVelocityConstraints(); - } - - // Don't store the TOI contact forces for warm starting - // because they can be quite large. - - // Integrate positions. - for (int32 i = 0; i < m_bodyCount; ++i) - { - b2Body* b = m_bodies[i]; - - if (b->IsStatic()) - continue; - - // Store positions for continuous collision. - b->m_sweep.c0 = b->m_sweep.c; - b->m_sweep.a0 = b->m_sweep.a; - - // Integrate - b->m_sweep.c += subStep.dt * b->m_linearVelocity; - b->m_sweep.a += subStep.dt * b->m_angularVelocity; - - // Compute new transform - b->SynchronizeTransform(); - - // Note: shapes are synchronized later. - } - - // Solve position constraints. - const float32 k_toiBaumgarte = 0.75f; - for (int32 i = 0; i < subStep.maxIterations; ++i) - { - bool contactsOkay = contactSolver.SolvePositionConstraints(k_toiBaumgarte); - if (contactsOkay) - { - break; - } - } - - Report(contactSolver.m_constraints); -} - -void b2Island::Report(b2ContactConstraint* constraints) +void b2Island::Report(const b2ContactConstraint* constraints) { if (m_listener == NULL) { @@ -390,31 +359,16 @@ void b2Island::Report(b2ContactConstraint* constraints) for (int32 i = 0; i < m_contactCount; ++i) { b2Contact* c = m_contacts[i]; - b2ContactConstraint* cc = constraints + i; - b2ContactResult cr; - cr.shape1 = c->GetShape1(); - cr.shape2 = c->GetShape2(); - b2Body* b1 = cr.shape1->GetBody(); - int32 manifoldCount = c->GetManifoldCount(); - b2Manifold* manifolds = c->GetManifolds(); - for (int32 j = 0; j < manifoldCount; ++j) + + const b2ContactConstraint* cc = constraints + i; + + b2ContactImpulse impulse; + for (int32 j = 0; j < cc->pointCount; ++j) { - b2Manifold* manifold = manifolds + j; - cr.normal = manifold->normal; - for (int32 k = 0; k < manifold->pointCount; ++k) - { - b2ManifoldPoint* point = manifold->points + k; - b2ContactConstraintPoint* ccp = cc->points + k; - cr.position = b1->GetWorldPoint(point->localPoint1); - - // TOI constraint results are not stored, so get - // the result from the constraint. - cr.normalImpulse = ccp->normalImpulse; - cr.tangentImpulse = ccp->tangentImpulse; - cr.id = point->id; - - m_listener->Result(&cr); - } + impulse.normalImpulses[j] = cc->points[j].normalImpulse; + impulse.tangentImpulses[j] = cc->points[j].tangentImpulse; } + + m_listener->PostSolve(c, &impulse); } } diff --git a/src/modules/physics/box2d/Source/Dynamics/b2Island.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.h similarity index 75% rename from src/modules/physics/box2d/Source/Dynamics/b2Island.h rename to src/modules/physics/box2d/Box2D/Dynamics/b2Island.h index eb62fd98e..3a5fd1131 100644 --- a/src/modules/physics/box2d/Source/Dynamics/b2Island.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,16 +19,31 @@ #ifndef B2_ISLAND_H #define B2_ISLAND_H -#include "../Common/b2Math.h" +#include +#include +#include class b2Contact; -class b2Body; class b2Joint; class b2StackAllocator; class b2ContactListener; struct b2ContactConstraint; -struct b2TimeStep; +/// This is an internal structure. +struct b2Position +{ + b2Vec2 x; + float32 a; +}; + +/// This is an internal structure. +struct b2Velocity +{ + b2Vec2 v; + float32 w; +}; + +/// This is an internal class. class b2Island { public: @@ -43,13 +58,12 @@ public: m_jointCount = 0; } - void Solve(const b2TimeStep& step, const b2Vec2& gravity, bool correctPositions, bool allowSleep); - - void SolveTOI(const b2TimeStep& subStep); + void Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep); void Add(b2Body* body) { b2Assert(m_bodyCount < m_bodyCapacity); + body->m_islandIndex = m_bodyCount; m_bodies[m_bodyCount++] = body; } @@ -65,7 +79,7 @@ public: m_joints[m_jointCount++] = joint; } - void Report(b2ContactConstraint* constraints); + void Report(const b2ContactConstraint* constraints); b2StackAllocator* m_allocator; b2ContactListener* m_listener; @@ -74,6 +88,9 @@ public: b2Contact** m_contacts; b2Joint** m_joints; + b2Position* m_positions; + b2Velocity* m_velocities; + int32 m_bodyCount; int32 m_jointCount; int32 m_contactCount; diff --git a/src/modules/physics/box2d/Source/Common/b2Settings.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h similarity index 57% rename from src/modules/physics/box2d/Source/Common/b2Settings.cpp rename to src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h index 060a810dc..f59245dd6 100644 --- a/src/modules/physics/box2d/Source/Common/b2Settings.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,36 +16,20 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2Settings.h" -#include +#ifndef B2_TIME_STEP_H +#define B2_TIME_STEP_H -b2Version b2_version = {2, 0, 1}; +#include -int32 b2_byteCount = 0; +/// 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; +}; - - -// Memory allocators. Modify these to use your own allocator. -void* b2Alloc(int32 size) -{ - size += 4; - b2_byteCount += size; - char* bytes = (char*)malloc(size); - *(int32*)bytes = size; - return bytes + 4; -} - -void b2Free(void* mem) -{ - if (mem == NULL) - { - return; - } - - char* bytes = (char*)mem; - bytes -= 4; - int32 size = *(int32*)bytes; - b2Assert(b2_byteCount >= size); - b2_byteCount -= size; - free(bytes); -} +#endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp new file mode 100644 index 000000000..d3b9e0038 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp @@ -0,0 +1,1076 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +b2World::b2World(const b2Vec2& gravity, bool doSleep) +{ + 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_allowSleep = doSleep; + m_gravity = gravity; + + m_flags = e_clearForces; + + m_inv_dt0 = 0.0f; + + m_contactManager.m_allocator = &m_blockAllocator; +} + +b2World::~b2World() +{ +} + +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(b2DebugDraw* 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 = 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->DestroyProxy(&m_contactManager.m_broadPhase); + f0->Destroy(&m_blockAllocator); + f0->~b2Fixture(); + m_blockAllocator.Free(f0, sizeof(b2Fixture)); + } + 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; + } + } +} + +// Find islands, integrate and solve constraints, solve position constraints +void b2World::Solve(const b2TimeStep& step) +{ + // 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; + } + } + + island.Solve(step, m_gravity, m_allowSleep); + + // 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); + + // 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(); +} + +// Advance a dynamic body to its first time of contact +// and adjust the position to ensure clearance. +void b2World::SolveTOI(b2Body* body) +{ + // Find the minimum contact. + b2Contact* toiContact = NULL; + float32 toi = 1.0f; + b2Body* toiOther = NULL; + bool found; + int32 count; + int32 iter = 0; + + bool bullet = body->IsBullet(); + + // Iterate until all contacts agree on the minimum TOI. We have + // to iterate because the TOI algorithm may skip some intermediate + // collisions when objects rotate through each other. + do + { + count = 0; + found = false; + for (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next) + { + if (ce->contact == toiContact) + { + continue; + } + + b2Body* other = ce->other; + b2BodyType type = other->GetType(); + + // Only bullets perform TOI with dynamic bodies. + if (bullet == true) + { + // Bullets only perform TOI with bodies that have their TOI resolved. + if ((other->m_flags & b2Body::e_toiFlag) == 0) + { + continue; + } + + // No repeated hits on non-static bodies + if (type != b2_staticBody && (ce->contact->m_flags & b2Contact::e_bulletHitFlag) != 0) + { + continue; + } + } + else if (type == b2_dynamicBody) + { + continue; + } + + // Check for a disabled contact. + b2Contact* contact = ce->contact; + if (contact->IsEnabled() == false) + { + continue; + } + + // Prevent infinite looping. + if (contact->m_toiCount > 10) + { + continue; + } + + b2Fixture* fixtureA = contact->m_fixtureA; + b2Fixture* fixtureB = contact->m_fixtureB; + + // Cull sensors. + if (fixtureA->IsSensor() || fixtureB->IsSensor()) + { + continue; + } + + b2Body* bodyA = fixtureA->m_body; + b2Body* bodyB = fixtureB->m_body; + + // Compute the time of impact in interval [0, minTOI] + b2TOIInput input; + input.proxyA.Set(fixtureA->GetShape()); + input.proxyB.Set(fixtureB->GetShape()); + input.sweepA = bodyA->m_sweep; + input.sweepB = bodyB->m_sweep; + input.tMax = toi; + + b2TOIOutput output; + b2TimeOfImpact(&output, &input); + + if (output.state == b2TOIOutput::e_touching && output.t < toi) + { + toiContact = contact; + toi = output.t; + toiOther = other; + found = true; + } + + ++count; + } + + ++iter; + } while (found && count > 1 && iter < 50); + + if (toiContact == NULL) + { + body->Advance(1.0f); + return; + } + + b2Sweep backup = body->m_sweep; + body->Advance(toi); + toiContact->Update(m_contactManager.m_contactListener); + if (toiContact->IsEnabled() == false) + { + // Contact disabled. Backup and recurse. + body->m_sweep = backup; + SolveTOI(body); + } + + ++toiContact->m_toiCount; + + // Update all the valid contacts on this body and build a contact island. + b2Contact* contacts[b2_maxTOIContacts]; + count = 0; + for (b2ContactEdge* ce = body->m_contactList; ce && count < b2_maxTOIContacts; ce = ce->next) + { + b2Body* other = ce->other; + b2BodyType type = other->GetType(); + + // Only perform correction with static bodies, so the + // body won't get pushed out of the world. + if (type == b2_dynamicBody) + { + continue; + } + + // Check for a disabled contact. + b2Contact* contact = ce->contact; + if (contact->IsEnabled() == false) + { + continue; + } + + b2Fixture* fixtureA = contact->m_fixtureA; + b2Fixture* fixtureB = contact->m_fixtureB; + + // Cull sensors. + if (fixtureA->IsSensor() || fixtureB->IsSensor()) + { + continue; + } + + // The contact likely has some new contact points. The listener + // gives the user a chance to disable the contact. + if (contact != toiContact) + { + contact->Update(m_contactManager.m_contactListener); + } + + // Did the user disable the contact? + if (contact->IsEnabled() == false) + { + // Skip this contact. + continue; + } + + if (contact->IsTouching() == false) + { + continue; + } + + contacts[count] = contact; + ++count; + } + + // Reduce the TOI body's overlap with the contact island. + b2TOISolver solver(&m_stackAllocator); + solver.Initialize(contacts, count, body); + + const float32 k_toiBaumgarte = 0.75f; + bool solved = false; + for (int32 i = 0; i < 20; ++i) + { + bool contactsOkay = solver.Solve(k_toiBaumgarte); + if (contactsOkay) + { + solved = true; + break; + } + } + + if (toiOther->GetType() != b2_staticBody) + { + toiContact->m_flags |= b2Contact::e_bulletHitFlag; + } +} + +// Sequentially solve TOIs for each body. We bring each +// body to the time of contact and perform some position correction. +// Time is not conserved. +void b2World::SolveTOI() +{ + // Prepare all contacts. + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) + { + // Enable the contact + c->m_flags |= b2Contact::e_enabledFlag; + + // Set the number of TOI events for this contact to zero. + c->m_toiCount = 0; + } + + // Initialize the TOI flag. + for (b2Body* body = m_bodyList; body; body = body->m_next) + { + // Kinematic, and static bodies will not be affected by the TOI event. + // If a body was not in an island then it did not move. + if ((body->m_flags & b2Body::e_islandFlag) == 0 || body->GetType() == b2_kinematicBody || body->GetType() == b2_staticBody) + { + body->m_flags |= b2Body::e_toiFlag; + } + else + { + body->m_flags &= ~b2Body::e_toiFlag; + } + } + + // Collide non-bullets. + for (b2Body* body = m_bodyList; body; body = body->m_next) + { + if (body->m_flags & b2Body::e_toiFlag) + { + continue; + } + + if (body->IsBullet() == true) + { + continue; + } + + SolveTOI(body); + + body->m_flags |= b2Body::e_toiFlag; + } + + // Collide bullets. + for (b2Body* body = m_bodyList; body; body = body->m_next) + { + if (body->m_flags & b2Body::e_toiFlag) + { + continue; + } + + if (body->IsBullet() == false) + { + continue; + } + + SolveTOI(body); + + body->m_flags |= b2Body::e_toiFlag; + } +} + +void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIterations) +{ + // 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. + m_contactManager.Collide(); + + // Integrate velocities, solve velocity constraints, and integrate positions. + if (step.dt > 0.0f) + { + Solve(step); + } + + // Handle TOI events. + if (m_continuousPhysics && step.dt > 0.0f) + { + SolveTOI(); + } + + if (step.dt > 0.0f) + { + m_inv_dt0 = step.inv_dt; + } + + if (m_flags & e_clearForces) + { + ClearForces(); + } + + m_flags &= ~e_locked; +} + +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) + { + b2Fixture* fixture = (b2Fixture*)broadPhase->GetUserData(proxyId); + return callback->ReportFixture(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); + b2Fixture* fixture = (b2Fixture*)userData; + b2RayCastOutput output; + bool hit = fixture->RayCast(&output, input); + + 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 = xf.R.col1; + + m_debugDraw->DrawSolidCircle(center, radius, axis, color); + } + break; + + case b2Shape::e_polygon: + { + b2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape(); + int32 vertexCount = poly->m_vertexCount; + 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; + } +} + +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.position; + b2Vec2 x2 = xf2.position; + 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 & b2DebugDraw::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 & b2DebugDraw::e_jointBit) + { + for (b2Joint* j = m_jointList; j; j = j->GetNext()) + { + DrawJoint(j); + } + } + + if (flags & b2DebugDraw::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 & b2DebugDraw::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()) + { + b2AABB aabb = bp->GetFatAABB(f->m_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 & b2DebugDraw::e_centerOfMassBit) + { + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + b2Transform xf = b->GetTransform(); + xf.position = b->GetWorldCenter(); + m_debugDraw->DrawTransform(xf); + } + } +} + +int32 b2World::GetProxyCount() const +{ + return m_contactManager.m_broadPhase.GetProxyCount(); +} diff --git a/src/modules/physics/box2d/Source/Dynamics/b2World.h b/src/modules/physics/box2d/Box2D/Dynamics/b2World.h similarity index 57% rename from src/modules/physics/box2d/Source/Dynamics/b2World.h rename to src/modules/physics/box2d/Box2D/Dynamics/b2World.h index 02c87a631..bff14272f 100644 --- a/src/modules/physics/box2d/Source/Dynamics/b2World.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2World.h @@ -1,253 +1,285 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "../Common/b2Math.h" -#include "../Common/b2BlockAllocator.h" -#include "../Common/b2StackAllocator.h" -#include "b2ContactManager.h" -#include "b2WorldCallbacks.h" - -struct b2AABB; -struct b2ShapeDef; -struct b2BodyDef; -struct b2JointDef; -class b2Body; -class b2Joint; -class b2Shape; -class b2Contact; -class b2BroadPhase; - -struct b2TimeStep -{ - float32 dt; // time step - float32 inv_dt; // inverse time step (0 if dt == 0). - float32 dtRatio; // dt * inv_dt0 - int32 maxIterations; - bool warmStarting; - bool positionCorrection; -}; - -/// 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 worldAABB a bounding box that completely encompasses all your shapes. - /// @param gravity the world gravity vector. - /// @param doSleep improve performance by not simulating inactive bodies. - b2World(const b2AABB& worldAABB, const b2Vec2& gravity, bool doSleep); - - /// Destruct the world. All physics entities are destroyed and all heap memory is released. - ~b2World(); - - /// Register a destruction listener. - void SetDestructionListener(b2DestructionListener* listener); - - /// Register a broad-phase boundary listener. - void SetBoundaryListener(b2BoundaryListener* listener); - - /// Register a contact filter to provide specific control over collision. - /// Otherwise the default filter is used (b2_defaultFilter). - void SetContactFilter(b2ContactFilter* filter); - - /// Register a contact event listener - void SetContactListener(b2ContactListener* listener); - - /// Register a routine for debug drawing. The debug draw functions are called - /// inside the b2World::Step method, so make sure your renderer is ready to - /// consume draw commands when you call Step(). - void SetDebugDraw(b2DebugDraw* 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); - - /// The world provides a single static ground body with no collision shapes. - /// You can use this to simplify the creation of joints and static shapes. - b2Body* GetGroundBody(); - - /// 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 iterations the number of iterations to be used by the constraint solver. - void Step(float32 timeStep, int32 iterations); - - /// Query the world for all shapes that potentially overlap the - /// provided AABB. You provide a shape pointer buffer of specified - /// size. The number of shapes found is returned. - /// @param aabb the query box. - /// @param shapes a user allocated shape pointer array of size maxCount (or greater). - /// @param maxCount the capacity of the shapes array. - /// @return the number of shapes found in aabb. - int32 Query(const b2AABB& aabb, b2Shape** shapes, int32 maxCount); - - /// 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(); - - /// 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(); - - /// Re-filter a shape. This re-runs contact filtering on a shape. - void Refilter(b2Shape* shape); - - /// Enable/disable warm starting. For testing. - void SetWarmStarting(bool flag) { m_warmStarting = flag; } - - /// Enable/disable position correction. For testing. - void SetPositionCorrection(bool flag) { m_positionCorrection = flag; } - - /// Enable/disable continuous physics. For testing. - void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; } - - /// Perform validation of internal data structures. - void Validate(); - - /// Get the number of broad-phase proxies. - int32 GetProxyCount() const; - - /// Get the number of broad-phase pairs. - int32 GetPairCount() const; - - /// Get the number of bodies. - int32 GetBodyCount() const; - - /// Get the number joints. - int32 GetJointCount() const; - - /// Get the number of contacts (each may have 0 or more contact points). - int32 GetContactCount() const; - - /// Change the global gravity vector. - void SetGravity(const b2Vec2& gravity); - -public: - - friend class b2Body; - friend class b2ContactManager; - - void Solve(const b2TimeStep& step); - void SolveTOI(const b2TimeStep& step); - - void DrawJoint(b2Joint* joint); - void DrawShape(b2Shape* shape, const b2XForm& xf, const b2Color& color, bool core); - void DrawDebugData(); - - b2BlockAllocator m_blockAllocator; - b2StackAllocator m_stackAllocator; - - bool m_lock; - - b2BroadPhase* m_broadPhase; - b2ContactManager m_contactManager; - - b2Body* m_bodyList; - b2Joint* m_jointList; - - // Do not access - b2Contact* m_contactList; - - int32 m_bodyCount; - int32 m_contactCount; - int32 m_jointCount; - - b2Vec2 m_gravity; - bool m_allowSleep; - - b2Body* m_groundBody; - - b2DestructionListener* m_destructionListener; - b2BoundaryListener* m_boundaryListener; - b2ContactFilter* m_contactFilter; - b2ContactListener* m_contactListener; - b2DebugDraw* m_debugDraw; - - float32 m_inv_dt0; - - int32 m_positionIterationCount; - - // This is for debugging the solver. - bool m_positionCorrection; - - // This is for debugging the solver. - bool m_warmStarting; - - // This is for debugging the solver. - bool m_continuousPhysics; -}; - -inline b2Body* b2World::GetGroundBody() -{ - return m_groundBody; -} - -inline b2Body* b2World::GetBodyList() -{ - return m_bodyList; -} - -inline b2Joint* b2World::GetJointList() -{ - return m_jointList; -} - -inline int32 b2World::GetBodyCount() const -{ - return m_bodyCount; -} - -inline int32 b2World::GetJointCount() const -{ - return m_jointCount; -} - -inline int32 b2World::GetContactCount() const -{ - return m_contactCount; -} - -inline void b2World::SetGravity(const b2Vec2& gravity) -{ - m_gravity = gravity; -} - -#endif +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as 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 + +struct b2AABB; +struct b2BodyDef; +struct b2JointDef; +struct b2TimeStep; +class b2Body; +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. + /// @param doSleep improve performance by not simulating inactive bodies. + b2World(const b2Vec2& gravity, bool doSleep); + + /// 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(b2DebugDraw* 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); + + /// Call this after you are done with time steps to clear the forces. You normally + /// call this after each call to Step, unless you are performing sub-steps. By default, + /// forces will be automatically cleared, so you don't need to call this function. + /// @see SetAutoClearForces + void ClearForces(); + + /// Call this to draw shapes and other debug draw data. + 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(); + + /// 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(); + + /// 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 + b2Contact* GetContactList(); + + /// Enable/disable warm starting. For testing. + void SetWarmStarting(bool flag) { m_warmStarting = flag; } + + /// Enable/disable continuous physics. For testing. + void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; } + + /// 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; + + /// 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; + +private: + + // m_flags + enum + { + e_newFixture = 0x0001, + e_locked = 0x0002, + e_clearForces = 0x0004, + }; + + friend class b2Body; + friend class b2ContactManager; + friend class b2Controller; + + void Solve(const b2TimeStep& step); + void SolveTOI(); + void SolveTOI(b2Body* body); + + 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; + + b2Body* m_groundBody; + + b2DestructionListener* m_destructionListener; + b2DebugDraw* m_debugDraw; + + // This is used to compute the time step ratio to + // support a variable time step. + float32 m_inv_dt0; + + // This is for debugging the solver. + bool m_warmStarting; + + // This is for debugging the solver. + bool m_continuousPhysics; +}; + +inline b2Body* b2World::GetBodyList() +{ + return m_bodyList; +} + +inline b2Joint* b2World::GetJointList() +{ + return m_jointList; +} + +inline b2Contact* b2World::GetContactList() +{ + 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; +} + +#endif diff --git a/src/modules/physics/box2d/Source/Dynamics/b2WorldCallbacks.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp similarity index 68% rename from src/modules/physics/box2d/Source/Dynamics/b2WorldCallbacks.cpp rename to src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp index 614324f63..bc5fefbdf 100644 --- a/src/modules/physics/box2d/Source/Dynamics/b2WorldCallbacks.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -16,24 +16,22 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "b2WorldCallbacks.h" -#include "../Collision/Shapes/b2Shape.h" - -b2ContactFilter b2_defaultFilter; +#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(b2Shape* shape1, b2Shape* shape2) +bool b2ContactFilter::ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB) { - const b2FilterData& filter1 = shape1->GetFilterData(); - const b2FilterData& filter2 = shape2->GetFilterData(); + const b2Filter& filterA = fixtureA->GetFilterData(); + const b2Filter& filterB = fixtureB->GetFilterData(); - if (filter1.groupIndex == filter2.groupIndex && filter1.groupIndex != 0) + if (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0) { - return filter1.groupIndex > 0; + return filterA.groupIndex > 0; } - bool collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0; + bool collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; return collide; } diff --git a/src/modules/physics/box2d/Source/Dynamics/b2WorldCallbacks.h b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h similarity index 50% rename from src/modules/physics/box2d/Source/Dynamics/b2WorldCallbacks.h rename to src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h index 5c03321de..82ee67ea0 100644 --- a/src/modules/physics/box2d/Source/Dynamics/b2WorldCallbacks.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,18 +19,19 @@ #ifndef B2_WORLD_CALLBACKS_H #define B2_WORLD_CALLBACKS_H -#include "../Common/b2Settings.h" +#include struct b2Vec2; -struct b2XForm; -class b2Shape; +struct b2Transform; +class b2Fixture; class b2Body; class b2Joint; class b2Contact; struct b2ContactPoint; struct b2ContactResult; +struct b2Manifold; -/// Joints and shapes are destroyed when their associated +/// 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 @@ -42,24 +43,11 @@ public: /// to the destruction of one of its attached bodies. virtual void SayGoodbye(b2Joint* joint) = 0; - /// Called when any shape is about to be destroyed due + /// Called when any fixture is about to be destroyed due /// to the destruction of its parent body. - virtual void SayGoodbye(b2Shape* shape) = 0; + virtual void SayGoodbye(b2Fixture* fixture) = 0; }; - -/// This is called when a body's shape passes outside of the world boundary. -class b2BoundaryListener -{ -public: - virtual ~b2BoundaryListener() {} - - /// This is called for each body that leaves the world boundary. - /// @warning you can't modify the world inside this callback. - virtual void Violation(b2Body* body) = 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 @@ -69,13 +57,19 @@ public: /// 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(b2Shape* shape1, b2Shape* shape2); + virtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB); }; -/// The default contact filter. -extern b2ContactFilter b2_defaultFilter; +/// 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]; +}; -/// Implement this class to get collision results. You can use these results for +/// 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. @@ -83,27 +77,79 @@ extern b2ContactFilter b2_defaultFilter; /// single time step. /// You should strive to make your callbacks efficient because there may be /// many callbacks per time step. -/// @warning The contact separation is the last computed value. /// @warning You cannot create/destroy Box2D entities inside these callbacks. class b2ContactListener { public: virtual ~b2ContactListener() {} - /// Called when a contact point is added. This includes the geometry - /// and the forces. - virtual void Add(const b2ContactPoint* point) { } + /// Called when two fixtures begin to touch. + virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } - /// Called when a contact point persists. This includes the geometry - /// and the forces. - virtual void Persist(const b2ContactPoint* point) { } + /// Called when two fixtures cease to touch. + virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } - /// Called when a contact point is removed. This includes the last - /// computed geometry and forces. - virtual void Remove(const b2ContactPoint* point) { } + /// 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); + } - /// Called after a contact point is solved. - virtual void Result(const b2ContactResult* point) { } + /// 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; }; /// Color for debug drawing. Each value has the range [0,1]. @@ -111,6 +157,7 @@ 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; }; @@ -127,11 +174,9 @@ public: { e_shapeBit = 0x0001, ///< draw shapes e_jointBit = 0x0002, ///< draw joint connections - e_coreShapeBit = 0x0004, ///< draw core (TOI) shapes - e_aabbBit = 0x0008, ///< draw axis aligned bounding boxes - e_obbBit = 0x0010, ///< draw oriented bounding boxes - e_pairBit = 0x0020, ///< draw broad-phase pairs - e_centerOfMassBit = 0x0040, ///< draw center of mass frame + 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. @@ -163,7 +208,7 @@ public: /// Draw a transform. Choose your own length scale. /// @param xf a transform. - virtual void DrawXForm(const b2XForm& xf) = 0; + virtual void DrawTransform(const b2Transform& xf) = 0; protected: uint32 m_drawFlags; diff --git a/src/modules/physics/box2d/Contact.h b/src/modules/physics/box2d/Contact.h index 7f1972850..c5e8aa292 100644 --- a/src/modules/physics/box2d/Contact.h +++ b/src/modules/physics/box2d/Contact.h @@ -27,7 +27,7 @@ #include "World.h" // Box2D -#include "Include/Box2D.h" +#include namespace love { diff --git a/src/modules/physics/box2d/Include/Box2D.h b/src/modules/physics/box2d/Include/Box2D.h deleted file mode 100644 index a49a3cd27..000000000 --- a/src/modules/physics/box2d/Include/Box2D.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 tutorials please see http://www.box2d.org/manual.html - -For discussion please visit http://www.box2d.org/forum -*/ - -// These include files constitute the main Box2D API - -#include "../Source/Common/b2Settings.h" - -#include "../Source/Collision/Shapes/b2CircleShape.h" -#include "../Source/Collision/Shapes/b2PolygonShape.h" -#include "../Source/Collision/b2BroadPhase.h" -#include "../Source/Dynamics/b2WorldCallbacks.h" -#include "../Source/Dynamics/b2World.h" -#include "../Source/Dynamics/b2Body.h" - -#include "../Source/Dynamics/Contacts/b2Contact.h" - -#include "../Source/Dynamics/Joints/b2DistanceJoint.h" -#include "../Source/Dynamics/Joints/b2MouseJoint.h" -#include "../Source/Dynamics/Joints/b2PrismaticJoint.h" -#include "../Source/Dynamics/Joints/b2RevoluteJoint.h" -#include "../Source/Dynamics/Joints/b2PulleyJoint.h" -#include "../Source/Dynamics/Joints/b2GearJoint.h" - -#endif diff --git a/src/modules/physics/box2d/Joint.h b/src/modules/physics/box2d/Joint.h index b1396e3f5..6393f0dcb 100644 --- a/src/modules/physics/box2d/Joint.h +++ b/src/modules/physics/box2d/Joint.h @@ -26,7 +26,7 @@ #include // Box2D -#include "Include/Box2D.h" +#include namespace love { diff --git a/src/modules/physics/box2d/Shape.h b/src/modules/physics/box2d/Shape.h index c1902a9c3..254465167 100644 --- a/src/modules/physics/box2d/Shape.h +++ b/src/modules/physics/box2d/Shape.h @@ -27,7 +27,7 @@ #include // Box2D -#include "Include/Box2D.h" +#include namespace love { diff --git a/src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.cpp b/src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.cpp deleted file mode 100644 index 1a3ebe79b..000000000 --- a/src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2CircleShape.h" - -b2CircleShape::b2CircleShape(const b2ShapeDef* def) -: b2Shape(def) -{ - b2Assert(def->type == e_circleShape); - const b2CircleDef* circleDef = (const b2CircleDef*)def; - - m_type = e_circleShape; - m_localPosition = circleDef->localPosition; - m_radius = circleDef->radius; -} - -void b2CircleShape::UpdateSweepRadius(const b2Vec2& center) -{ - // Update the sweep radius (maximum radius) as measured from - // a local center point. - b2Vec2 d = m_localPosition - center; - m_sweepRadius = d.Length() + m_radius - b2_toiSlop; -} - -bool b2CircleShape::TestPoint(const b2XForm& transform, const b2Vec2& p) const -{ - b2Vec2 center = transform.position + b2Mul(transform.R, m_localPosition); - 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::TestSegment(const b2XForm& transform, - float32* lambda, - b2Vec2* normal, - const b2Segment& segment, - float32 maxLambda) const -{ - b2Vec2 position = transform.position + b2Mul(transform.R, m_localPosition); - b2Vec2 s = segment.p1 - position; - float32 b = b2Dot(s, s) - m_radius * m_radius; - - // Does the segment start inside the circle? - if (b < 0.0f) - { - return false; - } - - // Solve quadratic equation. - b2Vec2 r = segment.p2 - segment.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_FLT_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 <= maxLambda * rr) - { - a /= rr; - *lambda = a; - *normal = s + a * r; - normal->Normalize(); - return true; - } - - return false; -} - -void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2XForm& transform) const -{ - b2Vec2 p = transform.position + b2Mul(transform.R, m_localPosition); - aabb->lowerBound.Set(p.x - m_radius, p.y - m_radius); - aabb->upperBound.Set(p.x + m_radius, p.y + m_radius); -} - -void b2CircleShape::ComputeSweptAABB(b2AABB* aabb, const b2XForm& transform1, const b2XForm& transform2) const -{ - b2Vec2 p1 = transform1.position + b2Mul(transform1.R, m_localPosition); - b2Vec2 p2 = transform2.position + b2Mul(transform2.R, m_localPosition); - b2Vec2 lower = b2Min(p1, p2); - b2Vec2 upper = b2Max(p1, p2); - - aabb->lowerBound.Set(lower.x - m_radius, lower.y - m_radius); - aabb->upperBound.Set(upper.x + m_radius, upper.y + m_radius); -} - -void b2CircleShape::ComputeMass(b2MassData* massData) const -{ - massData->mass = m_density * b2_pi * m_radius * m_radius; - massData->center = m_localPosition; - - // inertia about the local origin - massData->I = massData->mass * (0.5f * m_radius * m_radius + b2Dot(m_localPosition, m_localPosition)); -} diff --git a/src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.h b/src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.h deleted file mode 100644 index f05d64276..000000000 --- a/src/modules/physics/box2d/Source/Collision/Shapes/b2CircleShape.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Shape.h" - -/// This structure is used to build circle shapes. -struct b2CircleDef : public b2ShapeDef -{ - b2CircleDef() - { - type = e_circleShape; - localPosition.SetZero(); - radius = 1.0f; - } - - b2Vec2 localPosition; - float32 radius; -}; - -/// A circle shape. -class b2CircleShape : public b2Shape -{ -public: - /// @see b2Shape::TestPoint - bool TestPoint(const b2XForm& transform, const b2Vec2& p) const; - - /// @see b2Shape::TestSegment - bool TestSegment( const b2XForm& transform, - float32* lambda, - b2Vec2* normal, - const b2Segment& segment, - float32 maxLambda) const; - - /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2XForm& transform) const; - - /// @see b2Shape::ComputeSweptAABB - void ComputeSweptAABB( b2AABB* aabb, - const b2XForm& transform1, - const b2XForm& transform2) const; - - /// @see b2Shape::ComputeMass - void ComputeMass(b2MassData* massData) const; - - /// Get the local position of this circle in its parent body. - const b2Vec2& GetLocalPosition() const; - - /// Get the radius of this circle. - float32 GetRadius() const; - -private: - - friend class b2Shape; - - b2CircleShape(const b2ShapeDef* def); - - void UpdateSweepRadius(const b2Vec2& center); - - // Local position in parent body - b2Vec2 m_localPosition; - float32 m_radius; -}; - -inline const b2Vec2& b2CircleShape::GetLocalPosition() const -{ - return m_localPosition; -} - -inline float32 b2CircleShape::GetRadius() const -{ - return m_radius; -} - -#endif diff --git a/src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.cpp b/src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.cpp deleted file mode 100644 index 75ca1970e..000000000 --- a/src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.cpp +++ /dev/null @@ -1,449 +0,0 @@ - -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2PolygonShape.h" - -void b2PolygonDef::SetAsBox(float32 hx, float32 hy) -{ - vertexCount = 4; - vertices[0].Set(-hx, -hy); - vertices[1].Set( hx, -hy); - vertices[2].Set( hx, hy); - vertices[3].Set(-hx, hy); -} - -void b2PolygonDef::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle) -{ - SetAsBox(hx, hy); - b2XForm xf; - xf.position = center; - xf.R.Set(angle); - - for (int32 i = 0; i < vertexCount; ++i) - { - vertices[i] = b2Mul(xf, vertices[i]); - } -} - -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_FLT_EPSILON); - c *= 1.0f / area; - return c; -} - -// http://www.geometrictools.com/Documentation/MinimumAreaRectangle.pdf -static void ComputeOBB(b2OBB* obb, const b2Vec2* vs, int32 count) -{ - b2Assert(count <= b2_maxPolygonVertices); - b2Vec2 p[b2_maxPolygonVertices + 1]; - for (int32 i = 0; i < count; ++i) - { - p[i] = vs[i]; - } - p[count] = p[0]; - - float32 minArea = B2_FLT_MAX; - - for (int32 i = 1; i <= count; ++i) - { - b2Vec2 root = p[i-1]; - b2Vec2 ux = p[i] - root; - float32 length = ux.Normalize(); - b2Assert(length > B2_FLT_EPSILON); - b2Vec2 uy(-ux.y, ux.x); - b2Vec2 lower(B2_FLT_MAX, B2_FLT_MAX); - b2Vec2 upper(-B2_FLT_MAX, -B2_FLT_MAX); - - for (int32 j = 0; j < count; ++j) - { - b2Vec2 d = p[j] - root; - b2Vec2 r; - r.x = b2Dot(ux, d); - r.y = b2Dot(uy, d); - lower = b2Min(lower, r); - upper = b2Max(upper, r); - } - - float32 area = (upper.x - lower.x) * (upper.y - lower.y); - if (area < 0.95f * minArea) - { - minArea = area; - obb->R.col1 = ux; - obb->R.col2 = uy; - b2Vec2 center = 0.5f * (lower + upper); - obb->center = root + b2Mul(obb->R, center); - obb->extents = 0.5f * (upper - lower); - } - } - - b2Assert(minArea < B2_FLT_MAX); -} - -b2PolygonShape::b2PolygonShape(const b2ShapeDef* def) - : b2Shape(def) -{ - b2Assert(def->type == e_polygonShape); - m_type = e_polygonShape; - const b2PolygonDef* poly = (const b2PolygonDef*)def; - - // Get the vertices transformed into the body frame. - m_vertexCount = poly->vertexCount; - b2Assert(3 <= m_vertexCount && m_vertexCount <= b2_maxPolygonVertices); - - // Copy vertices. - for (int32 i = 0; i < m_vertexCount; ++i) - { - m_vertices[i] = poly->vertices[i]; - } - - // Compute normals. Ensure the edges have non-zero length. - for (int32 i = 0; i < m_vertexCount; ++i) - { - int32 i1 = i; - int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; - b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; - b2Assert(edge.LengthSquared() > B2_FLT_EPSILON * B2_FLT_EPSILON); - m_normals[i] = b2Cross(edge, 1.0f); - m_normals[i].Normalize(); - } - -#ifdef _DEBUG - // Ensure the polygon is convex. - for (int32 i = 0; i < m_vertexCount; ++i) - { - for (int32 j = 0; j < m_vertexCount; ++j) - { - // Don't check vertices on the current edge. - if (j == i || j == (i + 1) % m_vertexCount) - { - continue; - } - - // Your polygon is non-convex (it has an indentation). - // Or your polygon is too skinny. - float32 s = b2Dot(m_normals[i], m_vertices[j] - m_vertices[i]); - b2Assert(s < -b2_linearSlop); - } - } - - // Ensure the polygon is counter-clockwise. - for (int32 i = 1; i < m_vertexCount; ++i) - { - float32 cross = b2Cross(m_normals[i-1], m_normals[i]); - - // Keep asinf happy. - cross = b2Clamp(cross, -1.0f, 1.0f); - - // You have consecutive edges that are almost parallel on your polygon. - float32 angle = asinf(cross); - b2Assert(angle > b2_angularSlop); - } -#endif - - // Compute the polygon centroid. - m_centroid = ComputeCentroid(poly->vertices, poly->vertexCount); - - // Compute the oriented bounding box. - ComputeOBB(&m_obb, m_vertices, m_vertexCount); - - // Create core polygon shape by shifting edges inward. - // Also compute the min/max radius for CCD. - for (int32 i = 0; i < m_vertexCount; ++i) - { - int32 i1 = i - 1 >= 0 ? i - 1 : m_vertexCount - 1; - int32 i2 = i; - - b2Vec2 n1 = m_normals[i1]; - b2Vec2 n2 = m_normals[i2]; - b2Vec2 v = m_vertices[i] - m_centroid;; - - b2Vec2 d; - d.x = b2Dot(n1, v) - b2_toiSlop; - d.y = b2Dot(n2, v) - b2_toiSlop; - - // Shifting the edge inward by b2_toiSlop should - // not cause the plane to pass the centroid. - - // Your shape has a radius/extent less than b2_toiSlop. - b2Assert(d.x >= 0.0f); - b2Assert(d.y >= 0.0f); - b2Mat22 A; - A.col1.x = n1.x; A.col2.x = n1.y; - A.col1.y = n2.x; A.col2.y = n2.y; - m_coreVertices[i] = A.Solve(d) + m_centroid; - } -} - -void b2PolygonShape::UpdateSweepRadius(const b2Vec2& center) -{ - // Update the sweep radius (maximum radius) as measured from - // a local center point. - m_sweepRadius = 0.0f; - for (int32 i = 0; i < m_vertexCount; ++i) - { - b2Vec2 d = m_coreVertices[i] - center; - m_sweepRadius = b2Max(m_sweepRadius, d.Length()); - } -} - -bool b2PolygonShape::TestPoint(const b2XForm& xf, const b2Vec2& p) const -{ - b2Vec2 pLocal = b2MulT(xf.R, p - xf.position); - - for (int32 i = 0; i < m_vertexCount; ++i) - { - float32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]); - if (dot > 0.0f) - { - return false; - } - } - - return true; -} - -bool b2PolygonShape::TestSegment( - const b2XForm& xf, - float32* lambda, - b2Vec2* normal, - const b2Segment& segment, - float32 maxLambda) const -{ - float32 lower = 0.0f, upper = maxLambda; - - b2Vec2 p1 = b2MulT(xf.R, segment.p1 - xf.position); - b2Vec2 p2 = b2MulT(xf.R, segment.p2 - xf.position); - b2Vec2 d = p2 - p1; - int32 index = -1; - - for (int32 i = 0; i < m_vertexCount; ++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); - - // 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; - } - - if (upper < lower) - { - return false; - } - } - - b2Assert(0.0f <= lower && lower <= maxLambda); - - if (index >= 0) - { - *lambda = lower; - *normal = b2Mul(xf.R, m_normals[index]); - return true; - } - - return false; -} - -void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2XForm& xf) const -{ - b2Mat22 R = b2Mul(xf.R, m_obb.R); - b2Mat22 absR = b2Abs(R); - b2Vec2 h = b2Mul(absR, m_obb.extents); - b2Vec2 position = xf.position + b2Mul(xf.R, m_obb.center); - aabb->lowerBound = position - h; - aabb->upperBound = position + h; -} - -void b2PolygonShape::ComputeSweptAABB(b2AABB* aabb, - const b2XForm& transform1, - const b2XForm& transform2) const -{ - b2AABB aabb1, aabb2; - ComputeAABB(&aabb1, transform1); - ComputeAABB(&aabb2, transform2); - aabb->lowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound); - aabb->upperBound = b2Max(aabb1.upperBound, aabb2.upperBound); -} - -void b2PolygonShape::ComputeMass(b2MassData* massData) 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_vertexCount >= 3); - - b2Vec2 center; center.Set(0.0f, 0.0f); - float32 area = 0.0f; - float32 I = 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 < m_vertexCount; ++i) - { - pRef += m_vertices[i]; - } - pRef *= 1.0f / count; -#endif - - const float32 k_inv3 = 1.0f / 3.0f; - - for (int32 i = 0; i < m_vertexCount; ++i) - { - // Triangle vertices. - b2Vec2 p1 = pRef; - b2Vec2 p2 = m_vertices[i]; - b2Vec2 p3 = i + 1 < m_vertexCount ? m_vertices[i+1] : m_vertices[0]; - - b2Vec2 e1 = p2 - p1; - b2Vec2 e2 = p3 - p1; - - float32 D = b2Cross(e1, e2); - - float32 triangleArea = 0.5f * D; - area += triangleArea; - - // Area weighted centroid - center += triangleArea * k_inv3 * (p1 + p2 + p3); - - float32 px = p1.x, py = p1.y; - float32 ex1 = e1.x, ey1 = e1.y; - float32 ex2 = e2.x, ey2 = e2.y; - - float32 intx2 = k_inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; - float32 inty2 = k_inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; - - I += D * (intx2 + inty2); - } - - // Total mass - massData->mass = m_density * area; - - // Center of mass - b2Assert(area > B2_FLT_EPSILON); - center *= 1.0f / area; - massData->center = center; - - // Inertia tensor relative to the local origin. - massData->I = m_density * I; -} - -b2Vec2 b2PolygonShape::Centroid(const b2XForm& xf) const -{ - return b2Mul(xf, m_centroid); -} - -b2Vec2 b2PolygonShape::Support(const b2XForm& xf, const b2Vec2& d) const -{ - b2Vec2 dLocal = b2MulT(xf.R, d); - - int32 bestIndex = 0; - float32 bestValue = b2Dot(m_coreVertices[0], dLocal); - for (int32 i = 1; i < m_vertexCount; ++i) - { - float32 value = b2Dot(m_coreVertices[i], dLocal); - if (value > bestValue) - { - bestIndex = i; - bestValue = value; - } - } - - return b2Mul(xf, m_coreVertices[bestIndex]); -} diff --git a/src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.h b/src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.h deleted file mode 100644 index 238614e2a..000000000 --- a/src/modules/physics/box2d/Source/Collision/Shapes/b2PolygonShape.h +++ /dev/null @@ -1,163 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Shape.h" - -/// Convex polygon. The vertices must be in CCW order for a right-handed -/// coordinate system with the z-axis coming out of the screen. -struct b2PolygonDef : public b2ShapeDef -{ - b2PolygonDef() - { - type = e_polygonShape; - vertexCount = 0; - } - - /// Build vertices to represent an axis-aligned box. - /// @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); - - /// The polygon vertices in local coordinates. - b2Vec2 vertices[b2_maxPolygonVertices]; - - /// The number of polygon vertices. - int32 vertexCount; -}; - - -/// A convex polygon. -class b2PolygonShape : public b2Shape -{ -public: - /// @see b2Shape::TestPoint - bool TestPoint(const b2XForm& transform, const b2Vec2& p) const; - - /// @see b2Shape::TestSegment - bool TestSegment( const b2XForm& transform, - float32* lambda, - b2Vec2* normal, - const b2Segment& segment, - float32 maxLambda) const; - - /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2XForm& transform) const; - - /// @see b2Shape::ComputeSweptAABB - void ComputeSweptAABB( b2AABB* aabb, - const b2XForm& transform1, - const b2XForm& transform2) const; - - /// @see b2Shape::ComputeMass - void ComputeMass(b2MassData* massData) const; - - /// Get the oriented bounding box relative to the parent body. - const b2OBB& GetOBB() const; - - /// Get local centroid relative to the parent body. - const b2Vec2& GetCentroid() const; - - /// Get the vertex count. - int32 GetVertexCount() const; - - /// Get the vertices in local coordinates. - const b2Vec2* GetVertices() const; - - /// Get the core vertices in local coordinates. These vertices - /// represent a smaller polygon that is used for time of impact - /// computations. - const b2Vec2* GetCoreVertices() const; - - /// Get the edge normal vectors. There is one for each vertex. - const b2Vec2* GetNormals() const; - - /// Get the first vertex and apply the supplied transform. - b2Vec2 GetFirstVertex(const b2XForm& xf) const; - - /// Get the centroid and apply the supplied transform. - b2Vec2 Centroid(const b2XForm& xf) const; - - /// Get the support point in the given world direction. - /// Use the supplied transform. - b2Vec2 Support(const b2XForm& xf, const b2Vec2& d) const; - -private: - - friend class b2Shape; - - b2PolygonShape(const b2ShapeDef* def); - - void UpdateSweepRadius(const b2Vec2& center); - - // Local position of the polygon centroid. - b2Vec2 m_centroid; - - b2OBB m_obb; - - b2Vec2 m_vertices[b2_maxPolygonVertices]; - b2Vec2 m_normals[b2_maxPolygonVertices]; - b2Vec2 m_coreVertices[b2_maxPolygonVertices]; - int32 m_vertexCount; -}; - -inline b2Vec2 b2PolygonShape::GetFirstVertex(const b2XForm& xf) const -{ - return b2Mul(xf, m_coreVertices[0]); -} - -inline const b2OBB& b2PolygonShape::GetOBB() const -{ - return m_obb; -} - -inline const b2Vec2& b2PolygonShape::GetCentroid() const -{ - return m_centroid; -} - -inline int32 b2PolygonShape::GetVertexCount() const -{ - return m_vertexCount; -} - -inline const b2Vec2* b2PolygonShape::GetVertices() const -{ - return m_vertices; -} - -inline const b2Vec2* b2PolygonShape::GetCoreVertices() const -{ - return m_coreVertices; -} - -inline const b2Vec2* b2PolygonShape::GetNormals() const -{ - return m_normals; -} - -#endif diff --git a/src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.cpp b/src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.cpp deleted file mode 100644 index 618c7ee5c..000000000 --- a/src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Shape.h" -#include "b2CircleShape.h" -#include "b2PolygonShape.h" -#include "../b2Collision.h" -#include "../b2BroadPhase.h" -#include "../../Common/b2BlockAllocator.h" - -#include - -b2Shape* b2Shape::Create(const b2ShapeDef* def, b2BlockAllocator* allocator) -{ - switch (def->type) - { - case e_circleShape: - { - void* mem = allocator->Allocate(sizeof(b2CircleShape)); - return new (mem) b2CircleShape(def); - } - - case e_polygonShape: - { - void* mem = allocator->Allocate(sizeof(b2PolygonShape)); - return new (mem) b2PolygonShape(def); - } - - default: - b2Assert(false); - return NULL; - } -} - -void b2Shape::Destroy(b2Shape* s, b2BlockAllocator* allocator) -{ - switch (s->GetType()) - { - case e_circleShape: - s->~b2Shape(); - allocator->Free(s, sizeof(b2CircleShape)); - break; - - case e_polygonShape: - s->~b2Shape(); - allocator->Free(s, sizeof(b2PolygonShape)); - break; - - default: - b2Assert(false); - } -} - -b2Shape::b2Shape(const b2ShapeDef* def) -{ - m_userData = def->userData; - m_friction = def->friction; - m_restitution = def->restitution; - m_density = def->density; - m_body = NULL; - m_sweepRadius = 0.0f; - - m_next = NULL; - - m_proxyId = b2_nullProxy; - - m_filter = def->filter; - - m_isSensor = def->isSensor; -} - -b2Shape::~b2Shape() -{ - b2Assert(m_proxyId == b2_nullProxy); -} - -void b2Shape::CreateProxy(b2BroadPhase* broadPhase, const b2XForm& transform) -{ - b2Assert(m_proxyId == b2_nullProxy); - - b2AABB aabb; - ComputeAABB(&aabb, transform); - - bool inRange = broadPhase->InRange(aabb); - - // You are creating a shape outside the world box. - b2Assert(inRange); - - if (inRange) - { - m_proxyId = broadPhase->CreateProxy(aabb, this); - } - else - { - m_proxyId = b2_nullProxy; - } -} - -void b2Shape::DestroyProxy(b2BroadPhase* broadPhase) -{ - if (m_proxyId != b2_nullProxy) - { - broadPhase->DestroyProxy(m_proxyId); - m_proxyId = b2_nullProxy; - } -} - -bool b2Shape::Synchronize(b2BroadPhase* broadPhase, const b2XForm& transform1, const b2XForm& transform2) -{ - if (m_proxyId == b2_nullProxy) - { - return false; - } - - // Compute an AABB that covers the swept shape (may miss some rotation effect). - b2AABB aabb; - ComputeSweptAABB(&aabb, transform1, transform2); - - if (broadPhase->InRange(aabb)) - { - broadPhase->MoveProxy(m_proxyId, aabb); - return true; - } - else - { - return false; - } -} - -void b2Shape::RefilterProxy(b2BroadPhase* broadPhase, const b2XForm& transform) -{ - if (m_proxyId == b2_nullProxy) - { - return; - } - - broadPhase->DestroyProxy(m_proxyId); - - b2AABB aabb; - ComputeAABB(&aabb, transform); - - bool inRange = broadPhase->InRange(aabb); - - if (inRange) - { - m_proxyId = broadPhase->CreateProxy(aabb, this); - } - else - { - m_proxyId = b2_nullProxy; - } -} diff --git a/src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.h b/src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.h deleted file mode 100644 index fdc431e87..000000000 --- a/src/modules/physics/box2d/Source/Collision/Shapes/b2Shape.h +++ /dev/null @@ -1,286 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "../../Common/b2Math.h" -#include "../b2Collision.h" - -class b2BlockAllocator; -class b2Body; -class b2BroadPhase; - -/// 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. - float32 I; -}; - -/// This holds contact filtering data. -struct b2FilterData -{ - /// 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; -}; - -/// The various collision shape types supported by Box2D. -enum b2ShapeType -{ - e_unknownShape = -1, - e_circleShape, - e_polygonShape, - e_shapeTypeCount, -}; - -/// A shape definition is used to construct a shape. This class defines an -/// abstract shape definition. You can reuse shape definitions safely. -struct b2ShapeDef -{ - /// The constructor sets the default shape definition values. - b2ShapeDef() - { - type = e_unknownShape; - userData = NULL; - friction = 0.2f; - restitution = 0.0f; - density = 0.0f; - filter.categoryBits = 0x0001; - filter.maskBits = 0xFFFF; - filter.groupIndex = 0; - isSensor = false; - } - - virtual ~b2ShapeDef() {} - - /// Holds the shape type for down-casting. - b2ShapeType type; - - /// Use this to store application specify shape data. - void* userData; - - /// The shape's friction coefficient, usually in the range [0,1]. - float32 friction; - - /// The shape's restitution (elasticity) usually in the range [0,1]. - float32 restitution; - - /// The shape's 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. - b2FilterData filter; -}; - -/// A shape is used for collision detection. Shapes are created in b2World. -/// You can use shape for collision detection before they are attached to the world. -/// @warning you cannot reuse shapes. -class b2Shape -{ -public: - /// Get the type of this shape. You can use this to down cast to the concrete shape. - /// @return the shape type. - b2ShapeType GetType() const; - - /// Is this shape a sensor (non-solid)? - /// @return the true if the shape is a sensor. - bool IsSensor() const; - - /// Set the contact filtering data. You must call b2World::Refilter to correct - /// existing contacts/non-contacts. - void SetFilterData(const b2FilterData& filter); - - /// Get the contact filtering data. - const b2FilterData& GetFilterData() const; - - /// Get the parent body of this shape. This is NULL if the shape is not attached. - /// @return the parent body. - b2Body* GetBody(); - - /// Get the next shape in the parent body's shape list. - /// @return the next shape. - b2Shape* GetNext(); - - /// Get the user data that was assigned in the shape definition. Use this to - /// store your application specific data. - void* GetUserData(); - - /// Set the user data. Use this to store your application specific data. - void SetUserData(void* data); - - /// 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 b2XForm& xf, const b2Vec2& p) const = 0; - - /// Perform a ray cast against this shape. - /// @param xf the shape world transform. - /// @param lambda returns the hit fraction. You can use this to compute the contact point - /// p = (1 - lambda) * segment.p1 + lambda * segment.p2. - /// @param normal returns the normal at the contact point. If there is no intersection, the normal - /// is not set. - /// @param segment defines the begin and end point of the ray cast. - /// @param maxLambda a number typically in the range [0,1]. - /// @return true if there was an intersection. - virtual bool TestSegment( const b2XForm& xf, - float32* lambda, - b2Vec2* normal, - const b2Segment& segment, - float32 maxLambda) const = 0; - - /// Given a transform, compute the associated axis aligned bounding box for this shape. - /// @param aabb returns the axis aligned box. - /// @param xf the world transform of the shape. - virtual void ComputeAABB(b2AABB* aabb, const b2XForm& xf) const = 0; - - /// Given two transforms, compute the associated swept axis aligned bounding box for this shape. - /// @param aabb returns the axis aligned box. - /// @param xf1 the starting shape world transform. - /// @param xf2 the ending shape world transform. - virtual void ComputeSweptAABB( b2AABB* aabb, - const b2XForm& xf1, - const b2XForm& xf2) const = 0; - - /// Compute the mass properties of this shape using its dimensions and density. - /// The inertia tensor is computed about the local origin, not the centroid. - /// @param massData returns the mass data for this shape. - virtual void ComputeMass(b2MassData* massData) const = 0; - - /// Get the maximum radius about the parent body's center of mass. - float32 GetSweepRadius() const; - - /// Get the coefficient of friction. - float32 GetFriction() const; - - /// Get the coefficient of restitution. - float32 GetRestitution() const; - - float32 m_density; - float32 m_friction; - float32 m_restitution; - bool m_isSensor; - -protected: - - friend class b2Body; - friend class b2World; - - static b2Shape* Create(const b2ShapeDef* def, b2BlockAllocator* allocator); - static void Destroy(b2Shape* shape, b2BlockAllocator* allocator); - - b2Shape(const b2ShapeDef* def); - virtual ~b2Shape(); - - void CreateProxy(b2BroadPhase* broadPhase, const b2XForm& xf); - void DestroyProxy(b2BroadPhase* broadPhase); - bool Synchronize(b2BroadPhase* broadPhase, const b2XForm& xf1, const b2XForm& xf2); - void RefilterProxy(b2BroadPhase* broadPhase, const b2XForm& xf); - - virtual void UpdateSweepRadius(const b2Vec2& center) = 0; - - b2ShapeType m_type; - b2Shape* m_next; - b2Body* m_body; - - // Sweep radius relative to the parent body's center of mass. - float32 m_sweepRadius; - - uint16 m_proxyId; - b2FilterData m_filter; - - - - void* m_userData; -}; - -inline b2ShapeType b2Shape::GetType() const -{ - return m_type; -} - -inline bool b2Shape::IsSensor() const -{ - return m_isSensor; -} - -inline void b2Shape::SetFilterData(const b2FilterData& filter) -{ - m_filter = filter; -} - -inline const b2FilterData& b2Shape::GetFilterData() const -{ - return m_filter; -} - -inline void* b2Shape::GetUserData() -{ - return m_userData; -} - -inline void b2Shape::SetUserData(void* data) -{ - m_userData = data; -} - -inline b2Body* b2Shape::GetBody() -{ - return m_body; -} - -inline b2Shape* b2Shape::GetNext() -{ - return m_next; -} - -inline float32 b2Shape::GetSweepRadius() const -{ - return m_sweepRadius; -} - -inline float32 b2Shape::GetFriction() const -{ - return m_friction; -} - -inline float32 b2Shape::GetRestitution() const -{ - return m_restitution; -} - -#endif diff --git a/src/modules/physics/box2d/Source/Collision/b2BroadPhase.cpp b/src/modules/physics/box2d/Source/Collision/b2BroadPhase.cpp deleted file mode 100644 index ab2092130..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2BroadPhase.cpp +++ /dev/null @@ -1,668 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2BroadPhase.h" -#include -#include - -// Notes: -// - we use bound arrays instead of linked lists for cache coherence. -// - we use quantized integral values for fast compares. -// - we use short indices rather than pointers to save memory. -// - we use a stabbing count for fast overlap queries (less than order N). -// - we also use a time stamp on each proxy to speed up the registration of -// overlap query results. -// - where possible, we compare bound indices instead of values to reduce -// cache misses (TODO_ERIN). -// - no broadphase is perfect and neither is this one: it is not great for huge -// worlds (use a multi-SAP instead), it is not great for large objects. - -bool b2BroadPhase::s_validate = false; - -struct b2BoundValues -{ - uint16 lowerValues[2]; - uint16 upperValues[2]; -}; - -static int32 BinarySearch(b2Bound* bounds, int32 count, uint16 value) -{ - int32 low = 0; - int32 high = count - 1; - while (low <= high) - { - int32 mid = (low + high) >> 1; - if (bounds[mid].value > value) - { - high = mid - 1; - } - else if (bounds[mid].value < value) - { - low = mid + 1; - } - else - { - return (uint16)mid; - } - } - - return low; -} - -b2BroadPhase::b2BroadPhase(const b2AABB& worldAABB, b2PairCallback* callback) -{ - m_pairManager.Initialize(this, callback); - - b2Assert(worldAABB.IsValid()); - m_worldAABB = worldAABB; - m_proxyCount = 0; - - b2Vec2 d = worldAABB.upperBound - worldAABB.lowerBound; - m_quantizationFactor.x = float32(B2BROADPHASE_MAX) / d.x; - m_quantizationFactor.y = float32(B2BROADPHASE_MAX) / d.y; - - for (uint16 i = 0; i < b2_maxProxies - 1; ++i) - { - m_proxyPool[i].SetNext(i + 1); - m_proxyPool[i].timeStamp = 0; - m_proxyPool[i].overlapCount = b2_invalid; - m_proxyPool[i].userData = NULL; - } - m_proxyPool[b2_maxProxies-1].SetNext(b2_nullProxy); - m_proxyPool[b2_maxProxies-1].timeStamp = 0; - m_proxyPool[b2_maxProxies-1].overlapCount = b2_invalid; - m_proxyPool[b2_maxProxies-1].userData = NULL; - m_freeProxy = 0; - - m_timeStamp = 1; - m_queryResultCount = 0; -} - -b2BroadPhase::~b2BroadPhase() -{ -} - -// This one is only used for validation. -bool b2BroadPhase::TestOverlap(b2Proxy* p1, b2Proxy* p2) -{ - for (int32 axis = 0; axis < 2; ++axis) - { - b2Bound* bounds = m_bounds[axis]; - - b2Assert(p1->lowerBounds[axis] < 2 * m_proxyCount); - b2Assert(p1->upperBounds[axis] < 2 * m_proxyCount); - b2Assert(p2->lowerBounds[axis] < 2 * m_proxyCount); - b2Assert(p2->upperBounds[axis] < 2 * m_proxyCount); - - if (bounds[p1->lowerBounds[axis]].value > bounds[p2->upperBounds[axis]].value) - return false; - - if (bounds[p1->upperBounds[axis]].value < bounds[p2->lowerBounds[axis]].value) - return false; - } - - return true; -} - -bool b2BroadPhase::TestOverlap(const b2BoundValues& b, b2Proxy* p) -{ - for (int32 axis = 0; axis < 2; ++axis) - { - b2Bound* bounds = m_bounds[axis]; - - b2Assert(p->lowerBounds[axis] < 2 * m_proxyCount); - b2Assert(p->upperBounds[axis] < 2 * m_proxyCount); - - if (b.lowerValues[axis] > bounds[p->upperBounds[axis]].value) - return false; - - if (b.upperValues[axis] < bounds[p->lowerBounds[axis]].value) - return false; - } - - return true; -} - -void b2BroadPhase::ComputeBounds(uint16* lowerValues, uint16* upperValues, const b2AABB& aabb) -{ - b2Assert(aabb.upperBound.x > aabb.lowerBound.x); - b2Assert(aabb.upperBound.y > aabb.lowerBound.y); - - b2Vec2 minVertex = b2Clamp(aabb.lowerBound, m_worldAABB.lowerBound, m_worldAABB.upperBound); - b2Vec2 maxVertex = b2Clamp(aabb.upperBound, m_worldAABB.lowerBound, m_worldAABB.upperBound); - - // Bump lower bounds downs and upper bounds up. This ensures correct sorting of - // lower/upper bounds that would have equal values. - // TODO_ERIN implement fast float to uint16 conversion. - lowerValues[0] = (uint16)(m_quantizationFactor.x * (minVertex.x - m_worldAABB.lowerBound.x)) & (B2BROADPHASE_MAX - 1); - upperValues[0] = (uint16)(m_quantizationFactor.x * (maxVertex.x - m_worldAABB.lowerBound.x)) | 1; - - lowerValues[1] = (uint16)(m_quantizationFactor.y * (minVertex.y - m_worldAABB.lowerBound.y)) & (B2BROADPHASE_MAX - 1); - upperValues[1] = (uint16)(m_quantizationFactor.y * (maxVertex.y - m_worldAABB.lowerBound.y)) | 1; -} - -void b2BroadPhase::IncrementTimeStamp() -{ - if (m_timeStamp == B2BROADPHASE_MAX) - { - for (uint16 i = 0; i < b2_maxProxies; ++i) - { - m_proxyPool[i].timeStamp = 0; - } - m_timeStamp = 1; - } - else - { - ++m_timeStamp; - } -} - -void b2BroadPhase::IncrementOverlapCount(int32 proxyId) -{ - b2Proxy* proxy = m_proxyPool + proxyId; - if (proxy->timeStamp < m_timeStamp) - { - proxy->timeStamp = m_timeStamp; - proxy->overlapCount = 1; - } - else - { - proxy->overlapCount = 2; - b2Assert(m_queryResultCount < b2_maxProxies); - m_queryResults[m_queryResultCount] = (uint16)proxyId; - ++m_queryResultCount; - } -} - -void b2BroadPhase::Query(int32* lowerQueryOut, int32* upperQueryOut, - uint16 lowerValue, uint16 upperValue, - b2Bound* bounds, int32 boundCount, int32 axis) -{ - int32 lowerQuery = BinarySearch(bounds, boundCount, lowerValue); - int32 upperQuery = BinarySearch(bounds, boundCount, upperValue); - - // Easy case: lowerQuery <= lowerIndex(i) < upperQuery - // Solution: search query range for min bounds. - for (int32 i = lowerQuery; i < upperQuery; ++i) - { - if (bounds[i].IsLower()) - { - IncrementOverlapCount(bounds[i].proxyId); - } - } - - // Hard case: lowerIndex(i) < lowerQuery < upperIndex(i) - // Solution: use the stabbing count to search down the bound array. - if (lowerQuery > 0) - { - int32 i = lowerQuery - 1; - int32 s = bounds[i].stabbingCount; - - // Find the s overlaps. - while (s) - { - b2Assert(i >= 0); - - if (bounds[i].IsLower()) - { - b2Proxy* proxy = m_proxyPool + bounds[i].proxyId; - if (lowerQuery <= proxy->upperBounds[axis]) - { - IncrementOverlapCount(bounds[i].proxyId); - --s; - } - } - --i; - } - } - - *lowerQueryOut = lowerQuery; - *upperQueryOut = upperQuery; -} - -uint16 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData) -{ - b2Assert(m_proxyCount < b2_maxProxies); - b2Assert(m_freeProxy != b2_nullProxy); - - uint16 proxyId = m_freeProxy; - b2Proxy* proxy = m_proxyPool + proxyId; - m_freeProxy = proxy->GetNext(); - - proxy->overlapCount = 0; - proxy->userData = userData; - - int32 boundCount = 2 * m_proxyCount; - - uint16 lowerValues[2], upperValues[2]; - ComputeBounds(lowerValues, upperValues, aabb); - - for (int32 axis = 0; axis < 2; ++axis) - { - b2Bound* bounds = m_bounds[axis]; - int32 lowerIndex, upperIndex; - Query(&lowerIndex, &upperIndex, lowerValues[axis], upperValues[axis], bounds, boundCount, axis); - - memmove(bounds + upperIndex + 2, bounds + upperIndex, (boundCount - upperIndex) * sizeof(b2Bound)); - memmove(bounds + lowerIndex + 1, bounds + lowerIndex, (upperIndex - lowerIndex) * sizeof(b2Bound)); - - // The upper index has increased because of the lower bound insertion. - ++upperIndex; - - // Copy in the new bounds. - bounds[lowerIndex].value = lowerValues[axis]; - bounds[lowerIndex].proxyId = proxyId; - bounds[upperIndex].value = upperValues[axis]; - bounds[upperIndex].proxyId = proxyId; - - bounds[lowerIndex].stabbingCount = lowerIndex == 0 ? 0 : bounds[lowerIndex-1].stabbingCount; - bounds[upperIndex].stabbingCount = bounds[upperIndex-1].stabbingCount; - - // Adjust the stabbing count between the new bounds. - for (int32 index = lowerIndex; index < upperIndex; ++index) - { - ++bounds[index].stabbingCount; - } - - // Adjust the all the affected bound indices. - for (int32 index = lowerIndex; index < boundCount + 2; ++index) - { - b2Proxy* proxy = m_proxyPool + bounds[index].proxyId; - if (bounds[index].IsLower()) - { - proxy->lowerBounds[axis] = (uint16)index; - } - else - { - proxy->upperBounds[axis] = (uint16)index; - } - } - } - - ++m_proxyCount; - - b2Assert(m_queryResultCount < b2_maxProxies); - - // Create pairs if the AABB is in range. - for (int32 i = 0; i < m_queryResultCount; ++i) - { - b2Assert(m_queryResults[i] < b2_maxProxies); - b2Assert(m_proxyPool[m_queryResults[i]].IsValid()); - - m_pairManager.AddBufferedPair(proxyId, m_queryResults[i]); - } - - m_pairManager.Commit(); - - if (s_validate) - { - Validate(); - } - - // Prepare for next query. - m_queryResultCount = 0; - IncrementTimeStamp(); - - return proxyId; -} - -void b2BroadPhase::DestroyProxy(int32 proxyId) -{ - b2Assert(0 < m_proxyCount && m_proxyCount <= b2_maxProxies); - b2Proxy* proxy = m_proxyPool + proxyId; - b2Assert(proxy->IsValid()); - - int32 boundCount = 2 * m_proxyCount; - - for (int32 axis = 0; axis < 2; ++axis) - { - b2Bound* bounds = m_bounds[axis]; - - int32 lowerIndex = proxy->lowerBounds[axis]; - int32 upperIndex = proxy->upperBounds[axis]; - uint16 lowerValue = bounds[lowerIndex].value; - uint16 upperValue = bounds[upperIndex].value; - - memmove(bounds + lowerIndex, bounds + lowerIndex + 1, (upperIndex - lowerIndex - 1) * sizeof(b2Bound)); - memmove(bounds + upperIndex-1, bounds + upperIndex + 1, (boundCount - upperIndex - 1) * sizeof(b2Bound)); - - // Fix bound indices. - for (int32 index = lowerIndex; index < boundCount - 2; ++index) - { - b2Proxy* proxy = m_proxyPool + bounds[index].proxyId; - if (bounds[index].IsLower()) - { - proxy->lowerBounds[axis] = (uint16)index; - } - else - { - proxy->upperBounds[axis] = (uint16)index; - } - } - - // Fix stabbing count. - for (int32 index = lowerIndex; index < upperIndex - 1; ++index) - { - --bounds[index].stabbingCount; - } - - // Query for pairs to be removed. lowerIndex and upperIndex are not needed. - Query(&lowerIndex, &upperIndex, lowerValue, upperValue, bounds, boundCount - 2, axis); - } - - b2Assert(m_queryResultCount < b2_maxProxies); - - for (int32 i = 0; i < m_queryResultCount; ++i) - { - b2Assert(m_proxyPool[m_queryResults[i]].IsValid()); - m_pairManager.RemoveBufferedPair(proxyId, m_queryResults[i]); - } - - m_pairManager.Commit(); - - // Prepare for next query. - m_queryResultCount = 0; - IncrementTimeStamp(); - - // Return the proxy to the pool. - proxy->userData = NULL; - proxy->overlapCount = b2_invalid; - proxy->lowerBounds[0] = b2_invalid; - proxy->lowerBounds[1] = b2_invalid; - proxy->upperBounds[0] = b2_invalid; - proxy->upperBounds[1] = b2_invalid; - - proxy->SetNext(m_freeProxy); - m_freeProxy = (uint16)proxyId; - --m_proxyCount; - - if (s_validate) - { - Validate(); - } -} - -void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb) -{ - if (proxyId == b2_nullProxy || b2_maxProxies <= proxyId) - { - b2Assert(false); - return; - } - - if (aabb.IsValid() == false) - { - b2Assert(false); - return; - } - - int32 boundCount = 2 * m_proxyCount; - - b2Proxy* proxy = m_proxyPool + proxyId; - - // Get new bound values - b2BoundValues newValues; - ComputeBounds(newValues.lowerValues, newValues.upperValues, aabb); - - // Get old bound values - b2BoundValues oldValues; - for (int32 axis = 0; axis < 2; ++axis) - { - oldValues.lowerValues[axis] = m_bounds[axis][proxy->lowerBounds[axis]].value; - oldValues.upperValues[axis] = m_bounds[axis][proxy->upperBounds[axis]].value; - } - - for (int32 axis = 0; axis < 2; ++axis) - { - b2Bound* bounds = m_bounds[axis]; - - int32 lowerIndex = proxy->lowerBounds[axis]; - int32 upperIndex = proxy->upperBounds[axis]; - - uint16 lowerValue = newValues.lowerValues[axis]; - uint16 upperValue = newValues.upperValues[axis]; - - int32 deltaLower = lowerValue - bounds[lowerIndex].value; - int32 deltaUpper = upperValue - bounds[upperIndex].value; - - bounds[lowerIndex].value = lowerValue; - bounds[upperIndex].value = upperValue; - - // - // Expanding adds overlaps - // - - // Should we move the lower bound down? - if (deltaLower < 0) - { - int32 index = lowerIndex; - while (index > 0 && lowerValue < bounds[index-1].value) - { - b2Bound* bound = bounds + index; - b2Bound* prevBound = bound - 1; - - int32 prevProxyId = prevBound->proxyId; - b2Proxy* prevProxy = m_proxyPool + prevBound->proxyId; - - ++prevBound->stabbingCount; - - if (prevBound->IsUpper() == true) - { - if (TestOverlap(newValues, prevProxy)) - { - m_pairManager.AddBufferedPair(proxyId, prevProxyId); - } - - ++prevProxy->upperBounds[axis]; - ++bound->stabbingCount; - } - else - { - ++prevProxy->lowerBounds[axis]; - --bound->stabbingCount; - } - - --proxy->lowerBounds[axis]; - b2Swap(*bound, *prevBound); - --index; - } - } - - // Should we move the upper bound up? - if (deltaUpper > 0) - { - int32 index = upperIndex; - while (index < boundCount-1 && bounds[index+1].value <= upperValue) - { - b2Bound* bound = bounds + index; - b2Bound* nextBound = bound + 1; - int32 nextProxyId = nextBound->proxyId; - b2Proxy* nextProxy = m_proxyPool + nextProxyId; - - ++nextBound->stabbingCount; - - if (nextBound->IsLower() == true) - { - if (TestOverlap(newValues, nextProxy)) - { - m_pairManager.AddBufferedPair(proxyId, nextProxyId); - } - - --nextProxy->lowerBounds[axis]; - ++bound->stabbingCount; - } - else - { - --nextProxy->upperBounds[axis]; - --bound->stabbingCount; - } - - ++proxy->upperBounds[axis]; - b2Swap(*bound, *nextBound); - ++index; - } - } - - // - // Shrinking removes overlaps - // - - // Should we move the lower bound up? - if (deltaLower > 0) - { - int32 index = lowerIndex; - while (index < boundCount-1 && bounds[index+1].value <= lowerValue) - { - b2Bound* bound = bounds + index; - b2Bound* nextBound = bound + 1; - - int32 nextProxyId = nextBound->proxyId; - b2Proxy* nextProxy = m_proxyPool + nextProxyId; - - --nextBound->stabbingCount; - - if (nextBound->IsUpper()) - { - if (TestOverlap(oldValues, nextProxy)) - { - m_pairManager.RemoveBufferedPair(proxyId, nextProxyId); - } - - --nextProxy->upperBounds[axis]; - --bound->stabbingCount; - } - else - { - --nextProxy->lowerBounds[axis]; - ++bound->stabbingCount; - } - - ++proxy->lowerBounds[axis]; - b2Swap(*bound, *nextBound); - ++index; - } - } - - // Should we move the upper bound down? - if (deltaUpper < 0) - { - int32 index = upperIndex; - while (index > 0 && upperValue < bounds[index-1].value) - { - b2Bound* bound = bounds + index; - b2Bound* prevBound = bound - 1; - - int32 prevProxyId = prevBound->proxyId; - b2Proxy* prevProxy = m_proxyPool + prevProxyId; - - --prevBound->stabbingCount; - - if (prevBound->IsLower() == true) - { - if (TestOverlap(oldValues, prevProxy)) - { - m_pairManager.RemoveBufferedPair(proxyId, prevProxyId); - } - - ++prevProxy->lowerBounds[axis]; - --bound->stabbingCount; - } - else - { - ++prevProxy->upperBounds[axis]; - ++bound->stabbingCount; - } - - --proxy->upperBounds[axis]; - b2Swap(*bound, *prevBound); - --index; - } - } - } - - if (s_validate) - { - Validate(); - } -} - -void b2BroadPhase::Commit() -{ - m_pairManager.Commit(); -} - -int32 b2BroadPhase::Query(const b2AABB& aabb, void** userData, int32 maxCount) -{ - uint16 lowerValues[2]; - uint16 upperValues[2]; - ComputeBounds(lowerValues, upperValues, aabb); - - int32 lowerIndex, upperIndex; - - Query(&lowerIndex, &upperIndex, lowerValues[0], upperValues[0], m_bounds[0], 2*m_proxyCount, 0); - Query(&lowerIndex, &upperIndex, lowerValues[1], upperValues[1], m_bounds[1], 2*m_proxyCount, 1); - - b2Assert(m_queryResultCount < b2_maxProxies); - - int32 count = 0; - for (int32 i = 0; i < m_queryResultCount && count < maxCount; ++i, ++count) - { - b2Assert(m_queryResults[i] < b2_maxProxies); - b2Proxy* proxy = m_proxyPool + m_queryResults[i]; - b2Assert(proxy->IsValid()); - userData[i] = proxy->userData; - } - - // Prepare for next query. - m_queryResultCount = 0; - IncrementTimeStamp(); - - return count; -} - -void b2BroadPhase::Validate() -{ - for (int32 axis = 0; axis < 2; ++axis) - { - b2Bound* bounds = m_bounds[axis]; - - int32 boundCount = 2 * m_proxyCount; - uint16 stabbingCount = 0; - - for (int32 i = 0; i < boundCount; ++i) - { - b2Bound* bound = bounds + i; - b2Assert(i == 0 || bounds[i-1].value <= bound->value); - b2Assert(bound->proxyId != b2_nullProxy); - b2Assert(m_proxyPool[bound->proxyId].IsValid()); - - if (bound->IsLower() == true) - { - b2Assert(m_proxyPool[bound->proxyId].lowerBounds[axis] == i); - ++stabbingCount; - } - else - { - b2Assert(m_proxyPool[bound->proxyId].upperBounds[axis] == i); - --stabbingCount; - } - - b2Assert(bound->stabbingCount == stabbingCount); - } - } -} diff --git a/src/modules/physics/box2d/Source/Collision/b2BroadPhase.h b/src/modules/physics/box2d/Source/Collision/b2BroadPhase.h deleted file mode 100644 index aa3ea1bed..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2BroadPhase.h +++ /dev/null @@ -1,146 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 - -/* -This broad phase uses the Sweep and Prune algorithm as described in: -Collision Detection in Interactive 3D Environments by Gino van den Bergen -Also, some ideas, such as using integral values for fast compares comes from -Bullet (http:/www.bulletphysics.com). -*/ - -#include "../Common/b2Settings.h" -#include "b2Collision.h" -#include "b2PairManager.h" -#include - -#ifdef TARGET_FLOAT32_IS_FIXED -#define B2BROADPHASE_MAX (USHRT_MAX/2) -#else -#define B2BROADPHASE_MAX USHRT_MAX - -#endif - -const uint16 b2_invalid = B2BROADPHASE_MAX; -const uint16 b2_nullEdge = B2BROADPHASE_MAX; -struct b2BoundValues; - -struct b2Bound -{ - bool IsLower() const { return (value & 1) == 0; } - bool IsUpper() const { return (value & 1) == 1; } - - uint16 value; - uint16 proxyId; - uint16 stabbingCount; -}; - -struct b2Proxy -{ - uint16 GetNext() const { return lowerBounds[0]; } - void SetNext(uint16 next) { lowerBounds[0] = next; } - bool IsValid() const { return overlapCount != b2_invalid; } - - uint16 lowerBounds[2], upperBounds[2]; - uint16 overlapCount; - uint16 timeStamp; - void* userData; -}; - -class b2BroadPhase -{ -public: - b2BroadPhase(const b2AABB& worldAABB, b2PairCallback* callback); - ~b2BroadPhase(); - - // Use this to see if your proxy is in range. If it is not in range, - // it should be destroyed. Otherwise you may get O(m^2) pairs, where m - // is the number of proxies that are out of range. - bool InRange(const b2AABB& aabb) const; - - // Create and destroy proxies. These call Flush first. - uint16 CreateProxy(const b2AABB& aabb, void* userData); - void DestroyProxy(int32 proxyId); - - // Call MoveProxy as many times as you like, then when you are done - // call Commit to finalized the proxy pairs (for your time step). - void MoveProxy(int32 proxyId, const b2AABB& aabb); - void Commit(); - - // Get a single proxy. Returns NULL if the id is invalid. - b2Proxy* GetProxy(int32 proxyId); - - // Query an AABB for overlapping proxies, returns the user data and - // the count, up to the supplied maximum count. - int32 Query(const b2AABB& aabb, void** userData, int32 maxCount); - - void Validate(); - void ValidatePairs(); - -private: - void ComputeBounds(uint16* lowerValues, uint16* upperValues, const b2AABB& aabb); - - bool TestOverlap(b2Proxy* p1, b2Proxy* p2); - bool TestOverlap(const b2BoundValues& b, b2Proxy* p); - - void Query(int32* lowerIndex, int32* upperIndex, uint16 lowerValue, uint16 upperValue, - b2Bound* bounds, int32 boundCount, int32 axis); - void IncrementOverlapCount(int32 proxyId); - void IncrementTimeStamp(); - -public: - friend class b2PairManager; - - b2PairManager m_pairManager; - - b2Proxy m_proxyPool[b2_maxProxies]; - uint16 m_freeProxy; - - b2Bound m_bounds[2][2*b2_maxProxies]; - - uint16 m_queryResults[b2_maxProxies]; - int32 m_queryResultCount; - - b2AABB m_worldAABB; - b2Vec2 m_quantizationFactor; - int32 m_proxyCount; - uint16 m_timeStamp; - - static bool s_validate; -}; - - -inline bool b2BroadPhase::InRange(const b2AABB& aabb) const -{ - b2Vec2 d = b2Max(aabb.lowerBound - m_worldAABB.upperBound, m_worldAABB.lowerBound - aabb.upperBound); - return b2Max(d.x, d.y) < 0.0f; -} - -inline b2Proxy* b2BroadPhase::GetProxy(int32 proxyId) -{ - if (proxyId == b2_nullProxy || m_proxyPool[proxyId].IsValid() == false) - { - return NULL; - } - - return m_proxyPool + proxyId; -} - -#endif diff --git a/src/modules/physics/box2d/Source/Collision/b2CollideCircle.cpp b/src/modules/physics/box2d/Source/Collision/b2CollideCircle.cpp deleted file mode 100644 index 9384e15f4..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2CollideCircle.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Collision.h" -#include "Shapes/b2CircleShape.h" -#include "Shapes/b2PolygonShape.h" - -void b2CollideCircles( - b2Manifold* manifold, - const b2CircleShape* circle1, const b2XForm& xf1, - const b2CircleShape* circle2, const b2XForm& xf2) -{ - manifold->pointCount = 0; - - b2Vec2 p1 = b2Mul(xf1, circle1->GetLocalPosition()); - b2Vec2 p2 = b2Mul(xf2, circle2->GetLocalPosition()); - - b2Vec2 d = p2 - p1; - float32 distSqr = b2Dot(d, d); - float32 r1 = circle1->GetRadius(); - float32 r2 = circle2->GetRadius(); - float32 radiusSum = r1 + r2; - if (distSqr > radiusSum * radiusSum) - { - return; - } - - float32 separation; - if (distSqr < B2_FLT_EPSILON) - { - separation = -radiusSum; - manifold->normal.Set(0.0f, 1.0f); - } - else - { - float32 dist = b2Sqrt(distSqr); - separation = dist - radiusSum; - float32 a = 1.0f / dist; - manifold->normal.x = a * d.x; - manifold->normal.y = a * d.y; - } - - manifold->pointCount = 1; - manifold->points[0].id.key = 0; - manifold->points[0].separation = separation; - - p1 += r1 * manifold->normal; - p2 -= r2 * manifold->normal; - - b2Vec2 p = 0.5f * (p1 + p2); - - manifold->points[0].localPoint1 = b2MulT(xf1, p); - manifold->points[0].localPoint2 = b2MulT(xf2, p); -} - -void b2CollidePolygonAndCircle( - b2Manifold* manifold, - const b2PolygonShape* polygon, const b2XForm& xf1, - const b2CircleShape* circle, const b2XForm& xf2) -{ - manifold->pointCount = 0; - - // Compute circle position in the frame of the polygon. - b2Vec2 c = b2Mul(xf2, circle->GetLocalPosition()); - b2Vec2 cLocal = b2MulT(xf1, c); - - // Find the min separating edge. - int32 normalIndex = 0; - float32 separation = -B2_FLT_MAX; - float32 radius = circle->GetRadius(); - int32 vertexCount = polygon->GetVertexCount(); - const b2Vec2* vertices = polygon->GetVertices(); - const b2Vec2* normals = polygon->GetNormals(); - - 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; - } - } - - // If the center is inside the polygon ... - if (separation < B2_FLT_EPSILON) - { - manifold->pointCount = 1; - manifold->normal = b2Mul(xf1.R, normals[normalIndex]); - manifold->points[0].id.features.incidentEdge = (uint8)normalIndex; - manifold->points[0].id.features.incidentVertex = b2_nullFeature; - manifold->points[0].id.features.referenceEdge = 0; - manifold->points[0].id.features.flip = 0; - b2Vec2 position = c - radius * manifold->normal; - manifold->points[0].localPoint1 = b2MulT(xf1, position); - manifold->points[0].localPoint2 = b2MulT(xf2, position); - manifold->points[0].separation = separation - radius; - return; - } - - // Project the circle center onto the edge segment. - int32 vertIndex1 = normalIndex; - int32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; - b2Vec2 e = vertices[vertIndex2] - vertices[vertIndex1]; - - float32 length = e.Normalize(); - b2Assert(length > B2_FLT_EPSILON); - - // Project the center onto the edge. - float32 u = b2Dot(cLocal - vertices[vertIndex1], e); - b2Vec2 p; - if (u <= 0.0f) - { - p = vertices[vertIndex1]; - manifold->points[0].id.features.incidentEdge = b2_nullFeature; - manifold->points[0].id.features.incidentVertex = (uint8)vertIndex1; - } - else if (u >= length) - { - p = vertices[vertIndex2]; - manifold->points[0].id.features.incidentEdge = b2_nullFeature; - manifold->points[0].id.features.incidentVertex = (uint8)vertIndex2; - } - else - { - p = vertices[vertIndex1] + u * e; - manifold->points[0].id.features.incidentEdge = (uint8)normalIndex; - manifold->points[0].id.features.incidentVertex = 0; - } - - b2Vec2 d = cLocal - p; - float32 dist = d.Normalize(); - if (dist > radius) - { - return; - } - - manifold->pointCount = 1; - manifold->normal = b2Mul(xf1.R, d); - b2Vec2 position = c - radius * manifold->normal; - manifold->points[0].localPoint1 = b2MulT(xf1, position); - manifold->points[0].localPoint2 = b2MulT(xf2, position); - manifold->points[0].separation = dist - radius; - manifold->points[0].id.features.referenceEdge = 0; - manifold->points[0].id.features.flip = 0; -} diff --git a/src/modules/physics/box2d/Source/Collision/b2Collision.cpp b/src/modules/physics/box2d/Source/Collision/b2Collision.cpp deleted file mode 100644 index 7b6b59c42..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2Collision.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Collision.h" - -// Collision Detection in Interactive 3D Environments by Gino van den Bergen -// From Section 3.4.1 -// x = mu1 * p1 + mu2 * p2 -// mu1 + mu2 = 1 && mu1 >= 0 && mu2 >= 0 -// mu1 = 1 - mu2; -// x = (1 - mu2) * p1 + mu2 * p2 -// = p1 + mu2 * (p2 - p1) -// x = s + a * r (s := start, r := end - start) -// s + a * r = p1 + mu2 * d (d := p2 - p1) -// -a * r + mu2 * d = b (b := s - p1) -// [-r d] * [a; mu2] = b -// Cramer's rule: -// denom = det[-r d] -// a = det[b d] / denom -// mu2 = det[-r b] / denom -bool b2Segment::TestSegment(float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const -{ - b2Vec2 s = segment.p1; - b2Vec2 r = segment.p2 - s; - b2Vec2 d = p2 - p1; - b2Vec2 n = b2Cross(d, 1.0f); - - const float32 k_slop = 100.0f * B2_FLT_EPSILON; - float32 denom = -b2Dot(r, n); - - // Cull back facing collision and ignore parallel segments. - if (denom > k_slop) - { - // Does the segment intersect the infinite line associated with this segment? - b2Vec2 b = s - p1; - float32 a = b2Dot(b, n); - - if (0.0f <= a && a <= maxLambda * denom) - { - float32 mu2 = -r.x * b.y + r.y * b.x; - - // Does the segment intersect this segment? - if (-k_slop * denom <= mu2 && mu2 <= denom * (1.0f + k_slop)) - { - a /= denom; - n.Normalize(); - *lambda = a; - *normal = n; - return true; - } - } - } - - return false; -} - - diff --git a/src/modules/physics/box2d/Source/Collision/b2Collision.h b/src/modules/physics/box2d/Source/Collision/b2Collision.h deleted file mode 100644 index a7bb64237..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2Collision.h +++ /dev/null @@ -1,154 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "../Common/b2Math.h" -#include - -/// @file -/// Structures and functions used for computing contact points, distance -/// queries, and TOI queries. - -class b2Shape; -class b2CircleShape; -class b2PolygonShape; - -const uint8 b2_nullFeature = UCHAR_MAX; - -/// Contact ids to facilitate warm starting. -union b2ContactID -{ - /// The features that intersect to form the contact point - struct Features - { - uint8 referenceEdge; ///< The edge that defines the outward contact normal. - uint8 incidentEdge; ///< The edge most anti-parallel to the reference edge. - uint8 incidentVertex; ///< The vertex (0 or 1) on the incident edge that was clipped. - uint8 flip; ///< A value of 1 indicates that the reference edge is on shape2. - } features; - 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 point is stored in local coordinates because CCD -/// requires sub-stepping in which the separation is stale. -struct b2ManifoldPoint -{ - b2Vec2 localPoint1; ///< local position of the contact point in body1 - b2Vec2 localPoint2; ///< local position of the contact point in body2 - float32 separation; ///< the separation of the shapes along the normal vector - 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. -struct b2Manifold -{ - b2ManifoldPoint points[b2_maxManifoldPoints]; ///< the points of contact - b2Vec2 normal; ///< the shared unit normal vector - int32 pointCount; ///< the number of manifold points -}; - -/// A line segment. -struct b2Segment -{ - /// Ray cast against this segment with another segment. - bool TestSegment(float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const; - - b2Vec2 p1; ///< the starting point - b2Vec2 p2; ///< the ending point -}; - -/// An axis aligned bounding box. -struct b2AABB -{ - /// Verify that the bounds are sorted. - bool IsValid() const; - - b2Vec2 lowerBound; ///< the lower vertex - b2Vec2 upperBound; ///< the upper vertex -}; - -/// An oriented bounding box. -struct b2OBB -{ - b2Mat22 R; ///< the rotation matrix - b2Vec2 center; ///< the local centroid - b2Vec2 extents; ///< the half-widths -}; - -/// Compute the collision manifold between two circles. -void b2CollideCircles(b2Manifold* manifold, - const b2CircleShape* circle1, const b2XForm& xf1, - const b2CircleShape* circle2, const b2XForm& xf2); - -/// Compute the collision manifold between a polygon and a circle. -void b2CollidePolygonAndCircle(b2Manifold* manifold, - const b2PolygonShape* polygon, const b2XForm& xf1, - const b2CircleShape* circle, const b2XForm& xf2); - -/// Compute the collision manifold between two circles. -void b2CollidePolygons(b2Manifold* manifold, - const b2PolygonShape* polygon1, const b2XForm& xf1, - const b2PolygonShape* polygon2, const b2XForm& xf2); - -/// Compute the distance between two shapes and the closest points. -/// @return the distance between the shapes or zero if they are overlapped/touching. -float32 b2Distance(b2Vec2* x1, b2Vec2* x2, - const b2Shape* shape1, const b2XForm& xf1, - const b2Shape* shape2, const b2XForm& xf2); - -/// Compute the time when two shapes begin to touch or touch at a closer distance. -/// @warning the sweeps must have the same time interval. -/// @return the fraction between [0,1] in which the shapes first touch. -/// fraction=0 means the shapes begin touching/overlapped, and fraction=1 means the shapes don't touch. -float32 b2TimeOfImpact(const b2Shape* shape1, const b2Sweep& sweep1, - const b2Shape* shape2, const b2Sweep& sweep2); - - -// ---------------- 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/src/modules/physics/box2d/Source/Collision/b2Distance.cpp b/src/modules/physics/box2d/Source/Collision/b2Distance.cpp deleted file mode 100644 index a423d3f1b..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2Distance.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Collision.h" -#include "Shapes/b2CircleShape.h" -#include "Shapes/b2PolygonShape.h" - -int32 g_GJK_Iterations = 0; - -// GJK using Voronoi regions (Christer Ericson) and region selection -// optimizations (Casey Muratori). - -// The origin is either in the region of points[1] or in the edge region. The origin is -// not in region of points[0] because that is the old point. -static int32 ProcessTwo(b2Vec2* x1, b2Vec2* x2, b2Vec2* p1s, b2Vec2* p2s, b2Vec2* points) -{ - // If in point[1] region - b2Vec2 r = -points[1]; - b2Vec2 d = points[0] - points[1]; - float32 length = d.Normalize(); - float32 lambda = b2Dot(r, d); - if (lambda <= 0.0f || length < B2_FLT_EPSILON) - { - // The simplex is reduced to a point. - *x1 = p1s[1]; - *x2 = p2s[1]; - p1s[0] = p1s[1]; - p2s[0] = p2s[1]; - points[0] = points[1]; - return 1; - } - - // Else in edge region - lambda /= length; - *x1 = p1s[1] + lambda * (p1s[0] - p1s[1]); - *x2 = p2s[1] + lambda * (p2s[0] - p2s[1]); - return 2; -} - -// Possible regions: -// - points[2] -// - edge points[0]-points[2] -// - edge points[1]-points[2] -// - inside the triangle -static int32 ProcessThree(b2Vec2* x1, b2Vec2* x2, b2Vec2* p1s, b2Vec2* p2s, b2Vec2* points) -{ - b2Vec2 a = points[0]; - b2Vec2 b = points[1]; - b2Vec2 c = points[2]; - - b2Vec2 ab = b - a; - b2Vec2 ac = c - a; - b2Vec2 bc = c - b; - - float32 sn = -b2Dot(a, ab), sd = b2Dot(b, ab); - float32 tn = -b2Dot(a, ac), td = b2Dot(c, ac); - float32 un = -b2Dot(b, bc), ud = b2Dot(c, bc); - - // In vertex c region? - if (td <= 0.0f && ud <= 0.0f) - { - // Single point - *x1 = p1s[2]; - *x2 = p2s[2]; - p1s[0] = p1s[2]; - p2s[0] = p2s[2]; - points[0] = points[2]; - return 1; - } - - // Should not be in vertex a or b region. - B2_NOT_USED(sd); - B2_NOT_USED(sn); - b2Assert(sn > 0.0f || tn > 0.0f); - b2Assert(sd > 0.0f || un > 0.0f); - - float32 n = b2Cross(ab, ac); - -#ifdef TARGET_FLOAT32_IS_FIXED - n = (n < 0.0)? -1.0 : ((n > 0.0)? 1.0 : 0.0); -#endif - - // Should not be in edge ab region. - float32 vc = n * b2Cross(a, b); - b2Assert(vc > 0.0f || sn > 0.0f || sd > 0.0f); - - // In edge bc region? - float32 va = n * b2Cross(b, c); - if (va <= 0.0f && un >= 0.0f && ud >= 0.0f && (un+ud) > 0.0f) - { - b2Assert(un + ud > 0.0f); - float32 lambda = un / (un + ud); - *x1 = p1s[1] + lambda * (p1s[2] - p1s[1]); - *x2 = p2s[1] + lambda * (p2s[2] - p2s[1]); - p1s[0] = p1s[2]; - p2s[0] = p2s[2]; - points[0] = points[2]; - return 2; - } - - // In edge ac region? - float32 vb = n * b2Cross(c, a); - if (vb <= 0.0f && tn >= 0.0f && td >= 0.0f && (tn+td) > 0.0f) - { - b2Assert(tn + td > 0.0f); - float32 lambda = tn / (tn + td); - *x1 = p1s[0] + lambda * (p1s[2] - p1s[0]); - *x2 = p2s[0] + lambda * (p2s[2] - p2s[0]); - p1s[1] = p1s[2]; - p2s[1] = p2s[2]; - points[1] = points[2]; - return 2; - } - - // Inside the triangle, compute barycentric coordinates - float32 denom = va + vb + vc; - b2Assert(denom > 0.0f); - denom = 1.0f / denom; - -#ifdef TARGET_FLOAT32_IS_FIXED - *x1 = denom * (va * p1s[0] + vb * p1s[1] + vc * p1s[2]); - *x2 = denom * (va * p2s[0] + vb * p2s[1] + vc * p2s[2]); -#else - float32 u = va * denom; - float32 v = vb * denom; - float32 w = 1.0f - u - v; - *x1 = u * p1s[0] + v * p1s[1] + w * p1s[2]; - *x2 = u * p2s[0] + v * p2s[1] + w * p2s[2]; -#endif - return 3; -} - -static bool InPoints(const b2Vec2& w, const b2Vec2* points, int32 pointCount) -{ - const float32 k_tolerance = 100.0f * B2_FLT_EPSILON; - for (int32 i = 0; i < pointCount; ++i) - { - b2Vec2 d = b2Abs(w - points[i]); - b2Vec2 m = b2Max(b2Abs(w), b2Abs(points[i])); - - if (d.x < k_tolerance * (m.x + 1.0f) && - d.y < k_tolerance * (m.y + 1.0f)) - { - return true; - } - } - - return false; -} - -template -float32 DistanceGeneric(b2Vec2* x1, b2Vec2* x2, - const T1* shape1, const b2XForm& xf1, - const T2* shape2, const b2XForm& xf2) -{ - b2Vec2 p1s[3], p2s[3]; - b2Vec2 points[3]; - int32 pointCount = 0; - - *x1 = shape1->GetFirstVertex(xf1); - *x2 = shape2->GetFirstVertex(xf2); - - float32 vSqr = 0.0f; - const int32 maxIterations = 20; - for (int32 iter = 0; iter < maxIterations; ++iter) - { - b2Vec2 v = *x2 - *x1; - b2Vec2 w1 = shape1->Support(xf1, v); - b2Vec2 w2 = shape2->Support(xf2, -v); - - vSqr = b2Dot(v, v); - b2Vec2 w = w2 - w1; - float32 vw = b2Dot(v, w); - if (vSqr - vw <= 0.01f * vSqr || InPoints(w, points, pointCount)) // or w in points - { - if (pointCount == 0) - { - *x1 = w1; - *x2 = w2; - } - g_GJK_Iterations = iter; - return b2Sqrt(vSqr); - } - - switch (pointCount) - { - case 0: - p1s[0] = w1; - p2s[0] = w2; - points[0] = w; - *x1 = p1s[0]; - *x2 = p2s[0]; - ++pointCount; - break; - - case 1: - p1s[1] = w1; - p2s[1] = w2; - points[1] = w; - pointCount = ProcessTwo(x1, x2, p1s, p2s, points); - break; - - case 2: - p1s[2] = w1; - p2s[2] = w2; - points[2] = w; - pointCount = ProcessThree(x1, x2, p1s, p2s, points); - break; - } - - // If we have three points, then the origin is in the corresponding triangle. - if (pointCount == 3) - { - g_GJK_Iterations = iter; - return 0.0f; - } - - float32 maxSqr = -B2_FLT_MAX; - for (int32 i = 0; i < pointCount; ++i) - { - maxSqr = b2Max(maxSqr, b2Dot(points[i], points[i])); - } - -#ifdef TARGET_FLOAT32_IS_FIXED - if (pointCount == 3 || vSqr <= 5.0*B2_FLT_EPSILON * maxSqr) -#else - if (pointCount == 3 || vSqr <= 100.0f * B2_FLT_EPSILON * maxSqr) -#endif - { - g_GJK_Iterations = iter; - v = *x2 - *x1; - vSqr = b2Dot(v, v); - return b2Sqrt(vSqr); - } - } - - g_GJK_Iterations = maxIterations; - return b2Sqrt(vSqr); -} - -static float32 DistanceCC( - b2Vec2* x1, b2Vec2* x2, - const b2CircleShape* circle1, const b2XForm& xf1, - const b2CircleShape* circle2, const b2XForm& xf2) -{ - b2Vec2 p1 = b2Mul(xf1, circle1->GetLocalPosition()); - b2Vec2 p2 = b2Mul(xf2, circle2->GetLocalPosition()); - - b2Vec2 d = p2 - p1; - float32 dSqr = b2Dot(d, d); - float32 r1 = circle1->GetRadius() - b2_toiSlop; - float32 r2 = circle2->GetRadius() - b2_toiSlop; - float32 r = r1 + r2; - if (dSqr > r * r) - { - float32 dLen = d.Normalize(); - float32 distance = dLen - r; - *x1 = p1 + r1 * d; - *x2 = p2 - r2 * d; - return distance; - } - else if (dSqr > B2_FLT_EPSILON * B2_FLT_EPSILON) - { - d.Normalize(); - *x1 = p1 + r1 * d; - *x2 = *x1; - return 0.0f; - } - - *x1 = p1; - *x2 = *x1; - return 0.0f; -} - -// This is used for polygon-vs-circle distance. -struct Point -{ - b2Vec2 Support(const b2XForm&, const b2Vec2&) const - { - return p; - } - - b2Vec2 GetFirstVertex(const b2XForm&) const - { - return p; - } - - b2Vec2 p; -}; - -// GJK is more robust with polygon-vs-point than polygon-vs-circle. -// So we convert polygon-vs-circle to polygon-vs-point. -static float32 DistancePC( - b2Vec2* x1, b2Vec2* x2, - const b2PolygonShape* polygon, const b2XForm& xf1, - const b2CircleShape* circle, const b2XForm& xf2) -{ - Point point; - point.p = b2Mul(xf2, circle->GetLocalPosition()); - - float32 distance = DistanceGeneric(x1, x2, polygon, xf1, &point, b2XForm_identity); - - float32 r = circle->GetRadius() - b2_toiSlop; - - if (distance > r) - { - distance -= r; - b2Vec2 d = *x2 - *x1; - d.Normalize(); - *x2 -= r * d; - } - else - { - distance = 0.0f; - *x2 = *x1; - } - - return distance; -} - -float32 b2Distance(b2Vec2* x1, b2Vec2* x2, - const b2Shape* shape1, const b2XForm& xf1, - const b2Shape* shape2, const b2XForm& xf2) -{ - b2ShapeType type1 = shape1->GetType(); - b2ShapeType type2 = shape2->GetType(); - - if (type1 == e_circleShape && type2 == e_circleShape) - { - return DistanceCC(x1, x2, (b2CircleShape*)shape1, xf1, (b2CircleShape*)shape2, xf2); - } - - if (type1 == e_polygonShape && type2 == e_circleShape) - { - return DistancePC(x1, x2, (b2PolygonShape*)shape1, xf1, (b2CircleShape*)shape2, xf2); - } - - if (type1 == e_circleShape && type2 == e_polygonShape) - { - return DistancePC(x2, x1, (b2PolygonShape*)shape2, xf2, (b2CircleShape*)shape1, xf1); - } - - if (type1 == e_polygonShape && type2 == e_polygonShape) - { - return DistanceGeneric(x1, x2, (b2PolygonShape*)shape1, xf1, (b2PolygonShape*)shape2, xf2); - } - - return 0.0f; -} diff --git a/src/modules/physics/box2d/Source/Collision/b2PairManager.cpp b/src/modules/physics/box2d/Source/Collision/b2PairManager.cpp deleted file mode 100644 index 909894491..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2PairManager.cpp +++ /dev/null @@ -1,396 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2PairManager.h" -#include "b2BroadPhase.h" - -#include - -// Thomas Wang's hash, see: http://www.concentric.net/~Ttwang/tech/inthash.htm -// This assumes proxyId1 and proxyId2 are 16-bit. -inline uint32 Hash(uint32 proxyId1, uint32 proxyId2) -{ - uint32 key = (proxyId2 << 16) | proxyId1; - key = ~key + (key << 15); - key = key ^ (key >> 12); - key = key + (key << 2); - key = key ^ (key >> 4); - key = key * 2057; - key = key ^ (key >> 16); - return key; -} - -inline bool Equals(const b2Pair& pair, int32 proxyId1, int32 proxyId2) -{ - return pair.proxyId1 == proxyId1 && pair.proxyId2 == proxyId2; -} - -inline bool Equals(const b2BufferedPair& pair1, const b2BufferedPair& pair2) -{ - return pair1.proxyId1 == pair2.proxyId1 && pair1.proxyId2 == pair2.proxyId2; -} - -// For sorting. -inline bool operator < (const b2BufferedPair& pair1, const b2BufferedPair& pair2) -{ - if (pair1.proxyId1 < pair2.proxyId1) - { - return true; - } - - if (pair1.proxyId1 == pair2.proxyId1) - { - return pair1.proxyId2 < pair2.proxyId2; - } - - return false; -} - - -b2PairManager::b2PairManager() -{ - b2Assert(b2IsPowerOfTwo(b2_tableCapacity) == true); - b2Assert(b2_tableCapacity >= b2_maxPairs); - for (int32 i = 0; i < b2_tableCapacity; ++i) - { - m_hashTable[i] = b2_nullPair; - } - m_freePair = 0; - for (int32 i = 0; i < b2_maxPairs; ++i) - { - m_pairs[i].proxyId1 = b2_nullProxy; - m_pairs[i].proxyId2 = b2_nullProxy; - m_pairs[i].userData = NULL; - m_pairs[i].status = 0; - m_pairs[i].next = uint16(i + 1); - } - m_pairs[b2_maxPairs-1].next = b2_nullPair; - m_pairCount = 0; - m_pairBufferCount = 0; -} - -void b2PairManager::Initialize(b2BroadPhase* broadPhase, b2PairCallback* callback) -{ - m_broadPhase = broadPhase; - m_callback = callback; -} - -b2Pair* b2PairManager::Find(int32 proxyId1, int32 proxyId2, uint32 hash) -{ - int32 index = m_hashTable[hash]; - - while (index != b2_nullPair && Equals(m_pairs[index], proxyId1, proxyId2) == false) - { - index = m_pairs[index].next; - } - - if (index == b2_nullPair) - { - return NULL; - } - - b2Assert(index < b2_maxPairs); - - return m_pairs + index; -} - -b2Pair* b2PairManager::Find(int32 proxyId1, int32 proxyId2) -{ - if (proxyId1 > proxyId2) b2Swap(proxyId1, proxyId2); - - int32 hash = Hash(proxyId1, proxyId2) & b2_tableMask; - - return Find(proxyId1, proxyId2, hash); -} - -// Returns existing pair or creates a new one. -b2Pair* b2PairManager::AddPair(int32 proxyId1, int32 proxyId2) -{ - if (proxyId1 > proxyId2) b2Swap(proxyId1, proxyId2); - - int32 hash = Hash(proxyId1, proxyId2) & b2_tableMask; - - b2Pair* pair = Find(proxyId1, proxyId2, hash); - if (pair != NULL) - { - return pair; - } - - b2Assert(m_pairCount < b2_maxPairs && m_freePair != b2_nullPair); - - uint16 pairIndex = m_freePair; - pair = m_pairs + pairIndex; - m_freePair = pair->next; - - pair->proxyId1 = (uint16)proxyId1; - pair->proxyId2 = (uint16)proxyId2; - pair->status = 0; - pair->userData = NULL; - pair->next = m_hashTable[hash]; - - m_hashTable[hash] = pairIndex; - - ++m_pairCount; - - return pair; -} - -// Removes a pair. The pair must exist. -void* b2PairManager::RemovePair(int32 proxyId1, int32 proxyId2) -{ - b2Assert(m_pairCount > 0); - - if (proxyId1 > proxyId2) b2Swap(proxyId1, proxyId2); - - int32 hash = Hash(proxyId1, proxyId2) & b2_tableMask; - - uint16* node = &m_hashTable[hash]; - while (*node != b2_nullPair) - { - if (Equals(m_pairs[*node], proxyId1, proxyId2)) - { - uint16 index = *node; - *node = m_pairs[*node].next; - - b2Pair* pair = m_pairs + index; - void* userData = pair->userData; - - // Scrub - pair->next = m_freePair; - pair->proxyId1 = b2_nullProxy; - pair->proxyId2 = b2_nullProxy; - pair->userData = NULL; - pair->status = 0; - - m_freePair = index; - --m_pairCount; - return userData; - } - else - { - node = &m_pairs[*node].next; - } - } - - b2Assert(false); - return NULL; -} - -/* -As proxies are created and moved, many pairs are created and destroyed. Even worse, the same -pair may be added and removed multiple times in a single time step of the physics engine. To reduce -traffic in the pair manager, we try to avoid destroying pairs in the pair manager until the -end of the physics step. This is done by buffering all the RemovePair requests. AddPair -requests are processed immediately because we need the hash table entry for quick lookup. - -All user user callbacks are delayed until the buffered pairs are confirmed in Commit. -This is very important because the user callbacks may be very expensive and client logic -may be harmed if pairs are added and removed within the same time step. - -Buffer a pair for addition. -We may add a pair that is not in the pair manager or pair buffer. -We may add a pair that is already in the pair manager and pair buffer. -If the added pair is not a new pair, then it must be in the pair buffer (because RemovePair was called). -*/ -void b2PairManager::AddBufferedPair(int32 id1, int32 id2) -{ - b2Assert(id1 != b2_nullProxy && id2 != b2_nullProxy); - b2Assert(m_pairBufferCount < b2_maxPairs); - - b2Pair* pair = AddPair(id1, id2); - - // If this pair is not in the pair buffer ... - if (pair->IsBuffered() == false) - { - // This must be a newly added pair. - b2Assert(pair->IsFinal() == false); - - // Add it to the pair buffer. - pair->SetBuffered(); - m_pairBuffer[m_pairBufferCount].proxyId1 = pair->proxyId1; - m_pairBuffer[m_pairBufferCount].proxyId2 = pair->proxyId2; - ++m_pairBufferCount; - - b2Assert(m_pairBufferCount <= m_pairCount); - } - - // Confirm this pair for the subsequent call to Commit. - pair->ClearRemoved(); - - if (b2BroadPhase::s_validate) - { - ValidateBuffer(); - } -} - -// Buffer a pair for removal. -void b2PairManager::RemoveBufferedPair(int32 id1, int32 id2) -{ - b2Assert(id1 != b2_nullProxy && id2 != b2_nullProxy); - b2Assert(m_pairBufferCount < b2_maxPairs); - - b2Pair* pair = Find(id1, id2); - - if (pair == NULL) - { - // The pair never existed. This is legal (due to collision filtering). - return; - } - - // If this pair is not in the pair buffer ... - if (pair->IsBuffered() == false) - { - // This must be an old pair. - b2Assert(pair->IsFinal() == true); - - pair->SetBuffered(); - m_pairBuffer[m_pairBufferCount].proxyId1 = pair->proxyId1; - m_pairBuffer[m_pairBufferCount].proxyId2 = pair->proxyId2; - ++m_pairBufferCount; - - b2Assert(m_pairBufferCount <= m_pairCount); - } - - pair->SetRemoved(); - - if (b2BroadPhase::s_validate) - { - ValidateBuffer(); - } -} - -void b2PairManager::Commit() -{ - int32 removeCount = 0; - - b2Proxy* proxies = m_broadPhase->m_proxyPool; - - for (int32 i = 0; i < m_pairBufferCount; ++i) - { - b2Pair* pair = Find(m_pairBuffer[i].proxyId1, m_pairBuffer[i].proxyId2); - b2Assert(pair->IsBuffered()); - pair->ClearBuffered(); - - b2Assert(pair->proxyId1 < b2_maxProxies && pair->proxyId2 < b2_maxProxies); - - b2Proxy* proxy1 = proxies + pair->proxyId1; - b2Proxy* proxy2 = proxies + pair->proxyId2; - - b2Assert(proxy1->IsValid()); - b2Assert(proxy2->IsValid()); - - if (pair->IsRemoved()) - { - // It is possible a pair was added then removed before a commit. Therefore, - // we should be careful not to tell the user the pair was removed when the - // the user didn't receive a matching add. - if (pair->IsFinal() == true) - { - m_callback->PairRemoved(proxy1->userData, proxy2->userData, pair->userData); - } - - // Store the ids so we can actually remove the pair below. - m_pairBuffer[removeCount].proxyId1 = pair->proxyId1; - m_pairBuffer[removeCount].proxyId2 = pair->proxyId2; - ++removeCount; - } - else - { - b2Assert(m_broadPhase->TestOverlap(proxy1, proxy2) == true); - - if (pair->IsFinal() == false) - { - pair->userData = m_callback->PairAdded(proxy1->userData, proxy2->userData); - pair->SetFinal(); - } - } - } - - for (int32 i = 0; i < removeCount; ++i) - { - RemovePair(m_pairBuffer[i].proxyId1, m_pairBuffer[i].proxyId2); - } - - m_pairBufferCount = 0; - - if (b2BroadPhase::s_validate) - { - ValidateTable(); - } -} - -void b2PairManager::ValidateBuffer() -{ -#ifdef _DEBUG - b2Assert(m_pairBufferCount <= m_pairCount); - - std::sort(m_pairBuffer, m_pairBuffer + m_pairBufferCount); - - for (int32 i = 0; i < m_pairBufferCount; ++i) - { - if (i > 0) - { - b2Assert(Equals(m_pairBuffer[i], m_pairBuffer[i-1]) == false); - } - - b2Pair* pair = Find(m_pairBuffer[i].proxyId1, m_pairBuffer[i].proxyId2); - b2Assert(pair->IsBuffered()); - - b2Assert(pair->proxyId1 != pair->proxyId2); - b2Assert(pair->proxyId1 < b2_maxProxies); - b2Assert(pair->proxyId2 < b2_maxProxies); - - b2Proxy* proxy1 = m_broadPhase->m_proxyPool + pair->proxyId1; - b2Proxy* proxy2 = m_broadPhase->m_proxyPool + pair->proxyId2; - - b2Assert(proxy1->IsValid() == true); - b2Assert(proxy2->IsValid() == true); - } -#endif -} - -void b2PairManager::ValidateTable() -{ -#ifdef _DEBUG - for (int32 i = 0; i < b2_tableCapacity; ++i) - { - uint16 index = m_hashTable[i]; - while (index != b2_nullPair) - { - b2Pair* pair = m_pairs + index; - b2Assert(pair->IsBuffered() == false); - b2Assert(pair->IsFinal() == true); - b2Assert(pair->IsRemoved() == false); - - b2Assert(pair->proxyId1 != pair->proxyId2); - b2Assert(pair->proxyId1 < b2_maxProxies); - b2Assert(pair->proxyId2 < b2_maxProxies); - - b2Proxy* proxy1 = m_broadPhase->m_proxyPool + pair->proxyId1; - b2Proxy* proxy2 = m_broadPhase->m_proxyPool + pair->proxyId2; - - b2Assert(proxy1->IsValid() == true); - b2Assert(proxy2->IsValid() == true); - - b2Assert(m_broadPhase->TestOverlap(proxy1, proxy2) == true); - - index = pair->next; - } - } -#endif -} diff --git a/src/modules/physics/box2d/Source/Collision/b2PairManager.h b/src/modules/physics/box2d/Source/Collision/b2PairManager.h deleted file mode 100644 index 236034435..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2PairManager.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -// The pair manager is used by the broad-phase to quickly add/remove/find pairs -// of overlapping proxies. It is based closely on code provided by Pierre Terdiman. -// http://www.codercorner.com/IncrementalSAP.txt - -#ifndef B2_PAIR_MANAGER_H -#define B2_PAIR_MANAGER_H - -#include "../Common/b2Settings.h" -#include "../Common/b2Math.h" - -#include - -class b2BroadPhase; -struct b2Proxy; - -const uint16 b2_nullPair = USHRT_MAX; -const uint16 b2_nullProxy = USHRT_MAX; -const int32 b2_tableCapacity = b2_maxPairs; // must be a power of two -const int32 b2_tableMask = b2_tableCapacity - 1; - -struct b2Pair -{ - enum - { - e_pairBuffered = 0x0001, - e_pairRemoved = 0x0002, - e_pairFinal = 0x0004, - }; - - void SetBuffered() { status |= e_pairBuffered; } - void ClearBuffered() { status &= ~e_pairBuffered; } - bool IsBuffered() { return (status & e_pairBuffered) == e_pairBuffered; } - - void SetRemoved() { status |= e_pairRemoved; } - void ClearRemoved() { status &= ~e_pairRemoved; } - bool IsRemoved() { return (status & e_pairRemoved) == e_pairRemoved; } - - void SetFinal() { status |= e_pairFinal; } - bool IsFinal() { return (status & e_pairFinal) == e_pairFinal; } - - void* userData; - uint16 proxyId1; - uint16 proxyId2; - uint16 next; - uint16 status; -}; - -struct b2BufferedPair -{ - uint16 proxyId1; - uint16 proxyId2; -}; - -class b2PairCallback -{ -public: - virtual ~b2PairCallback() {} - - // This should return the new pair user data. It is ok if the - // user data is null. - virtual void* PairAdded(void* proxyUserData1, void* proxyUserData2) = 0; - - // This should free the pair's user data. In extreme circumstances, it is possible - // this will be called with null pairUserData because the pair never existed. - virtual void PairRemoved(void* proxyUserData1, void* proxyUserData2, void* pairUserData) = 0; -}; - -class b2PairManager -{ -public: - b2PairManager(); - - void Initialize(b2BroadPhase* broadPhase, b2PairCallback* callback); - - void AddBufferedPair(int32 proxyId1, int32 proxyId2); - void RemoveBufferedPair(int32 proxyId1, int32 proxyId2); - - void Commit(); - -private: - b2Pair* Find(int32 proxyId1, int32 proxyId2); - b2Pair* Find(int32 proxyId1, int32 proxyId2, uint32 hashValue); - - b2Pair* AddPair(int32 proxyId1, int32 proxyId2); - void* RemovePair(int32 proxyId1, int32 proxyId2); - - void ValidateBuffer(); - void ValidateTable(); - -public: - b2BroadPhase *m_broadPhase; - b2PairCallback *m_callback; - b2Pair m_pairs[b2_maxPairs]; - uint16 m_freePair; - int32 m_pairCount; - - b2BufferedPair m_pairBuffer[b2_maxPairs]; - int32 m_pairBufferCount; - - uint16 m_hashTable[b2_tableCapacity]; -}; - -#endif diff --git a/src/modules/physics/box2d/Source/Collision/b2TimeOfImpact.cpp b/src/modules/physics/box2d/Source/Collision/b2TimeOfImpact.cpp deleted file mode 100644 index 448c5d225..000000000 --- a/src/modules/physics/box2d/Source/Collision/b2TimeOfImpact.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Collision.h" -#include "Shapes/b2Shape.h" - -// This algorithm uses conservative advancement to compute the time of -// impact (TOI) of two shapes. -// Refs: Bullet, Young Kim -float32 b2TimeOfImpact(const b2Shape* shape1, const b2Sweep& sweep1, - const b2Shape* shape2, const b2Sweep& sweep2) -{ - float32 r1 = shape1->GetSweepRadius(); - float32 r2 = shape2->GetSweepRadius(); - - b2Assert(sweep1.t0 == sweep2.t0); - b2Assert(1.0f - sweep1.t0 > B2_FLT_EPSILON); - - float32 t0 = sweep1.t0; - b2Vec2 v1 = sweep1.c - sweep1.c0; - b2Vec2 v2 = sweep2.c - sweep2.c0; - float32 omega1 = sweep1.a - sweep1.a0; - float32 omega2 = sweep2.a - sweep2.a0; - - float32 alpha = 0.0f; - - b2Vec2 p1, p2; - const int32 k_maxIterations = 20; // TODO_ERIN b2Settings - int32 iter = 0; - b2Vec2 normal = b2Vec2_zero; - float32 distance = 0.0f; - float32 targetDistance = 0.0f; - for(;;) - { - float32 t = (1.0f - alpha) * t0 + alpha; - b2XForm xf1, xf2; - sweep1.GetXForm(&xf1, t); - sweep2.GetXForm(&xf2, t); - - // Get the distance between shapes. - distance = b2Distance(&p1, &p2, shape1, xf1, shape2, xf2); - - if (iter == 0) - { - // Compute a reasonable target distance to give some breathing room - // for conservative advancement. - if (distance > 2.0f * b2_toiSlop) - { - targetDistance = 1.5f * b2_toiSlop; - } - else - { - targetDistance = b2Max(0.05f * b2_toiSlop, distance - 0.5f * b2_toiSlop); - } - } - - if (distance - targetDistance < 0.05f * b2_toiSlop || iter == k_maxIterations) - { - break; - } - - normal = p2 - p1; - normal.Normalize(); - - // Compute upper bound on remaining movement. - float32 approachVelocityBound = b2Dot(normal, v1 - v2) + b2Abs(omega1) * r1 + b2Abs(omega2) * r2; - if (b2Abs(approachVelocityBound) < B2_FLT_EPSILON) - { - alpha = 1.0f; - break; - } - - // Get the conservative time increment. Don't advance all the way. - float32 dAlpha = (distance - targetDistance) / approachVelocityBound; - //float32 dt = (distance - 0.5f * b2_linearSlop) / approachVelocityBound; - float32 newAlpha = alpha + dAlpha; - - // The shapes may be moving apart or a safe distance apart. - if (newAlpha < 0.0f || 1.0f < newAlpha) - { - alpha = 1.0f; - break; - } - - // Ensure significant advancement. - if (newAlpha < (1.0f + 100.0f * B2_FLT_EPSILON) * alpha) - { - break; - } - - alpha = newAlpha; - - ++iter; - } - - return alpha; -} diff --git a/src/modules/physics/box2d/Source/Common/Fixed.h b/src/modules/physics/box2d/Source/Common/Fixed.h deleted file mode 100644 index b4d4d3be7..000000000 --- a/src/modules/physics/box2d/Source/Common/Fixed.h +++ /dev/null @@ -1,477 +0,0 @@ -/* -Copyright (c) 2006 Henry Strickland & Ryan Seto - 2007-2008 Tobias Weyand (modifications and extensions) - -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. - - (* http://www.opensource.org/licenses/mit-license.php *) -*/ - -#ifndef _FIXED_H_ -#define _FIXED_H_ - -#include - -#ifdef TARGET_IS_NDS - -#include "nds.h" - -#endif - -#define FIXED_BP 16 -#define FIXED_MAX ((1<<(32-FIXED_BP-1))-1) -#define FIXED_MIN (-(1<<(32-FIXED_BP-1))) -#define FIXED_EPSILON (Fixed(0.00007f)) - -#define G_1_DIV_PI 20861 - -class Fixed { - - private: - - int g; // the guts - - const static int BP= FIXED_BP; // how many low bits are right of Binary Point - const static int BP2= BP*2; // how many low bits are right of Binary Point - const static int BPhalf= BP/2; // how many low bits are right of Binary Point - - double STEP(); // smallest step we can represent - - // for private construction via guts - enum FixedRaw { RAW }; - Fixed(FixedRaw, int guts); - - public: - - Fixed(); - Fixed(const Fixed &a); - Fixed(float a); - Fixed(double a); - Fixed(int a); - Fixed(long a); - - Fixed& operator =(const Fixed a); - Fixed& operator =(float a); - Fixed& operator =(double a); - Fixed& operator =(int a); - Fixed& operator =(long a); - - operator float(); - operator double(); - operator int(); - operator long(); - operator unsigned short(); - - operator float() const; - - Fixed operator +() const; - Fixed operator -() const; - - Fixed operator +(const Fixed a) const; - Fixed operator -(const Fixed a) const; -#if 1 - // more acurate, using long long - Fixed operator *(const Fixed a) const; -#else - // faster, but with only half as many bits right of binary point - Fixed operator *(const Fixed a) const; -#endif - Fixed operator /(const Fixed a) const; - - Fixed operator *(unsigned short a) const; - Fixed operator *(int a) const; - - Fixed operator +(float a) const; - Fixed operator -(float a) const; - Fixed operator *(float a) const; - Fixed operator /(float a) const; - - Fixed operator +(double a) const; - Fixed operator -(double a) const; - Fixed operator *(double a) const; - Fixed operator /(double a) const; - - Fixed operator >>(int a) const; - Fixed operator <<(int a) const; - - Fixed& operator +=(Fixed a); - Fixed& operator -=(Fixed a); - Fixed& operator *=(Fixed a); - Fixed& operator /=(Fixed a); - - Fixed& operator +=(int a); - Fixed& operator -=(int a); - Fixed& operator *=(int a); - Fixed& operator /=(int a); - - Fixed& operator +=(long a); - Fixed& operator -=(long a); - Fixed& operator *=(long a); - Fixed& operator /=(long a); - - Fixed& operator +=(float a); - Fixed& operator -=(float a); - Fixed& operator *=(float a); - Fixed& operator /=(float a); - - Fixed& operator +=(double a); - Fixed& operator -=(double a); - Fixed& operator *=(double a); - Fixed& operator /=(double a); - - bool operator ==(const Fixed a) const; - bool operator !=(const Fixed a) const; - bool operator <=(const Fixed a) const; - bool operator >=(const Fixed a) const; - bool operator <(const Fixed a) const; - bool operator >(const Fixed a) const; - - bool operator ==(float a) const; - bool operator !=(float a) const; - bool operator <=(float a) const; - bool operator >=(float a) const; - bool operator <(float a) const; - bool operator >(float a) const; - - bool operator ==(double a) const; - bool operator !=(double a) const; - bool operator <=(double a) const; - bool operator >=(double a) const; - bool operator <(double a) const; - bool operator >(double a) const; - - bool operator >(int a) const; - bool operator <(int a) const; - bool operator >=(int a) const; - bool operator <=(int a) const; - - Fixed abs(); - Fixed sqrt(); -#ifdef TARGET_IS_NDS - Fixed cosf(); - Fixed sinf(); - Fixed tanf(); -#endif -}; - -// -// Implementation -// - -inline double Fixed::STEP() { return 1.0 / (1<>BP; } -inline Fixed::operator long() { return g>>BP; } -//#pragma warning(disable: 4244) //HARDWIRE added pragma to prevent VS2005 compilation error -inline Fixed::operator unsigned short() { return g>>BP; } -inline Fixed::operator float() const { return g / (float)(1<> BP)); } - -#elif 0 - -// check for overflow and figure out where. Must specify -rdynamic in linker -#include -#include -#include - -inline Fixed Fixed::operator *(const Fixed a) const { - long long x = ((long long)g * (long long)a.g ); - if(x > 0x7fffffffffffLL || x < -0x7fffffffffffLL) { - printf("overflow"); - void *array[2]; - int nSize = backtrace(array, 2); - char **symbols = backtrace_symbols(array, nSize); - for(int i=0; i>BP)); -} - -#else -// faster, but with only half as many bits right of binary point -inline Fixed Fixed::operator *(const Fixed a) const { return Fixed(RAW, (g>>BPhalf) * (a.g>>BPhalf) ); } -#endif - - -#ifdef TARGET_IS_NDS -// Division using the DS's maths coprocessor -inline Fixed Fixed::operator /(const Fixed a) const -{ - //printf("%d %d\n", (long long)g << BP, a.g); - return Fixed(RAW, int( div64((long long)g << BP, a.g) ) ); -} -#else -inline Fixed Fixed::operator /(const Fixed a) const -{ - return Fixed(RAW, int( (((long long)g << BP2) / (long long)(a.g)) >> BP) ); - //return Fixed(RAW, int( (((long long)g << BP) / (long long)(a.g)) ) ); -} -#endif - -inline Fixed Fixed::operator *(unsigned short a) const { return operator*(Fixed(a)); } -inline Fixed Fixed::operator *(int a) const { return operator*(Fixed(a)); } - -inline Fixed Fixed::operator +(float a) const { return Fixed(RAW, g + Fixed(a).g); } -inline Fixed Fixed::operator -(float a) const { return Fixed(RAW, g - Fixed(a).g); } -inline Fixed Fixed::operator *(float a) const { return Fixed(RAW, (g>>BPhalf) * (Fixed(a).g>>BPhalf) ); } -//inline Fixed Fixed::operator /(float a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(Fixed(a).g)) >> BP) ); } -inline Fixed Fixed::operator /(float a) const { return operator/(Fixed(a)); } - -inline Fixed Fixed::operator +(double a) const { return Fixed(RAW, g + Fixed(a).g); } -inline Fixed Fixed::operator -(double a) const { return Fixed(RAW, g - Fixed(a).g); } -inline Fixed Fixed::operator *(double a) const { return Fixed(RAW, (g>>BPhalf) * (Fixed(a).g>>BPhalf) ); } -//inline Fixed Fixed::operator /(double a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(Fixed(a).g)) >> BP) ); } -inline Fixed Fixed::operator /(double a) const { return operator/(Fixed(a)); } - -inline Fixed Fixed::operator >>(int a) const { return Fixed(RAW, g >> a); } -inline Fixed Fixed::operator <<(int a) const { return Fixed(RAW, g << a); } - -inline Fixed& Fixed::operator +=(Fixed a) { return *this = *this + a; } -inline Fixed& Fixed::operator -=(Fixed a) { return *this = *this - a; } -inline Fixed& Fixed::operator *=(Fixed a) { return *this = *this * a; } -//inline Fixed& Fixed::operator /=(Fixed a) { return *this = *this / a; } -inline Fixed& Fixed::operator /=(Fixed a) { return *this = operator/(a); } - -inline Fixed& Fixed::operator +=(int a) { return *this = *this + (Fixed)a; } -inline Fixed& Fixed::operator -=(int a) { return *this = *this - (Fixed)a; } -inline Fixed& Fixed::operator *=(int a) { return *this = *this * (Fixed)a; } -//inline Fixed& Fixed::operator /=(int a) { return *this = *this / (Fixed)a; } -inline Fixed& Fixed::operator /=(int a) { return *this = operator/((Fixed)a); } - -inline Fixed& Fixed::operator +=(long a) { return *this = *this + (Fixed)a; } -inline Fixed& Fixed::operator -=(long a) { return *this = *this - (Fixed)a; } -inline Fixed& Fixed::operator *=(long a) { return *this = *this * (Fixed)a; } -//inline Fixed& Fixed::operator /=(long a) { return *this = *this / (Fixed)a; } -inline Fixed& Fixed::operator /=(long a) { return *this = operator/((Fixed)a); } - -inline Fixed& Fixed::operator +=(float a) { return *this = *this + a; } -inline Fixed& Fixed::operator -=(float a) { return *this = *this - a; } -inline Fixed& Fixed::operator *=(float a) { return *this = *this * a; } -//inline Fixed& Fixed::operator /=(float a) { return *this = *this / a; } -inline Fixed& Fixed::operator /=(float a) { return *this = operator/(a); } - -inline Fixed& Fixed::operator +=(double a) { return *this = *this + a; } -inline Fixed& Fixed::operator -=(double a) { return *this = *this - a; } -inline Fixed& Fixed::operator *=(double a) { return *this = *this * a; } -//inline Fixed& Fixed::operator /=(double a) { return *this = *this / a; } -inline Fixed& Fixed::operator /=(double a) { return *this = operator/(a); } - -inline Fixed operator +(int a, const Fixed b) { return Fixed(a)+b; } -inline Fixed operator -(int a, const Fixed b) { return Fixed(a)-b; } -inline Fixed operator *(int a, const Fixed b) { return Fixed(a)*b; } -inline Fixed operator /(int a, const Fixed b) { return Fixed(a)/b; }; - -inline Fixed operator +(float a, const Fixed b) { return Fixed(a)+b; } -inline Fixed operator -(float a, const Fixed b) { return Fixed(a)-b; } -inline Fixed operator *(float a, const Fixed b) { return Fixed(a)*b; } -inline Fixed operator /(float a, const Fixed b) { return Fixed(a)/b; } - -inline bool Fixed::operator ==(const Fixed a) const { return g == a.g; } -inline bool Fixed::operator !=(const Fixed a) const { return g != a.g; } -inline bool Fixed::operator <=(const Fixed a) const { return g <= a.g; } -inline bool Fixed::operator >=(const Fixed a) const { return g >= a.g; } -inline bool Fixed::operator <(const Fixed a) const { return g < a.g; } -inline bool Fixed::operator >(const Fixed a) const { return g > a.g; } - -inline bool Fixed::operator ==(float a) const { return g == Fixed(a).g; } -inline bool Fixed::operator !=(float a) const { return g != Fixed(a).g; } -inline bool Fixed::operator <=(float a) const { return g <= Fixed(a).g; } -inline bool Fixed::operator >=(float a) const { return g >= Fixed(a).g; } -inline bool Fixed::operator <(float a) const { return g < Fixed(a).g; } -inline bool Fixed::operator >(float a) const { return g > Fixed(a).g; } - -inline bool Fixed::operator ==(double a) const { return g == Fixed(a).g; } -inline bool Fixed::operator !=(double a) const { return g != Fixed(a).g; } -inline bool Fixed::operator <=(double a) const { return g <= Fixed(a).g; } -inline bool Fixed::operator >=(double a) const { return g >= Fixed(a).g; } -inline bool Fixed::operator <(double a) const { return g < Fixed(a).g; } -inline bool Fixed::operator >(double a) const { return g > Fixed(a).g; } - -inline bool Fixed::operator >(int a) const { return g > Fixed(a).g; } -inline bool Fixed::operator <(int a) const { return g < Fixed(a).g; } -inline bool Fixed::operator >=(int a) const{ return g >= Fixed(a).g; }; -inline bool Fixed::operator <=(int a) const{ return g <= Fixed(a).g; }; - -inline bool operator ==(float a, const Fixed b) { return Fixed(a) == b; } -inline bool operator !=(float a, const Fixed b) { return Fixed(a) != b; } -inline bool operator <=(float a, const Fixed b) { return Fixed(a) <= b; } -inline bool operator >=(float a, const Fixed b) { return Fixed(a) >= b; } -inline bool operator <(float a, const Fixed b) { return Fixed(a) < b; } -inline bool operator >(float a, const Fixed b) { return Fixed(a) > b; } - -inline Fixed operator +(double a, const Fixed b) { return Fixed(a)+b; } -inline Fixed operator -(double a, const Fixed b) { return Fixed(a)-b; } -inline Fixed operator *(double a, const Fixed b) { return Fixed(a)*b; } -inline Fixed operator /(double a, const Fixed b) { return Fixed(a)/b; } - -inline bool operator ==(double a, const Fixed b) { return Fixed(a) == b; } -inline bool operator !=(double a, const Fixed b) { return Fixed(a) != b; } -inline bool operator <=(double a, const Fixed b) { return Fixed(a) <= b; } -inline bool operator >=(double a, const Fixed b) { return Fixed(a) >= b; } -inline bool operator <(double a, const Fixed b) { return Fixed(a) < b; } -inline bool operator >(double a, const Fixed b) { return Fixed(a) > b; } - -inline bool operator ==(int a, const Fixed b) { return Fixed(a) == b; } -inline bool operator !=(int a, const Fixed b) { return Fixed(a) != b; } -inline bool operator <=(int a, const Fixed b) { return Fixed(a) <= b; } -inline bool operator >=(int a, const Fixed b) { return Fixed(a) >= b; } -inline bool operator <(int a, const Fixed b) { return Fixed(a) < b; } -inline bool operator >(int a, const Fixed b) { return Fixed(a) > b; } - -inline int& operator +=(int& a, const Fixed b) { a = (Fixed)a + b; return a; } -inline int& operator -=(int& a, const Fixed b) { a = (Fixed)a - b; return a; } -inline int& operator *=(int& a, const Fixed b) { a = (Fixed)a * b; return a; } -inline int& operator /=(int& a, const Fixed b) { a = (Fixed)a / b; return a; } - -inline long& operator +=(long& a, const Fixed b) { a = (Fixed)a + b; return a; } -inline long& operator -=(long& a, const Fixed b) { a = (Fixed)a - b; return a; } -inline long& operator *=(long& a, const Fixed b) { a = (Fixed)a * b; return a; } -inline long& operator /=(long& a, const Fixed b) { a = (Fixed)a / b; return a; } - -inline float& operator +=(float& a, const Fixed b) { a = a + b; return a; } -inline float& operator -=(float& a, const Fixed b) { a = a - b; return a; } -inline float& operator *=(float& a, const Fixed b) { a = a * b; return a; } -inline float& operator /=(float& a, const Fixed b) { a = a / b; return a; } - -inline double& operator +=(double& a, const Fixed b) { a = a + b; return a; } -inline double& operator -=(double& a, const Fixed b) { a = a - b; return a; } -inline double& operator *=(double& a, const Fixed b) { a = a * b; return a; } -inline double& operator /=(double& a, const Fixed b) { a = a / b; return a; } - -inline Fixed Fixed::abs() { return (g>0) ? Fixed(RAW, g) : Fixed(RAW, -g); } -inline Fixed abs(Fixed f) { return f.abs(); } - -//inline Fixed atan2(Fixed a, Fixed b) { return atan2f((float) a, (float) b); } -inline Fixed atan2(Fixed y, Fixed x) -{ - Fixed abs_y = y.abs() + FIXED_EPSILON; // avoid 0/0 - Fixed r, angle; - - if(x >= 0.0f) { - r = (x - abs_y) / (x + abs_y); - angle = 3.1415926/4.0; - } else { - r = (x + abs_y) / (abs_y - x); - angle = 3.0*3.1415926/4.0; - } - angle += Fixed(0.1963) * (r * r * r) - Fixed(0.9817) * r; - return (y < 0) ? -angle : angle; -} - -#if TARGET_IS_NDS - -static inline long nds_sqrt64(long long a) -{ - SQRT_CR = SQRT_64; - while(SQRT_CR & SQRT_BUSY); - SQRT_PARAM64 = a; - while(SQRT_CR & SQRT_BUSY); - - return SQRT_RESULT32; -} - -static inline int32 div6464(int64 num, int64 den) -{ - DIV_CR = DIV_64_64; - while(DIV_CR & DIV_BUSY); - DIV_NUMERATOR64 = num; - DIV_DENOMINATOR64 = den; - while(DIV_CR & DIV_BUSY); - - return (DIV_RESULT32); -} - -inline Fixed Fixed::sqrt() -{ - return Fixed(RAW, nds_sqrt64(((long long)(g))<>= 2 ) - { - if ( ( left & -m ) > root ) - left -= ( root += m ), root += m; - root >>= 1; - } - return Fixed(RAW, root); -} -#endif - -inline Fixed sqrt(Fixed a) { return a.sqrt(); } -inline Fixed sqrtf(Fixed a) { return a.sqrt(); } - -#endif - -#ifdef TARGET_IS_NDS -// Use the libnds lookup tables for trigonometry functions -inline Fixed Fixed::cosf() { - int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; - if(idx < 0) - idx += 512; - return Fixed(RAW, COS_bin[idx] << 4); -} -inline Fixed cosf(Fixed x) { return x.cosf(); } -inline Fixed Fixed::sinf() { - int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; - if(idx < 0) - idx += 512; - return Fixed(RAW, SIN_bin[idx] << 4); -} -inline Fixed sinf(Fixed x) { return x.sinf(); } -inline Fixed Fixed::tanf() { - int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; - if(idx < 0) - idx += 512; - return Fixed(RAW, TAN_bin[idx] << 4); -} -inline Fixed tanf(Fixed x) { return x.tanf(); } - - -#endif diff --git a/src/modules/physics/box2d/Source/Common/b2Math.cpp b/src/modules/physics/box2d/Source/Common/b2Math.cpp deleted file mode 100644 index 69162449a..000000000 --- a/src/modules/physics/box2d/Source/Common/b2Math.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Math.h" - -const b2Vec2 b2Vec2_zero(0.0f, 0.0f); -const b2Mat22 b2Mat22_identity(1.0f, 0.0f, 0.0f, 1.0f); -const b2XForm b2XForm_identity(b2Vec2_zero, b2Mat22_identity); - -void b2Sweep::GetXForm(b2XForm* xf, float32 t) const -{ - // center = p + R * localCenter - if (1.0f - t0 > B2_FLT_EPSILON) - { - float32 alpha = (t - t0) / (1.0f - t0); - xf->position = (1.0f - alpha) * c0 + alpha * c; - float32 angle = (1.0f - alpha) * a0 + alpha * a; - xf->R.Set(angle); - } - else - { - xf->position = c; - xf->R.Set(a); - } - - // Shift to origin - xf->position -= b2Mul(xf->R, localCenter); -} - -void b2Sweep::Advance(float32 t) -{ - if (t0 < t && 1.0f - t0 > B2_FLT_EPSILON) - { - float32 alpha = (t - t0) / (1.0f - t0); - c0 = (1.0f - alpha) * c0 + alpha * c; - a0 = (1.0f - alpha) * a0 + alpha * a; - t0 = t; - } -} diff --git a/src/modules/physics/box2d/Source/Common/jtypes.h b/src/modules/physics/box2d/Source/Common/jtypes.h deleted file mode 100644 index 3747ce54d..000000000 --- a/src/modules/physics/box2d/Source/Common/jtypes.h +++ /dev/null @@ -1,139 +0,0 @@ -/*--------------------------------------------------------------------------------- - $Id: jtypes.h,v 1.17 2007/07/18 05:20:45 wntrmute Exp $ - - jtypes.h -- Common types (and a few useful macros) - - Copyright (C) 2005 - Michael Noland (joat) - Jason Rogers (dovoto) - Dave Murphy (WinterMute) - Chris Double (doublec) - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any - damages arising from the use of this software. - - Permission is granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - 2. Altered source versions must be plainly marked as 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 NDS_JTYPES_INCLUDE -#define NDS_JTYPES_INCLUDE -//--------------------------------------------------------------------------------- - - -#define PACKED __attribute__ ((packed)) -#define packed_struct struct PACKED - -//--------------------------------------------------------------------------------- -// libgba compatible section macros -//--------------------------------------------------------------------------------- -#define ITCM_CODE __attribute__((section(".itcm"), long_call)) - -#define DTCM_DATA __attribute__((section(".dtcm"))) -#define DTCM_BSS __attribute__((section(".sbss"))) -#define ALIGN(m) __attribute__((aligned (m))) - -#define PACKED __attribute__ ((packed)) -#define packed_struct struct PACKED - -//--------------------------------------------------------------------------------- -// These are linked to the bin2o macro in the Makefile -//--------------------------------------------------------------------------------- -#define GETRAW(name) (name) -#define GETRAWSIZE(name) ((int)name##_size) -#define GETRAWEND(name) ((int)name##_end) - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -#define BIT(n) (1 << (n)) - -// define libnds types in terms of stdint -#include - -typedef uint8_t uint8; -typedef uint16_t uint16; -typedef uint32_t uint32; -typedef uint64_t uint64; - -typedef int8_t int8; -typedef int16_t int16; -typedef int32_t int32; -typedef int64_t int64; - -//typedef float float32; -typedef double float64; - -typedef volatile uint8_t vuint8; -typedef volatile uint16_t vuint16; -typedef volatile uint32_t vuint32; -typedef volatile uint64_t vuint64; - -typedef volatile int8_t vint8; -typedef volatile int16_t vint16; -typedef volatile int32_t vint32; -typedef volatile int64_t vint64; - -typedef volatile float vfloat32; -typedef volatile float64 vfloat64; - -typedef uint8_t byte; - -typedef uint8_t u8; -typedef uint16_t u16; -typedef uint32_t u32; -typedef uint64_t u64; - -typedef int8_t s8; -typedef int16_t s16; -typedef int32_t s32; -typedef int64_t s64; - -typedef volatile u8 vu8; -typedef volatile u16 vu16; -typedef volatile u32 vu32; -typedef volatile u64 vu64; - -typedef volatile s8 vs8; -typedef volatile s16 vs16; -typedef volatile s32 vs32; -typedef volatile s64 vs64; - -typedef struct touchPosition { - int16 x; - int16 y; - int16 px; - int16 py; - int16 z1; - int16 z2; -} touchPosition; - - -#ifndef __cplusplus -/** C++ compatible bool for C - -*/ -typedef enum { false, true } bool; -#endif - -// Handy function pointer typedefs -typedef void ( * IntFn)(void); -typedef void (* VoidFunctionPointer)(void); -typedef void (* fp)(void); - -//--------------------------------------------------------------------------------- -#endif -//--------------------------------------------------------------------------------- diff --git a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2CircleContact.cpp b/src/modules/physics/box2d/Source/Dynamics/Contacts/b2CircleContact.cpp deleted file mode 100644 index 8b73cb350..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2CircleContact.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2CircleContact.h" -#include "../b2Body.h" -#include "../b2WorldCallbacks.h" -#include "../../Common/b2BlockAllocator.h" - -#include -#include - -b2Contact* b2CircleContact::Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) -{ - void* mem = allocator->Allocate(sizeof(b2CircleContact)); - return new (mem) b2CircleContact(shape1, shape2); -} - -void b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - ((b2CircleContact*)contact)->~b2CircleContact(); - allocator->Free(contact, sizeof(b2CircleContact)); -} - -b2CircleContact::b2CircleContact(b2Shape* s1, b2Shape* s2) -: b2Contact(s1, s2) -{ - b2Assert(m_shape1->GetType() == e_circleShape); - b2Assert(m_shape2->GetType() == e_circleShape); - m_manifold.pointCount = 0; - m_manifold.points[0].normalImpulse = 0.0f; - m_manifold.points[0].tangentImpulse = 0.0f; -} - -void b2CircleContact::Evaluate(b2ContactListener* listener) -{ - b2Body* b1 = m_shape1->GetBody(); - b2Body* b2 = m_shape2->GetBody(); - - b2Manifold m0; - memcpy(&m0, &m_manifold, sizeof(b2Manifold)); - - b2CollideCircles(&m_manifold, (b2CircleShape*)m_shape1, b1->GetXForm(), (b2CircleShape*)m_shape2, b2->GetXForm()); - - b2ContactPoint cp; - cp.shape1 = m_shape1; - cp.shape2 = m_shape2; - cp.friction = m_friction; - cp.restitution = m_restitution; - - if (m_manifold.pointCount > 0) - { - m_manifoldCount = 1; - b2ManifoldPoint* mp = m_manifold.points + 0; - - if (m0.pointCount == 0) - { - mp->normalImpulse = 0.0f; - mp->tangentImpulse = 0.0f; - - if (listener) - { - cp.position = b1->GetWorldPoint(mp->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m_manifold.normal; - cp.separation = mp->separation; - cp.id = mp->id; - listener->Add(&cp); - } - } - else - { - b2ManifoldPoint* mp0 = m0.points + 0; - mp->normalImpulse = mp0->normalImpulse; - mp->tangentImpulse = mp0->tangentImpulse; - - if (listener) - { - cp.position = b1->GetWorldPoint(mp->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m_manifold.normal; - cp.separation = mp->separation; - cp.id = mp->id; - listener->Persist(&cp); - } - } - } - else - { - m_manifoldCount = 0; - if (m0.pointCount > 0 && listener) - { - b2ManifoldPoint* mp0 = m0.points + 0; - cp.position = b1->GetWorldPoint(mp0->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp0->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp0->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m0.normal; - cp.separation = mp0->separation; - cp.id = mp0->id; - listener->Remove(&cp); - } - } -} diff --git a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.cpp b/src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.cpp deleted file mode 100644 index 3de5057fa..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Contact.h" -#include "b2CircleContact.h" -#include "b2PolyAndCircleContact.h" -#include "b2PolyContact.h" -#include "b2ContactSolver.h" -#include "../../Collision/b2Collision.h" -#include "../../Collision/Shapes/b2Shape.h" -#include "../../Common/b2BlockAllocator.h" -#include "../../Dynamics/b2World.h" -#include "../../Dynamics/b2Body.h" - -b2ContactRegister b2Contact::s_registers[e_shapeTypeCount][e_shapeTypeCount]; -bool b2Contact::s_initialized = false; - -void b2Contact::InitializeRegisters() -{ - AddType(b2CircleContact::Create, b2CircleContact::Destroy, e_circleShape, e_circleShape); - AddType(b2PolyAndCircleContact::Create, b2PolyAndCircleContact::Destroy, e_polygonShape, e_circleShape); - AddType(b2PolygonContact::Create, b2PolygonContact::Destroy, e_polygonShape, e_polygonShape); -} - -void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn, - b2ShapeType type1, b2ShapeType type2) -{ - b2Assert(e_unknownShape < type1 && type1 < e_shapeTypeCount); - b2Assert(e_unknownShape < type2 && type2 < e_shapeTypeCount); - - 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(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) -{ - if (s_initialized == false) - { - InitializeRegisters(); - s_initialized = true; - } - - b2ShapeType type1 = shape1->GetType(); - b2ShapeType type2 = shape2->GetType(); - - b2Assert(e_unknownShape < type1 && type1 < e_shapeTypeCount); - b2Assert(e_unknownShape < type2 && type2 < e_shapeTypeCount); - - b2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn; - if (createFcn) - { - if (s_registers[type1][type2].primary) - { - return createFcn(shape1, shape2, allocator); - } - else - { - b2Contact* c = createFcn(shape2, shape1, allocator); - for (int32 i = 0; i < c->GetManifoldCount(); ++i) - { - b2Manifold* m = c->GetManifolds() + i; - m->normal = -m->normal; - } - return c; - } - } - else - { - return NULL; - } -} - -void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - b2Assert(s_initialized == true); - - if (contact->GetManifoldCount() > 0) - { - contact->GetShape1()->GetBody()->WakeUp(); - contact->GetShape2()->GetBody()->WakeUp(); - } - - b2ShapeType type1 = contact->GetShape1()->GetType(); - b2ShapeType type2 = contact->GetShape2()->GetType(); - - b2Assert(e_unknownShape < type1 && type1 < e_shapeTypeCount); - b2Assert(e_unknownShape < type2 && type2 < e_shapeTypeCount); - - b2ContactDestroyFcn* destroyFcn = s_registers[type1][type2].destroyFcn; - destroyFcn(contact, allocator); -} - -b2Contact::b2Contact(b2Shape* s1, b2Shape* s2) -{ - m_flags = 0; - - if (s1->IsSensor() || s2->IsSensor()) - { - m_flags |= e_nonSolidFlag; - } - - m_shape1 = s1; - m_shape2 = s2; - - m_manifoldCount = 0; - - m_friction = b2MixFriction(m_shape1->GetFriction(), m_shape2->GetFriction()); - m_restitution = b2MixRestitution(m_shape1->GetRestitution(), m_shape2->GetRestitution()); - m_prev = NULL; - m_next = NULL; - - m_node1.contact = NULL; - m_node1.prev = NULL; - m_node1.next = NULL; - m_node1.other = NULL; - - m_node2.contact = NULL; - m_node2.prev = NULL; - m_node2.next = NULL; - m_node2.other = NULL; -} - -void b2Contact::Update(b2ContactListener* listener) -{ - int32 oldCount = GetManifoldCount(); - - Evaluate(listener); - - int32 newCount = GetManifoldCount(); - - b2Body* body1 = m_shape1->GetBody(); - b2Body* body2 = m_shape2->GetBody(); - - if (newCount == 0 && oldCount > 0) - { - body1->WakeUp(); - body2->WakeUp(); - } - - // Slow contacts don't generate TOI events. - if (body1->IsStatic() || body1->IsBullet() || body2->IsStatic() || body2->IsBullet()) - { - m_flags &= ~e_slowFlag; - } - else - { - m_flags |= e_slowFlag; - } -} diff --git a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.h b/src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.h deleted file mode 100644 index 3d6f0dae4..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2Contact.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 CONTACT_H -#define CONTACT_H - -#include "../../Common/b2Math.h" -#include "../../Collision/b2Collision.h" -#include "../../Collision/Shapes/b2Shape.h" - -class b2Body; -class b2Contact; -class b2World; -class b2BlockAllocator; -class b2StackAllocator; -class b2ContactListener; - -typedef b2Contact* b2ContactCreateFcn(b2Shape* shape1, b2Shape* shape2, 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 -}; - -/// This structure is used to report contact points. -struct b2ContactPoint -{ - b2Shape* shape1; ///< the first shape - b2Shape* shape2; ///< the second shape - b2Vec2 position; ///< position in world coordinates - b2Vec2 velocity; ///< velocity of point on body2 relative to point on body1 (pre-solver) - b2Vec2 normal; ///< points from shape1 to shape2 - float32 separation; ///< the separation is negative when shapes are touching - float32 friction; ///< the combined friction coefficient - float32 restitution; ///< the combined restitution coefficient - b2ContactID id; ///< the contact id identifies the features in contact -}; - -/// This structure is used to report contact point results. -struct b2ContactResult -{ - b2Shape* shape1; ///< the first shape - b2Shape* shape2; ///< the second shape - b2Vec2 position; ///< position in world coordinates - b2Vec2 normal; ///< points from shape1 to shape2 - float32 normalImpulse; ///< the normal impulse applied to body2 - float32 tangentImpulse; ///< the tangent impulse applied to body2 - b2ContactID id; ///< the contact id identifies the features in contact -}; - -/// 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 manifold array. - virtual b2Manifold* GetManifolds() = 0; - - /// Get the number of manifolds. This is 0 or 1 between convex shapes. - /// This may be greater than 1 for convex-vs-concave shapes. Each - /// manifold holds up to two contact points with a shared contact normal. - int32 GetManifoldCount() const; - - /// Is this contact solid? - /// @return true if this contact should generate a response. - bool IsSolid() const; - - /// Get the next contact in the world's contact list. - b2Contact* GetNext(); - - /// Get the first shape in this contact. - b2Shape* GetShape1(); - - /// Get the second shape in this contact. - b2Shape* GetShape2(); - - //--------------- Internals Below ------------------- -public: - - // m_flags - enum - { - e_nonSolidFlag = 0x0001, - e_slowFlag = 0x0002, - e_islandFlag = 0x0004, - e_toiFlag = 0x0008, - }; - - static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn, - b2ShapeType type1, b2ShapeType type2); - static void InitializeRegisters(); - static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); - static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - - b2Contact() : m_shape1(NULL), m_shape2(NULL) {} - b2Contact(b2Shape* shape1, b2Shape* shape2); - virtual ~b2Contact() {} - - void Update(b2ContactListener* listener); - virtual void Evaluate(b2ContactListener* listener) = 0; - static b2ContactRegister s_registers[e_shapeTypeCount][e_shapeTypeCount]; - static bool s_initialized; - - uint32 m_flags; - int32 m_manifoldCount; - - // World pool and list pointers. - b2Contact* m_prev; - b2Contact* m_next; - - // Nodes for connecting bodies. - b2ContactEdge m_node1; - b2ContactEdge m_node2; - - b2Shape* m_shape1; - b2Shape* m_shape2; - - // Combined friction - float32 m_friction; - float32 m_restitution; - - float32 m_toi; -}; - -inline int32 b2Contact::GetManifoldCount() const -{ - return m_manifoldCount; -} - -inline bool b2Contact::IsSolid() const -{ - return (m_flags & e_nonSolidFlag) == 0; -} - -inline b2Contact* b2Contact::GetNext() -{ - return m_next; -} - -inline b2Shape* b2Contact::GetShape1() -{ - return m_shape1; -} - -inline b2Shape* b2Contact::GetShape2() -{ - return m_shape2; -} - -#endif diff --git a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2ContactSolver.cpp b/src/modules/physics/box2d/Source/Dynamics/Contacts/b2ContactSolver.cpp deleted file mode 100644 index bc82d2558..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2ContactSolver.cpp +++ /dev/null @@ -1,360 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2ContactSolver.h" -#include "b2Contact.h" -#include "../b2Body.h" -#include "../b2World.h" -#include "../../Common/b2StackAllocator.h" - -b2ContactSolver::b2ContactSolver(const b2TimeStep& step, b2Contact** contacts, int32 contactCount, b2StackAllocator* allocator) -{ - m_step = step; - m_allocator = allocator; - - m_constraintCount = 0; - for (int32 i = 0; i < contactCount; ++i) - { - b2Assert(contacts[i]->IsSolid()); - m_constraintCount += contacts[i]->GetManifoldCount(); - } - - m_constraints = (b2ContactConstraint*)m_allocator->Allocate(m_constraintCount * sizeof(b2ContactConstraint)); - - int32 count = 0; - for (int32 i = 0; i < contactCount; ++i) - { - b2Contact* contact = contacts[i]; - - b2Body* b1 = contact->m_shape1->GetBody(); - b2Body* b2 = contact->m_shape2->GetBody(); - int32 manifoldCount = contact->GetManifoldCount(); - b2Manifold* manifolds = contact->GetManifolds(); - float32 friction = contact->m_friction; - float32 restitution = contact->m_restitution; - - b2Vec2 v1 = b1->m_linearVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - float32 w2 = b2->m_angularVelocity; - - for (int32 j = 0; j < manifoldCount; ++j) - { - b2Manifold* manifold = manifolds + j; - - b2Assert(manifold->pointCount > 0); - - const b2Vec2 normal = manifold->normal; - - b2Assert(count < m_constraintCount); - b2ContactConstraint* c = m_constraints + count; - c->body1 = b1; - c->body2 = b2; - c->manifold = manifold; - c->normal = normal; - c->pointCount = manifold->pointCount; - c->friction = friction; - c->restitution = restitution; - - for (int32 k = 0; k < c->pointCount; ++k) - { - b2ManifoldPoint* cp = manifold->points + k; - b2ContactConstraintPoint* ccp = c->points + k; - - ccp->normalImpulse = cp->normalImpulse; - ccp->tangentImpulse = cp->tangentImpulse; - ccp->separation = cp->separation; - ccp->positionImpulse = 0.0f; - - ccp->localAnchor1 = cp->localPoint1; - ccp->localAnchor2 = cp->localPoint2; - ccp->r1 = b2Mul(b1->GetXForm().R, cp->localPoint1 - b1->GetLocalCenter()); - ccp->r2 = b2Mul(b2->GetXForm().R, cp->localPoint2 - b2->GetLocalCenter()); - - float32 r1Sqr = b2Dot(ccp->r1, ccp->r1); - float32 r2Sqr = b2Dot(ccp->r2, ccp->r2); - float32 rn1 = b2Dot(ccp->r1, normal); - float32 rn2 = b2Dot(ccp->r2, normal); - - float32 kNormal = b1->m_invMass + b2->m_invMass; - kNormal += b1->m_invI * (r1Sqr - rn1 * rn1) + b2->m_invI * (r2Sqr - rn2 * rn2); - - b2Assert(kNormal > B2_FLT_EPSILON); - ccp->normalMass = 1.0f / kNormal; - - float32 kEqualized = b1->m_mass * b1->m_invMass + b2->m_mass * b2->m_invMass; - kEqualized += b1->m_mass * b1->m_invI * (r1Sqr - rn1 * rn1) + b2->m_mass * b2->m_invI * (r2Sqr - rn2 * rn2); - - b2Assert(kEqualized > B2_FLT_EPSILON); - ccp->equalizedMass = 1.0f / kEqualized; - - b2Vec2 tangent = b2Cross(normal, 1.0f); - - float32 rt1 = b2Dot(ccp->r1, tangent); - float32 rt2 = b2Dot(ccp->r2, tangent); - float32 kTangent = b1->m_invMass + b2->m_invMass; - kTangent += b1->m_invI * (r1Sqr - rt1 * rt1) + b2->m_invI * (r2Sqr - rt2 * rt2); - - b2Assert(kTangent > B2_FLT_EPSILON); - ccp->tangentMass = 1.0f / kTangent; - - // Setup a velocity bias for restitution. - ccp->velocityBias = 0.0f; - if (ccp->separation > 0.0f) - { - ccp->velocityBias = -60.0f * ccp->separation; // TODO_ERIN b2TimeStep - } - - float32 vRel = b2Dot(c->normal, v2 + b2Cross(w2, ccp->r2) - v1 - b2Cross(w1, ccp->r1)); - if (vRel < -b2_velocityThreshold) - { - ccp->velocityBias += -c->restitution * vRel; - } - } - - ++count; - } - } - - b2Assert(count == m_constraintCount); -} - -b2ContactSolver::~b2ContactSolver() -{ - m_allocator->Free(m_constraints); -} - -void b2ContactSolver::InitVelocityConstraints(const b2TimeStep& step) -{ - // Warm start. - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - - b2Body* b1 = c->body1; - b2Body* b2 = c->body2; - float32 invMass1 = b1->m_invMass; - float32 invI1 = b1->m_invI; - float32 invMass2 = b2->m_invMass; - float32 invI2 = b2->m_invI; - b2Vec2 normal = c->normal; - b2Vec2 tangent = b2Cross(normal, 1.0f); - - if (step.warmStarting) - { - for (int32 j = 0; j < c->pointCount; ++j) - { - b2ContactConstraintPoint* ccp = c->points + j; - ccp->normalImpulse *= step.dtRatio; - ccp->tangentImpulse *= step.dtRatio; - b2Vec2 P = ccp->normalImpulse * normal + ccp->tangentImpulse * tangent; - b1->m_angularVelocity -= invI1 * b2Cross(ccp->r1, P); - b1->m_linearVelocity -= invMass1 * P; - b2->m_angularVelocity += invI2 * b2Cross(ccp->r2, P); - b2->m_linearVelocity += invMass2 * P; - } - } - else - { - for (int32 j = 0; j < c->pointCount; ++j) - { - b2ContactConstraintPoint* ccp = c->points + j; - ccp->normalImpulse = 0.0f; - ccp->tangentImpulse = 0.0f; - } - } - } -} - -void b2ContactSolver::SolveVelocityConstraints() -{ - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - b2Body* b1 = c->body1; - b2Body* b2 = c->body2; - float32 w1 = b1->m_angularVelocity; - float32 w2 = b2->m_angularVelocity; - b2Vec2 v1 = b1->m_linearVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 invMass1 = b1->m_invMass; - float32 invI1 = b1->m_invI; - float32 invMass2 = b2->m_invMass; - float32 invI2 = b2->m_invI; - b2Vec2 normal = c->normal; - b2Vec2 tangent = b2Cross(normal, 1.0f); - float32 friction = c->friction; -//#define DEFERRED_UPDATE -#ifdef DEFERRED_UPDATE - b2Vec2 b1_linearVelocity = b1->m_linearVelocity; - float32 b1_angularVelocity = b1->m_angularVelocity; - b2Vec2 b2_linearVelocity = b2->m_linearVelocity; - float32 b2_angularVelocity = b2->m_angularVelocity; -#endif - // Solve normal constraints - for (int32 j = 0; j < c->pointCount; ++j) - { - b2ContactConstraintPoint* ccp = c->points + j; - - // Relative velocity at contact - b2Vec2 dv = v2 + b2Cross(w2, ccp->r2) - v1 - b2Cross(w1, ccp->r1); - - // Compute normal impulse - float32 vn = b2Dot(dv, normal); - float32 lambda = -ccp->normalMass * (vn - ccp->velocityBias); - - // b2Clamp the accumulated impulse - float32 newImpulse = b2Max(ccp->normalImpulse + lambda, 0.0f); - lambda = newImpulse - ccp->normalImpulse; - - // Apply contact impulse - b2Vec2 P = lambda * normal; -#ifdef DEFERRED_UPDATE - b1_linearVelocity -= invMass1 * P; - b1_angularVelocity -= invI1 * b2Cross(r1, P); - - b2_linearVelocity += invMass2 * P; - b2_angularVelocity += invI2 * b2Cross(r2, P); -#else - v1 -= invMass1 * P; - w1 -= invI1 * b2Cross(ccp->r1, P); - - v2 += invMass2 * P; - w2 += invI2 * b2Cross(ccp->r2, P); -#endif - ccp->normalImpulse = newImpulse; - } - -#ifdef DEFERRED_UPDATE - b1->m_linearVelocity = b1_linearVelocity; - b1->m_angularVelocity = b1_angularVelocity; - b2->m_linearVelocity = b2_linearVelocity; - b2->m_angularVelocity = b2_angularVelocity; -#endif - // Solve tangent constraints - for (int32 j = 0; j < c->pointCount; ++j) - { - b2ContactConstraintPoint* ccp = c->points + j; - - // Relative velocity at contact - b2Vec2 dv = v2 + b2Cross(w2, ccp->r2) - v1 - b2Cross(w1, ccp->r1); - - // Compute tangent force - float32 vt = b2Dot(dv, tangent); - float32 lambda = ccp->tangentMass * (-vt); - - // b2Clamp the accumulated force - float32 maxFriction = friction * ccp->normalImpulse; - float32 newImpulse = b2Clamp(ccp->tangentImpulse + lambda, -maxFriction, maxFriction); - lambda = newImpulse - ccp->tangentImpulse; - - // Apply contact impulse - b2Vec2 P = lambda * tangent; - - v1 -= invMass1 * P; - w1 -= invI1 * b2Cross(ccp->r1, P); - - v2 += invMass2 * P; - w2 += invI2 * b2Cross(ccp->r2, P); - - ccp->tangentImpulse = newImpulse; - } - - b1->m_linearVelocity = v1; - b1->m_angularVelocity = w1; - b2->m_linearVelocity = v2; - b2->m_angularVelocity = w2; - } -} - -void b2ContactSolver::FinalizeVelocityConstraints() -{ - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - b2Manifold* m = c->manifold; - - for (int32 j = 0; j < c->pointCount; ++j) - { - m->points[j].normalImpulse = c->points[j].normalImpulse; - m->points[j].tangentImpulse = c->points[j].tangentImpulse; - } - } -} - -bool b2ContactSolver::SolvePositionConstraints(float32 baumgarte) -{ - float32 minSeparation = 0.0f; - - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - b2Body* b1 = c->body1; - b2Body* b2 = c->body2; - float32 invMass1 = b1->m_mass * b1->m_invMass; - float32 invI1 = b1->m_mass * b1->m_invI; - float32 invMass2 = b2->m_mass * b2->m_invMass; - float32 invI2 = b2->m_mass * b2->m_invI; - - b2Vec2 normal = c->normal; - - // Solver normal constraints - for (int32 j = 0; j < c->pointCount; ++j) - { - b2ContactConstraintPoint* ccp = c->points + j; - - b2Vec2 r1 = b2Mul(b1->GetXForm().R, ccp->localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, ccp->localAnchor2 - b2->GetLocalCenter()); - - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 dp = p2 - p1; - - // Approximate the current separation. - float32 separation = b2Dot(dp, normal) + ccp->separation; - - // Track max constraint error. - minSeparation = b2Min(minSeparation, separation); - - // Prevent large corrections and allow slop. - float32 C = baumgarte * b2Clamp(separation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - - // Compute normal impulse - float32 dImpulse = -ccp->equalizedMass * C; - - // b2Clamp the accumulated impulse - float32 impulse0 = ccp->positionImpulse; - ccp->positionImpulse = b2Max(impulse0 + dImpulse, 0.0f); - dImpulse = ccp->positionImpulse - impulse0; - - b2Vec2 impulse = dImpulse * normal; - - b1->m_sweep.c -= invMass1 * impulse; - b1->m_sweep.a -= invI1 * b2Cross(r1, impulse); - b1->SynchronizeTransform(); - - b2->m_sweep.c += invMass2 * impulse; - b2->m_sweep.a += invI2 * b2Cross(r2, impulse); - b2->SynchronizeTransform(); - } - } - - // 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/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyAndCircleContact.cpp b/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyAndCircleContact.cpp deleted file mode 100644 index 2d0047854..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyAndCircleContact.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2PolyAndCircleContact.h" -#include "../b2Body.h" -#include "../b2WorldCallbacks.h" -#include "../../Common/b2BlockAllocator.h" - -#include -#include - -b2Contact* b2PolyAndCircleContact::Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) -{ - void* mem = allocator->Allocate(sizeof(b2PolyAndCircleContact)); - return new (mem) b2PolyAndCircleContact(shape1, shape2); -} - -void b2PolyAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - ((b2PolyAndCircleContact*)contact)->~b2PolyAndCircleContact(); - allocator->Free(contact, sizeof(b2PolyAndCircleContact)); -} - -b2PolyAndCircleContact::b2PolyAndCircleContact(b2Shape* s1, b2Shape* s2) -: b2Contact(s1, s2) -{ - b2Assert(m_shape1->GetType() == e_polygonShape); - b2Assert(m_shape2->GetType() == e_circleShape); - m_manifold.pointCount = 0; - m_manifold.points[0].normalImpulse = 0.0f; - m_manifold.points[0].tangentImpulse = 0.0f; -} - -void b2PolyAndCircleContact::Evaluate(b2ContactListener* listener) -{ - b2Body* b1 = m_shape1->GetBody(); - b2Body* b2 = m_shape2->GetBody(); - - b2Manifold m0; - memcpy(&m0, &m_manifold, sizeof(b2Manifold)); - - b2CollidePolygonAndCircle(&m_manifold, (b2PolygonShape*)m_shape1, b1->GetXForm(), (b2CircleShape*)m_shape2, b2->GetXForm()); - - bool persisted[b2_maxManifoldPoints] = {false, false}; - - b2ContactPoint cp; - cp.shape1 = m_shape1; - cp.shape2 = m_shape2; - cp.friction = m_friction; - cp.restitution = m_restitution; - - // Match contact ids to facilitate warm starting. - if (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* mp = m_manifold.points + i; - mp->normalImpulse = 0.0f; - mp->tangentImpulse = 0.0f; - bool found = false; - b2ContactID id = mp->id; - - for (int32 j = 0; j < m0.pointCount; ++j) - { - if (persisted[j] == true) - { - continue; - } - - b2ManifoldPoint* mp0 = m0.points + j; - - if (mp0->id.key == id.key) - { - persisted[j] = true; - mp->normalImpulse = mp0->normalImpulse; - mp->tangentImpulse = mp0->tangentImpulse; - - // A persistent point. - found = true; - - // Report persistent point. - if (listener != NULL) - { - cp.position = b1->GetWorldPoint(mp->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m_manifold.normal; - cp.separation = mp->separation; - cp.id = id; - listener->Persist(&cp); - } - break; - } - } - - // Report added point. - if (found == false && listener != NULL) - { - cp.position = b1->GetWorldPoint(mp->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m_manifold.normal; - cp.separation = mp->separation; - cp.id = id; - listener->Add(&cp); - } - } - - m_manifoldCount = 1; - } - else - { - m_manifoldCount = 0; - } - - if (listener == NULL) - { - return; - } - - // Report removed points. - for (int32 i = 0; i < m0.pointCount; ++i) - { - if (persisted[i]) - { - continue; - } - - b2ManifoldPoint* mp0 = m0.points + i; - cp.position = b1->GetWorldPoint(mp0->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp0->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp0->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m0.normal; - cp.separation = mp0->separation; - cp.id = mp0->id; - listener->Remove(&cp); - } -} diff --git a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyContact.cpp b/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyContact.cpp deleted file mode 100644 index 258882200..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Contacts/b2PolyContact.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2PolyContact.h" -#include "../b2Body.h" -#include "../b2WorldCallbacks.h" -#include "../../Common/b2BlockAllocator.h" - -#include -#include -#include - -b2Contact* b2PolygonContact::Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) -{ - void* mem = allocator->Allocate(sizeof(b2PolygonContact)); - return new (mem) b2PolygonContact(shape1, shape2); -} - -void b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - ((b2PolygonContact*)contact)->~b2PolygonContact(); - allocator->Free(contact, sizeof(b2PolygonContact)); -} - -b2PolygonContact::b2PolygonContact(b2Shape* s1, b2Shape* s2) - : b2Contact(s1, s2) -{ - b2Assert(m_shape1->GetType() == e_polygonShape); - b2Assert(m_shape2->GetType() == e_polygonShape); - m_manifold.pointCount = 0; -} - -void b2PolygonContact::Evaluate(b2ContactListener* listener) -{ - b2Body* b1 = m_shape1->GetBody(); - b2Body* b2 = m_shape2->GetBody(); - - b2Manifold m0; - memcpy(&m0, &m_manifold, sizeof(b2Manifold)); - - b2CollidePolygons(&m_manifold, (b2PolygonShape*)m_shape1, b1->GetXForm(), (b2PolygonShape*)m_shape2, b2->GetXForm()); - - bool persisted[b2_maxManifoldPoints] = {false, false}; - - b2ContactPoint cp; - cp.shape1 = m_shape1; - cp.shape2 = m_shape2; - cp.friction = m_friction; - cp.restitution = m_restitution; - - // Match contact ids to facilitate warm starting. - if (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* mp = m_manifold.points + i; - mp->normalImpulse = 0.0f; - mp->tangentImpulse = 0.0f; - bool found = false; - b2ContactID id = mp->id; - - for (int32 j = 0; j < m0.pointCount; ++j) - { - if (persisted[j] == true) - { - continue; - } - - b2ManifoldPoint* mp0 = m0.points + j; - - if (mp0->id.key == id.key) - { - persisted[j] = true; - mp->normalImpulse = mp0->normalImpulse; - mp->tangentImpulse = mp0->tangentImpulse; - - // A persistent point. - found = true; - - // Report persistent point. - if (listener != NULL) - { - cp.position = b1->GetWorldPoint(mp->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m_manifold.normal; - cp.separation = mp->separation; - cp.id = id; - listener->Persist(&cp); - } - break; - } - } - - // Report added point. - if (found == false && listener != NULL) - { - cp.position = b1->GetWorldPoint(mp->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m_manifold.normal; - cp.separation = mp->separation; - cp.id = id; - listener->Add(&cp); - } - } - - m_manifoldCount = 1; - } - else - { - m_manifoldCount = 0; - } - - if (listener == NULL) - { - return; - } - - // Report removed points. - for (int32 i = 0; i < m0.pointCount; ++i) - { - if (persisted[i]) - { - continue; - } - - b2ManifoldPoint* mp0 = m0.points + i; - cp.position = b1->GetWorldPoint(mp0->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp0->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp0->localPoint2); - cp.velocity = v2 - v1; - cp.normal = m0.normal; - cp.separation = mp0->separation; - cp.id = mp0->id; - listener->Remove(&cp); - } -} diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2MouseJoint.cpp b/src/modules/physics/box2d/Source/Dynamics/Joints/b2MouseJoint.cpp deleted file mode 100644 index 02bbefebc..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2MouseJoint.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2MouseJoint.h" -#include "../b2Body.h" -#include "../b2World.h" - -// 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) -{ - m_target = def->target; - m_localAnchor = b2MulT(m_body2->GetXForm(), m_target); - - m_maxForce = B2FORCE_INV_SCALE(def->maxForce); - m_impulse.SetZero(); - - float32 mass = m_body2->m_mass; - - // Frequency - float32 omega = 2.0f * b2_pi * def->frequencyHz; - - // Damping coefficient - float32 d = 2.0f * mass * def->dampingRatio * omega; - - // Spring stiffness - float32 k = (def->timeStep * mass) * (omega * omega); - - // magic formulas - b2Assert(d + k > B2_FLT_EPSILON); - m_gamma = 1.0f / (d + k); - m_beta = k / (d + k); -} - -void b2MouseJoint::SetTarget(const b2Vec2& target) -{ - if (m_body2->IsSleeping()) - { - m_body2->WakeUp(); - } - m_target = target; -} - -void b2MouseJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b = m_body2; - - // Compute the effective mass matrix. - b2Vec2 r = b2Mul(b->GetXForm().R, m_localAnchor - b->GetLocalCenter()); - - // 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] - float32 invMass = b->m_invMass; - float32 invI = b->m_invI; - - b2Mat22 K1; - K1.col1.x = invMass; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = invMass; - - b2Mat22 K2; - K2.col1.x = invI * r.y * r.y; K2.col2.x = -invI * r.x * r.y; - K2.col1.y = -invI * r.x * r.y; K2.col2.y = invI * r.x * r.x; - - b2Mat22 K = K1 + K2; - K.col1.x += m_gamma; - K.col2.y += m_gamma; - - m_mass = K.Invert(); - - m_C = b->m_sweep.c + r - m_target; - - // Cheat with some damping - b->m_angularVelocity *= 0.98f; - - // Warm starting. - b2Vec2 P = B2FORCE_SCALE(step.dt) * m_impulse; - b->m_linearVelocity += invMass * P; - b->m_angularVelocity += invI * b2Cross(r, P); -} - -void b2MouseJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b = m_body2; - - b2Vec2 r = b2Mul(b->GetXForm().R, m_localAnchor - b->GetLocalCenter()); - - // Cdot = v + cross(w, r) - b2Vec2 Cdot = b->m_linearVelocity + b2Cross(b->m_angularVelocity, r); - b2Vec2 force = -B2FORCE_INV_SCALE(step.inv_dt) * b2Mul(m_mass, Cdot + (m_beta * step.inv_dt) * m_C + B2FORCE_SCALE(step.dt) * (m_gamma * m_impulse)); - - b2Vec2 oldForce = m_impulse; - m_impulse += force; - float32 forceMagnitude = m_impulse.Length(); - if (forceMagnitude > m_maxForce) - { - m_impulse *= m_maxForce / forceMagnitude; - } - force = m_impulse - oldForce; - - b2Vec2 P = B2FORCE_SCALE(step.dt) * force; - b->m_linearVelocity += b->m_invMass * P; - b->m_angularVelocity += b->m_invI * b2Cross(r, P); -} - -b2Vec2 b2MouseJoint::GetAnchor1() const -{ - return m_target; -} - -b2Vec2 b2MouseJoint::GetAnchor2() const -{ - return m_body2->GetWorldPoint(m_localAnchor); -} - -b2Vec2 b2MouseJoint::GetReactionForce() const -{ - return B2FORCE_SCALE(float32(1.0))*m_impulse; -} - -float32 b2MouseJoint::GetReactionTorque() const -{ - return 0.0f; -} diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PrismaticJoint.cpp b/src/modules/physics/box2d/Source/Dynamics/Joints/b2PrismaticJoint.cpp deleted file mode 100644 index 758f4409d..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2PrismaticJoint.cpp +++ /dev/null @@ -1,478 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2PrismaticJoint.h" -#include "../b2Body.h" -#include "../b2World.h" - -// Linear constraint (point-to-line) -// d = p2 - p1 = x2 + r2 - x1 - r1 -// C = dot(ay1, d) -// Cdot = dot(d, cross(w1, ay1)) + dot(ay1, v2 + cross(w2, r2) - v1 - cross(w1, r1)) -// = -dot(ay1, v1) - dot(cross(d + r1, ay1), w1) + dot(ay1, v2) + dot(cross(r2, ay1), v2) -// J = [-ay1 -cross(d+r1,ay1) ay1 cross(r2,ay1)] -// -// Angular constraint -// C = a2 - a1 + a_initial -// Cdot = w2 - w1 -// J = [0 0 -1 0 0 1] - -// 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)] - -void b2PrismaticJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) -{ - body1 = b1; - body2 = b2; - localAnchor1 = body1->GetLocalPoint(anchor); - localAnchor2 = body2->GetLocalPoint(anchor); - localAxis1 = body1->GetLocalVector(axis); - referenceAngle = body2->GetAngle() - body1->GetAngle(); -} - -b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) -: b2Joint(def) -{ - m_localAnchor1 = def->localAnchor1; - m_localAnchor2 = def->localAnchor2; - m_localXAxis1 = def->localAxis1; - m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); - m_refAngle = def->referenceAngle; - - m_linearJacobian.SetZero(); - m_linearMass = 0.0f; - m_force = 0.0f; - - m_angularMass = 0.0f; - m_torque = 0.0f; - - m_motorJacobian.SetZero(); - m_motorMass = 0.0; - m_motorForce = 0.0f; - m_limitForce = 0.0f; - m_limitPositionImpulse = 0.0f; - - m_lowerTranslation = def->lowerTranslation; - m_upperTranslation = def->upperTranslation; - m_maxMotorForce = B2FORCE_INV_SCALE(def->maxMotorForce); - m_motorSpeed = def->motorSpeed; - m_enableLimit = def->enableLimit; - m_enableMotor = def->enableMotor; -} - -void b2PrismaticJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - // Compute the effective masses. - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); - - float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; - float32 invI1 = b1->m_invI, invI2 = b2->m_invI; - - // Compute point to line constraint effective mass. - // J = [-ay1 -cross(d+r1,ay1) ay1 cross(r2,ay1)] - b2Vec2 ay1 = b2Mul(b1->GetXForm().R, m_localYAxis1); - b2Vec2 e = b2->m_sweep.c + r2 - b1->m_sweep.c; // e = d + r1 - - m_linearJacobian.Set(-ay1, -b2Cross(e, ay1), ay1, b2Cross(r2, ay1)); - m_linearMass = invMass1 + invI1 * m_linearJacobian.angular1 * m_linearJacobian.angular1 + - invMass2 + invI2 * m_linearJacobian.angular2 * m_linearJacobian.angular2; - b2Assert(m_linearMass > B2_FLT_EPSILON); - m_linearMass = 1.0f / m_linearMass; - - // Compute angular constraint effective mass. - m_angularMass = invI1 + invI2; - if (m_angularMass > B2_FLT_EPSILON) - { - m_angularMass = 1.0f / m_angularMass; - } - - // Compute motor and limit terms. - if (m_enableLimit || m_enableMotor) - { - // The motor and limit share a Jacobian and effective mass. - b2Vec2 ax1 = b2Mul(b1->GetXForm().R, m_localXAxis1); - m_motorJacobian.Set(-ax1, -b2Cross(e, ax1), ax1, b2Cross(r2, ax1)); - m_motorMass = invMass1 + invI1 * m_motorJacobian.angular1 * m_motorJacobian.angular1 + - invMass2 + invI2 * m_motorJacobian.angular2 * m_motorJacobian.angular2; - b2Assert(m_motorMass > B2_FLT_EPSILON); - m_motorMass = 1.0f / m_motorMass; - - if (m_enableLimit) - { - b2Vec2 d = e - r1; // p2 - p1 - float32 jointTranslation = b2Dot(ax1, 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_limitForce = 0.0f; - } - m_limitState = e_atLowerLimit; - } - else if (jointTranslation >= m_upperTranslation) - { - if (m_limitState != e_atUpperLimit) - { - m_limitForce = 0.0f; - } - m_limitState = e_atUpperLimit; - } - else - { - m_limitState = e_inactiveLimit; - m_limitForce = 0.0f; - } - } - } - - if (m_enableMotor == false) - { - m_motorForce = 0.0f; - } - - if (m_enableLimit == false) - { - m_limitForce = 0.0f; - } - - if (step.warmStarting) - { - b2Vec2 P1 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.linear1 + (m_motorForce + m_limitForce) * m_motorJacobian.linear1); - b2Vec2 P2 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.linear2 + (m_motorForce + m_limitForce) * m_motorJacobian.linear2); - float32 L1 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.angular1 - m_torque + (m_motorForce + m_limitForce) * m_motorJacobian.angular1); - float32 L2 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.angular2 + m_torque + (m_motorForce + m_limitForce) * m_motorJacobian.angular2); - - b1->m_linearVelocity += invMass1 * P1; - b1->m_angularVelocity += invI1 * L1; - - b2->m_linearVelocity += invMass2 * P2; - b2->m_angularVelocity += invI2 * L2; - } - else - { - m_force = 0.0f; - m_torque = 0.0f; - m_limitForce = 0.0f; - m_motorForce = 0.0f; - } - - m_limitPositionImpulse = 0.0f; -} - -void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; - float32 invI1 = b1->m_invI, invI2 = b2->m_invI; - - // Solve linear constraint. - float32 linearCdot = m_linearJacobian.Compute(b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity); - float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_linearMass * linearCdot; - m_force += force; - - float32 P = B2FORCE_SCALE(step.dt) * force; - b1->m_linearVelocity += (invMass1 * P) * m_linearJacobian.linear1; - b1->m_angularVelocity += invI1 * P * m_linearJacobian.angular1; - - b2->m_linearVelocity += (invMass2 * P) * m_linearJacobian.linear2; - b2->m_angularVelocity += invI2 * P * m_linearJacobian.angular2; - - // Solve angular constraint. - float32 angularCdot = b2->m_angularVelocity - b1->m_angularVelocity; - float32 torque = -B2FORCE_INV_SCALE(step.inv_dt) * m_angularMass * angularCdot; - m_torque += torque; - - float32 L = B2FORCE_SCALE(step.dt) * torque; - b1->m_angularVelocity -= invI1 * L; - b2->m_angularVelocity += invI2 * L; - - // Solve linear motor constraint. - if (m_enableMotor && m_limitState != e_equalLimits) - { - float32 motorCdot = m_motorJacobian.Compute(b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity) - m_motorSpeed; - float32 motorForce = -B2FORCE_INV_SCALE(step.inv_dt) * m_motorMass * motorCdot; - float32 oldMotorForce = m_motorForce; - m_motorForce = b2Clamp(m_motorForce + motorForce, -m_maxMotorForce, m_maxMotorForce); - motorForce = m_motorForce - oldMotorForce; - - float32 P = B2FORCE_SCALE(step.dt) * motorForce; - b1->m_linearVelocity += (invMass1 * P) * m_motorJacobian.linear1; - b1->m_angularVelocity += invI1 * P * m_motorJacobian.angular1; - - b2->m_linearVelocity += (invMass2 * P) * m_motorJacobian.linear2; - b2->m_angularVelocity += invI2 * P * m_motorJacobian.angular2; - } - - // Solve linear limit constraint. - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - float32 limitCdot = m_motorJacobian.Compute(b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity); - float32 limitForce = -B2FORCE_INV_SCALE(step.inv_dt) * m_motorMass * limitCdot; - - if (m_limitState == e_equalLimits) - { - m_limitForce += limitForce; - } - else if (m_limitState == e_atLowerLimit) - { - float32 oldLimitForce = m_limitForce; - m_limitForce = b2Max(m_limitForce + limitForce, 0.0f); - limitForce = m_limitForce - oldLimitForce; - } - else if (m_limitState == e_atUpperLimit) - { - float32 oldLimitForce = m_limitForce; - m_limitForce = b2Min(m_limitForce + limitForce, 0.0f); - limitForce = m_limitForce - oldLimitForce; - } - - float32 P = B2FORCE_SCALE(step.dt) * limitForce; - - b1->m_linearVelocity += (invMass1 * P) * m_motorJacobian.linear1; - b1->m_angularVelocity += invI1 * P * m_motorJacobian.angular1; - - b2->m_linearVelocity += (invMass2 * P) * m_motorJacobian.linear2; - b2->m_angularVelocity += invI2 * P * m_motorJacobian.angular2; - } -} - -bool b2PrismaticJoint::SolvePositionConstraints() -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; - float32 invI1 = b1->m_invI, invI2 = b2->m_invI; - - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 d = p2 - p1; - b2Vec2 ay1 = b2Mul(b1->GetXForm().R, m_localYAxis1); - - // Solve linear (point-to-line) constraint. - float32 linearC = b2Dot(ay1, d); - // Prevent overly large corrections. - linearC = b2Clamp(linearC, -b2_maxLinearCorrection, b2_maxLinearCorrection); - float32 linearImpulse = -m_linearMass * linearC; - - b1->m_sweep.c += (invMass1 * linearImpulse) * m_linearJacobian.linear1; - b1->m_sweep.a += invI1 * linearImpulse * m_linearJacobian.angular1; - //b1->SynchronizeTransform(); // updated by angular constraint - b2->m_sweep.c += (invMass2 * linearImpulse) * m_linearJacobian.linear2; - b2->m_sweep.a += invI2 * linearImpulse * m_linearJacobian.angular2; - //b2->SynchronizeTransform(); // updated by angular constraint - - float32 positionError = b2Abs(linearC); - - // Solve angular constraint. - float32 angularC = b2->m_sweep.a - b1->m_sweep.a - m_refAngle; - // Prevent overly large corrections. - angularC = b2Clamp(angularC, -b2_maxAngularCorrection, b2_maxAngularCorrection); - float32 angularImpulse = -m_angularMass * angularC; - - b1->m_sweep.a -= b1->m_invI * angularImpulse; - b2->m_sweep.a += b2->m_invI * angularImpulse; - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - - float32 angularError = b2Abs(angularC); - - // Solve linear limit constraint. - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 d = p2 - p1; - b2Vec2 ax1 = b2Mul(b1->GetXForm().R, m_localXAxis1); - - float32 translation = b2Dot(ax1, d); - float32 limitImpulse = 0.0f; - - if (m_limitState == e_equalLimits) - { - // Prevent large angular corrections - float32 limitC = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); - limitImpulse = -m_motorMass * limitC; - positionError = b2Max(positionError, b2Abs(angularC)); - } - else if (m_limitState == e_atLowerLimit) - { - float32 limitC = translation - m_lowerTranslation; - positionError = b2Max(positionError, -limitC); - - // Prevent large linear corrections and allow some slop. - limitC = b2Clamp(limitC + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - limitImpulse = -m_motorMass * limitC; - float32 oldLimitImpulse = m_limitPositionImpulse; - m_limitPositionImpulse = b2Max(m_limitPositionImpulse + limitImpulse, 0.0f); - limitImpulse = m_limitPositionImpulse - oldLimitImpulse; - } - else if (m_limitState == e_atUpperLimit) - { - float32 limitC = translation - m_upperTranslation; - positionError = b2Max(positionError, limitC); - - // Prevent large linear corrections and allow some slop. - limitC = b2Clamp(limitC - b2_linearSlop, 0.0f, b2_maxLinearCorrection); - limitImpulse = -m_motorMass * limitC; - float32 oldLimitImpulse = m_limitPositionImpulse; - m_limitPositionImpulse = b2Min(m_limitPositionImpulse + limitImpulse, 0.0f); - limitImpulse = m_limitPositionImpulse - oldLimitImpulse; - } - - b1->m_sweep.c += (invMass1 * limitImpulse) * m_motorJacobian.linear1; - b1->m_sweep.a += invI1 * limitImpulse * m_motorJacobian.angular1; - b2->m_sweep.c += (invMass2 * limitImpulse) * m_motorJacobian.linear2; - b2->m_sweep.a += invI2 * limitImpulse * m_motorJacobian.angular2; - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - } - - return positionError <= b2_linearSlop && angularError <= b2_angularSlop; -} - -b2Vec2 b2PrismaticJoint::GetAnchor1() const -{ - return m_body1->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2PrismaticJoint::GetAnchor2() const -{ - return m_body2->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2PrismaticJoint::GetReactionForce() const -{ - b2Vec2 ax1 = b2Mul(m_body1->GetXForm().R, m_localXAxis1); - b2Vec2 ay1 = b2Mul(m_body1->GetXForm().R, m_localYAxis1); - - return B2FORCE_SCALE(float32(1.0))*(m_limitForce * ax1 + m_force * ay1); -} - -float32 b2PrismaticJoint::GetReactionTorque() const -{ - return B2FORCE_SCALE(m_torque); -} - -float32 b2PrismaticJoint::GetJointTranslation() const -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); - b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - float32 translation = b2Dot(d, axis); - return translation; -} - -float32 b2PrismaticJoint::GetJointSpeed() const -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - b2Vec2 v1 = b1->m_linearVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - float32 w2 = b2->m_angularVelocity; - - float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); - return speed; -} - -bool b2PrismaticJoint::IsLimitEnabled() const -{ - return m_enableLimit; -} - -void b2PrismaticJoint::EnableLimit(bool flag) -{ - m_enableLimit = flag; -} - -float32 b2PrismaticJoint::GetLowerLimit() const -{ - return m_lowerTranslation; -} - -float32 b2PrismaticJoint::GetUpperLimit() const -{ - return m_upperTranslation; -} - -void b2PrismaticJoint::SetLimits(float32 lower, float32 upper) -{ - b2Assert(lower <= upper); - m_lowerTranslation = lower; - m_upperTranslation = upper; -} - -bool b2PrismaticJoint::IsMotorEnabled() const -{ - return m_enableMotor; -} - -void b2PrismaticJoint::EnableMotor(bool flag) -{ - m_enableMotor = flag; -} - -void b2PrismaticJoint::SetMotorSpeed(float32 speed) -{ - m_motorSpeed = speed; -} - -void b2PrismaticJoint::SetMaxMotorForce(float32 force) -{ - m_maxMotorForce = B2FORCE_SCALE(float32(1.0))*force; -} - -float32 b2PrismaticJoint::GetMotorForce() const -{ - return m_motorForce; -} - - - diff --git a/src/modules/physics/box2d/Source/Dynamics/Joints/b2RevoluteJoint.cpp b/src/modules/physics/box2d/Source/Dynamics/Joints/b2RevoluteJoint.cpp deleted file mode 100644 index e83d59942..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/Joints/b2RevoluteJoint.cpp +++ /dev/null @@ -1,399 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2RevoluteJoint.h" -#include "../b2Body.h" -#include "../b2World.h" - -#include "../b2Island.h" - -// 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* b1, b2Body* b2, const b2Vec2& anchor) -{ - body1 = b1; - body2 = b2; - localAnchor1 = body1->GetLocalPoint(anchor); - localAnchor2 = body2->GetLocalPoint(anchor); - referenceAngle = body2->GetAngle() - body1->GetAngle(); -} - -b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) -: b2Joint(def) -{ - m_localAnchor1 = def->localAnchor1; - m_localAnchor2 = def->localAnchor2; - m_referenceAngle = def->referenceAngle; - - m_pivotForce.Set(0.0f, 0.0f); - m_motorForce = 0.0f; - m_limitForce = 0.0f; - m_limitPositionImpulse = 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; -} - -void b2RevoluteJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - // Compute the effective mass matrix. - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); - - // 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] - float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; - float32 invI1 = b1->m_invI, invI2 = b2->m_invI; - - b2Mat22 K1; - K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; - - b2Mat22 K2; - K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; - K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; - - b2Mat22 K3; - K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; - K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; - - b2Mat22 K = K1 + K2 + K3; - m_pivotMass = K.Invert(); - - m_motorMass = 1.0f / (invI1 + invI2); - - if (m_enableMotor == false) - { - m_motorForce = 0.0f; - } - - if (m_enableLimit) - { - float32 jointAngle = b2->m_sweep.a - b1->m_sweep.a - 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_limitForce = 0.0f; - } - m_limitState = e_atLowerLimit; - } - else if (jointAngle >= m_upperAngle) - { - if (m_limitState != e_atUpperLimit) - { - m_limitForce = 0.0f; - } - m_limitState = e_atUpperLimit; - } - else - { - m_limitState = e_inactiveLimit; - m_limitForce = 0.0f; - } - } - else - { - m_limitForce = 0.0f; - } - - if (step.warmStarting) - { - b1->m_linearVelocity -= B2FORCE_SCALE(step.dt) * invMass1 * m_pivotForce; - b1->m_angularVelocity -= B2FORCE_SCALE(step.dt) * invI1 * (b2Cross(r1, m_pivotForce) + B2FORCE_INV_SCALE(m_motorForce + m_limitForce)); - - b2->m_linearVelocity += B2FORCE_SCALE(step.dt) * invMass2 * m_pivotForce; - b2->m_angularVelocity += B2FORCE_SCALE(step.dt) * invI2 * (b2Cross(r2, m_pivotForce) + B2FORCE_INV_SCALE(m_motorForce + m_limitForce)); - } - else - { - m_pivotForce.SetZero(); - m_motorForce = 0.0f; - m_limitForce = 0.0f; - } - - m_limitPositionImpulse = 0.0f; -} - -void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); - - // Solve point-to-point constraint - b2Vec2 pivotCdot = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2) - b1->m_linearVelocity - b2Cross(b1->m_angularVelocity, r1); - b2Vec2 pivotForce = -B2FORCE_INV_SCALE(step.inv_dt) * b2Mul(m_pivotMass, pivotCdot); - m_pivotForce += pivotForce; - - b2Vec2 P = B2FORCE_SCALE(step.dt) * pivotForce; - b1->m_linearVelocity -= b1->m_invMass * P; - b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); - - b2->m_linearVelocity += b2->m_invMass * P; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); - - if (m_enableMotor && m_limitState != e_equalLimits) - { - float32 motorCdot = b2->m_angularVelocity - b1->m_angularVelocity - m_motorSpeed; - float32 motorForce = -step.inv_dt * m_motorMass * motorCdot; - float32 oldMotorForce = m_motorForce; - m_motorForce = b2Clamp(m_motorForce + motorForce, -m_maxMotorTorque, m_maxMotorTorque); - motorForce = m_motorForce - oldMotorForce; - - float32 P = step.dt * motorForce; - b1->m_angularVelocity -= b1->m_invI * P; - b2->m_angularVelocity += b2->m_invI * P; - } - - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - float32 limitCdot = b2->m_angularVelocity - b1->m_angularVelocity; - float32 limitForce = -step.inv_dt * m_motorMass * limitCdot; - - if (m_limitState == e_equalLimits) - { - m_limitForce += limitForce; - } - else if (m_limitState == e_atLowerLimit) - { - float32 oldLimitForce = m_limitForce; - m_limitForce = b2Max(m_limitForce + limitForce, 0.0f); - limitForce = m_limitForce - oldLimitForce; - } - else if (m_limitState == e_atUpperLimit) - { - float32 oldLimitForce = m_limitForce; - m_limitForce = b2Min(m_limitForce + limitForce, 0.0f); - limitForce = m_limitForce - oldLimitForce; - } - - float32 P = step.dt * limitForce; - b1->m_angularVelocity -= b1->m_invI * P; - b2->m_angularVelocity += b2->m_invI * P; - } -} - -bool b2RevoluteJoint::SolvePositionConstraints() -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - - float32 positionError = 0.0f; - - // Solve point-to-point position error. - b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); - - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 ptpC = p2 - p1; - - positionError = ptpC.Length(); - - // Prevent overly large corrections. - //b2Vec2 dpMax(b2_maxLinearCorrection, b2_maxLinearCorrection); - //ptpC = b2Clamp(ptpC, -dpMax, dpMax); - - float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; - float32 invI1 = b1->m_invI, invI2 = b2->m_invI; - - b2Mat22 K1; - K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; - - b2Mat22 K2; - K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; - K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; - - b2Mat22 K3; - K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; - K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; - - b2Mat22 K = K1 + K2 + K3; - b2Vec2 impulse = K.Solve(-ptpC); - - b1->m_sweep.c -= b1->m_invMass * impulse; - b1->m_sweep.a -= b1->m_invI * b2Cross(r1, impulse); - - b2->m_sweep.c += b2->m_invMass * impulse; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, impulse); - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - - // Handle limits. - float32 angularError = 0.0f; - - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - float32 angle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; - float32 limitImpulse = 0.0f; - - if (m_limitState == e_equalLimits) - { - // Prevent large angular corrections - float32 limitC = b2Clamp(angle, -b2_maxAngularCorrection, b2_maxAngularCorrection); - limitImpulse = -m_motorMass * limitC; - angularError = b2Abs(limitC); - } - else if (m_limitState == e_atLowerLimit) - { - float32 limitC = angle - m_lowerAngle; - angularError = b2Max(0.0f, -limitC); - - // Prevent large angular corrections and allow some slop. - limitC = b2Clamp(limitC + b2_angularSlop, -b2_maxAngularCorrection, 0.0f); - limitImpulse = -m_motorMass * limitC; - float32 oldLimitImpulse = m_limitPositionImpulse; - m_limitPositionImpulse = b2Max(m_limitPositionImpulse + limitImpulse, 0.0f); - limitImpulse = m_limitPositionImpulse - oldLimitImpulse; - } - else if (m_limitState == e_atUpperLimit) - { - float32 limitC = angle - m_upperAngle; - angularError = b2Max(0.0f, limitC); - - // Prevent large angular corrections and allow some slop. - limitC = b2Clamp(limitC - b2_angularSlop, 0.0f, b2_maxAngularCorrection); - limitImpulse = -m_motorMass * limitC; - float32 oldLimitImpulse = m_limitPositionImpulse; - m_limitPositionImpulse = b2Min(m_limitPositionImpulse + limitImpulse, 0.0f); - limitImpulse = m_limitPositionImpulse - oldLimitImpulse; - } - - b1->m_sweep.a -= b1->m_invI * limitImpulse; - b2->m_sweep.a += b2->m_invI * limitImpulse; - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - } - - return positionError <= b2_linearSlop && angularError <= b2_angularSlop; -} - -b2Vec2 b2RevoluteJoint::GetAnchor1() const -{ - return m_body1->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2RevoluteJoint::GetAnchor2() const -{ - return m_body2->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2RevoluteJoint::GetReactionForce() const -{ - return B2FORCE_SCALE(float32(1.0))*m_pivotForce; -} - -float32 b2RevoluteJoint::GetReactionTorque() const -{ - return m_limitForce; -} - -float32 b2RevoluteJoint::GetJointAngle() const -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - return b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; -} - -float32 b2RevoluteJoint::GetJointSpeed() const -{ - b2Body* b1 = m_body1; - b2Body* b2 = m_body2; - return b2->m_angularVelocity - b1->m_angularVelocity; -} - -bool b2RevoluteJoint::IsMotorEnabled() const -{ - return m_enableMotor; -} - -void b2RevoluteJoint::EnableMotor(bool flag) -{ - m_enableMotor = flag; -} - -float32 b2RevoluteJoint::GetMotorTorque() const -{ - return m_motorForce; -} - -void b2RevoluteJoint::SetMotorSpeed(float32 speed) -{ - m_motorSpeed = speed; -} - -void b2RevoluteJoint::SetMaxMotorTorque(float32 torque) -{ - m_maxMotorTorque = torque; -} - -bool b2RevoluteJoint::IsLimitEnabled() const -{ - return m_enableLimit; -} - -void b2RevoluteJoint::EnableLimit(bool flag) -{ - m_enableLimit = flag; -} - -float32 b2RevoluteJoint::GetLowerLimit() const -{ - return m_lowerAngle; -} - -float32 b2RevoluteJoint::GetUpperLimit() const -{ - return m_upperAngle; -} - -void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) -{ - b2Assert(lower <= upper); - m_lowerAngle = lower; - m_upperAngle = upper; -} diff --git a/src/modules/physics/box2d/Source/Dynamics/b2Body.cpp b/src/modules/physics/box2d/Source/Dynamics/b2Body.cpp deleted file mode 100644 index d2b206a0a..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/b2Body.cpp +++ /dev/null @@ -1,394 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2Body.h" -#include "b2World.h" -#include "Joints/b2Joint.h" -#include "../Collision/Shapes/b2Shape.h" - -b2Body::b2Body(const b2BodyDef* bd, b2World* world) -{ - b2Assert(world->m_lock == false); - - m_flags = 0; - - if (bd->isBullet) - { - m_flags |= e_bulletFlag; - } - if (bd->fixedRotation) - { - m_flags |= e_fixedRotationFlag; - } - if (bd->allowSleep) - { - m_flags |= e_allowSleepFlag; - } - if (bd->isSleeping) - { - m_flags |= e_sleepFlag; - } - - m_world = world; - - m_xf.position = bd->position; - m_xf.R.Set(bd->angle); - - m_sweep.localCenter = bd->massData.center; - m_sweep.t0 = 1.0f; - m_sweep.a0 = m_sweep.a = bd->angle; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - - m_jointList = NULL; - m_contactList = NULL; - m_prev = NULL; - m_next = NULL; - - m_linearDamping = bd->linearDamping; - m_angularDamping = bd->angularDamping; - - m_force.Set(0.0f, 0.0f); - m_torque = 0.0f; - - m_linearVelocity.SetZero(); - m_angularVelocity = 0.0f; - - m_sleepTime = 0.0f; - - m_invMass = 0.0f; - m_I = 0.0f; - m_invI = 0.0f; - - m_mass = bd->massData.mass; - - if (m_mass > 0.0f) - { - m_invMass = 1.0f / m_mass; - } - - if ((m_flags & b2Body::e_fixedRotationFlag) == 0) - { - m_I = bd->massData.I; - } - - if (m_I > 0.0f) - { - m_invI = 1.0f / m_I; - } - - if (m_invMass == 0.0f && m_invI == 0.0f) - { - m_type = e_staticType; - } - else - { - m_type = e_dynamicType; - } - - m_userData = bd->userData; - - m_shapeList = NULL; - m_shapeCount = 0; -} - -b2Body::~b2Body() -{ - b2Assert(m_world->m_lock == false); - // shapes and joints are destroyed in b2World::Destroy -} - -b2Shape* b2Body::CreateShape(b2ShapeDef* def) -{ - b2Assert(m_world->m_lock == false); - if (m_world->m_lock == true) - { - return NULL; - } - - b2Shape* s = b2Shape::Create(def, &m_world->m_blockAllocator); - - s->m_next = m_shapeList; - m_shapeList = s; - ++m_shapeCount; - - s->m_body = this; - - // Add the shape to the world's broad-phase. - s->CreateProxy(m_world->m_broadPhase, m_xf); - - // Compute the sweep radius for CCD. - s->UpdateSweepRadius(m_sweep.localCenter); - - return s; -} - -void b2Body::DestroyShape(b2Shape* s) -{ - b2Assert(m_world->m_lock == false); - if (m_world->m_lock == true) - { - return; - } - - b2Assert(s->GetBody() == this); - s->DestroyProxy(m_world->m_broadPhase); - - b2Assert(m_shapeCount > 0); - b2Shape** node = &m_shapeList; - bool found = false; - while (*node != NULL) - { - if (*node == s) - { - *node = s->m_next; - found = true; - break; - } - - node = &(*node)->m_next; - } - - // You tried to remove a shape that is not attached to this body. - b2Assert(found); - - s->m_body = NULL; - s->m_next = NULL; - - --m_shapeCount; - - b2Shape::Destroy(s, &m_world->m_blockAllocator); -} - -// TODO_ERIN adjust linear velocity and torque to account for movement of center. -void b2Body::SetMass(const b2MassData* massData) -{ - b2Assert(m_world->m_lock == false); - if (m_world->m_lock == true) - { - return; - } - - m_invMass = 0.0f; - m_I = 0.0f; - m_invI = 0.0f; - - m_mass = massData->mass; - - if (m_mass > 0.0f) - { - m_invMass = 1.0f / m_mass; - } - - if ((m_flags & b2Body::e_fixedRotationFlag) == 0) - { - m_I = massData->I; - } - - if (m_I > 0.0f) - { - m_invI = 1.0f / m_I; - } - - // Move center of mass. - m_sweep.localCenter = massData->center; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - - // Update the sweep radii of all child shapes. - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - s->UpdateSweepRadius(m_sweep.localCenter); - } - - int16 oldType = m_type; - if (m_invMass == 0.0f && m_invI == 0.0f) - { - m_type = e_staticType; - } - else - { - m_type = e_dynamicType; - } - - // If the body type changed, we need to refilter the broad-phase proxies. - if (oldType != m_type) - { - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - s->RefilterProxy(m_world->m_broadPhase, m_xf); - } - } -} - -// TODO_ERIN adjust linear velocity and torque to account for movement of center. -void b2Body::SetMassFromShapes() -{ - b2Assert(m_world->m_lock == false); - if (m_world->m_lock == true) - { - return; - } - - // 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; - - b2Vec2 center = b2Vec2_zero; - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - b2MassData massData; - s->ComputeMass(&massData); - m_mass += massData.mass; - center += massData.mass * massData.center; - m_I += massData.I; - } - - // Compute center of mass, and shift the origin to the COM. - if (m_mass > 0.0f) - { - m_invMass = 1.0f / m_mass; - center *= m_invMass; - } - - if (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0) - { - // Center the inertia about the center of mass. - m_I -= m_mass * b2Dot(center, center); - b2Assert(m_I > 0.0f); - m_invI = 1.0f / m_I; - } - else - { - m_I = 0.0f; - m_invI = 0.0f; - } - - // Move center of mass. - m_sweep.localCenter = center; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - - // Update the sweep radii of all child shapes. - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - s->UpdateSweepRadius(m_sweep.localCenter); - } - - int16 oldType = m_type; - if (m_invMass == 0.0f && m_invI == 0.0f) - { - m_type = e_staticType; - } - else - { - m_type = e_dynamicType; - } - - // If the body type changed, we need to refilter the broad-phase proxies. - if (oldType != m_type) - { - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - s->RefilterProxy(m_world->m_broadPhase, m_xf); - } - } -} - -bool b2Body::SetXForm(const b2Vec2& position, float32 angle) -{ - b2Assert(m_world->m_lock == false); - if (m_world->m_lock == true) - { - return true; - } - - if (IsFrozen()) - { - return false; - } - - m_xf.R.Set(angle); - m_xf.position = position; - - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - m_sweep.a0 = m_sweep.a = angle; - - bool freeze = false; - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - bool inRange = s->Synchronize(m_world->m_broadPhase, m_xf, m_xf); - - if (inRange == false) - { - freeze = true; - break; - } - } - - if (freeze == true) - { - m_flags |= e_frozenFlag; - m_linearVelocity.SetZero(); - m_angularVelocity = 0.0f; - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - s->DestroyProxy(m_world->m_broadPhase); - } - - // Failure - return false; - } - - // Success - m_world->m_broadPhase->Commit(); - return true; -} - -bool b2Body::SynchronizeShapes() -{ - b2XForm xf1; - xf1.R.Set(m_sweep.a0); - xf1.position = m_sweep.c0 - b2Mul(xf1.R, m_sweep.localCenter); - - bool inRange = true; - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - inRange = s->Synchronize(m_world->m_broadPhase, xf1, m_xf); - if (inRange == false) - { - break; - } - } - - if (inRange == false) - { - m_flags |= e_frozenFlag; - m_linearVelocity.SetZero(); - m_angularVelocity = 0.0f; - for (b2Shape* s = m_shapeList; s; s = s->m_next) - { - s->DestroyProxy(m_world->m_broadPhase); - } - - // Failure - return false; - } - - // Success - return true; -} diff --git a/src/modules/physics/box2d/Source/Dynamics/b2Body.h b/src/modules/physics/box2d/Source/Dynamics/b2Body.h deleted file mode 100644 index f2efda73a..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/b2Body.h +++ /dev/null @@ -1,587 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "../Common/b2Math.h" -#include "../Collision/Shapes/b2Shape.h" -#include "Joints/b2Joint.h" - -#include - -class b2Joint; -class b2Contact; -class b2World; -struct b2JointEdge; -struct b2ContactEdge; - -/// A body definition holds all the data needed to construct a rigid body. -/// You can safely re-use body definitions. -struct b2BodyDef -{ - /// This constructor sets the body definition default values. - b2BodyDef() - { - massData.center.SetZero(); - massData.mass = 0.0f; - massData.I = 0.0f; - userData = NULL; - position.Set(0.0f, 0.0f); - angle = 0.0f; - linearDamping = 0.0f; - angularDamping = 0.0f; - allowSleep = true; - isSleeping = false; - fixedRotation = false; - isBullet = false; - } - - /// You can use this to initialized the mass properties of the body. - /// If you prefer, you can set the mass properties after the shapes - /// have been added using b2Body::SetMassFromShapes. - b2MassData massData; - - /// Use this to store application specific body data. - void* userData; - - /// 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; - - /// 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 sleeping? - bool isSleeping; - - /// 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 - /// static bodies. - /// @warning You should use this flag sparingly since it increases processing time. - bool isBullet; -}; - -/// A rigid body. -class b2Body -{ -public: - /// Creates a shape and attach it to this body. - /// @param shapeDef the shape definition. - /// @warning This function is locked during callbacks. - b2Shape* CreateShape(b2ShapeDef* shapeDef); - - /// Destroy a shape. This removes the shape from the broad-phase and - /// therefore destroys any contacts associated with this shape. All shapes - /// attached to a body are implicitly destroyed when the body is destroyed. - /// @param shape the shape to be removed. - /// @warning This function is locked during callbacks. - void DestroyShape(b2Shape* shape); - - /// Set the mass properties. Note that this changes the center of mass position. - /// If you are not sure how to compute mass properties, use SetMassFromShapes. - /// The inertia tensor is assumed to be relative to the center of mass. - /// @param massData the mass properties. - void SetMass(const b2MassData* massData); - - /// Compute the mass properties from the attached shapes. You typically call this - /// after adding all the shapes. If you add or remove shapes later, you may want - /// to call this again. Note that this changes the center of mass position. - void SetMassFromShapes(); - - /// Set the position of the body's origin and rotation (radians). - /// This breaks any contacts and wakes the other bodies. - /// @param position the new world position of the body's origin (not necessarily - /// the center of mass). - /// @param angle the new world rotation angle of the body in radians. - /// @return false if the movement put a shape outside the world. In this case the - /// body is automatically frozen. - bool SetXForm(const b2Vec2& position, float32 angle); - - /// Get the body transform for the body's origin. - /// @return the world transform of the body's origin. - const b2XForm& GetXForm() 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. - 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. - void ApplyForce(const b2Vec2& force, const b2Vec2& point); - - /// 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. - void ApplyTorque(float32 torque); - - /// 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. - void ApplyImpulse(const b2Vec2& impulse, const b2Vec2& point); - - /// Get the total mass of the body. - /// @return the mass, usually in kilograms (kg). - float32 GetMass() const; - - /// Get the central rotational inertia of the body. - /// @return the rotational inertia, usually in kg-m^2. - float32 GetInertia() const; - - /// 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; - - /// Is this body treated like a bullet for continuous collision detection? - bool IsBullet() const; - - /// Should this body be treated like a bullet for continuous collision detection? - void SetBullet(bool flag); - - /// Is this body static (immovable)? - bool IsStatic() const; - - /// Is this body dynamic (movable)? - bool IsDynamic() const; - - /// Is this body frozen? - bool IsFrozen() const; - - /// Is this body sleeping (not simulating). - bool IsSleeping() const; - - /// You can disable sleeping on this body. - void AllowSleeping(bool flag); - - /// Wake up this body so it will begin simulating. - void WakeUp(); - - /// Put this body to sleep so it will stop simulating. - /// This also sets the velocity to zero. - void PutToSleep(); - - /// Get the list of all shapes attached to this body. - b2Shape* GetShapeList(); - - /// Get the list of all joints attached to this body. - b2JointEdge* GetJointList(); - - /// Get the next body in the world's body list. - b2Body* GetNext(); - - /// Get the user data pointer that was provided in the body definition. - void* GetUserData(); - - /// 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(); - -public: - - friend class b2World; - friend class b2Island; - friend class b2ContactManager; - friend class b2ContactSolver; - - friend class b2DistanceJoint; - friend class b2GearJoint; - friend class b2MouseJoint; - friend class b2PrismaticJoint; - friend class b2PulleyJoint; - friend class b2RevoluteJoint; - - // m_flags - enum - { - e_frozenFlag = 0x0002, - e_islandFlag = 0x0004, - e_sleepFlag = 0x0008, - e_allowSleepFlag = 0x0010, - e_bulletFlag = 0x0020, - e_fixedRotationFlag = 0x0040, - }; - - // m_type - enum - { - e_staticType, - e_dynamicType, - e_maxTypes, - }; - - b2Body(const b2BodyDef* bd, b2World* world); - ~b2Body(); - - bool SynchronizeShapes(); - - void SynchronizeTransform(); - - // This is used to prevent connected bodies from colliding. - // It may lie, depending on the collideConnected flag. - bool IsConnected(const b2Body* other) const; - - void Advance(float32 t); - - uint16 m_flags; - int16 m_type; - - b2XForm 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; - - b2Shape* m_shapeList; - int32 m_shapeCount; - - b2JointEdge* m_jointList; - b2ContactEdge* m_contactList; - - float32 m_mass, m_invMass; - float32 m_I, m_invI; - - float32 m_linearDamping; - float32 m_angularDamping; - - float32 m_sleepTime; - - void* m_userData; -}; - -inline const b2XForm& b2Body::GetXForm() const -{ - return m_xf; -} - -inline const b2Vec2& b2Body::GetPosition() const -{ - return m_xf.position; -} - -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) -{ - m_linearVelocity = v; -} - -inline b2Vec2 b2Body::GetLinearVelocity() const -{ - return m_linearVelocity; -} - -inline void b2Body::SetAngularVelocity(float32 w) -{ - 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; -} - -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.R, 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.R, 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 bool b2Body::IsBullet() const -{ - return (m_flags & e_bulletFlag) == e_bulletFlag; -} - -inline void b2Body::SetBullet(bool flag) -{ - if (flag) - { - m_flags |= e_bulletFlag; - } - else - { - m_flags &= ~e_bulletFlag; - } -} - -inline bool b2Body::IsStatic() const -{ - return m_type == e_staticType; -} - -inline bool b2Body::IsDynamic() const -{ - return m_type == e_dynamicType; -} - -inline bool b2Body::IsFrozen() const -{ - return (m_flags & e_frozenFlag) == e_frozenFlag; -} - -inline bool b2Body::IsSleeping() const -{ - return (m_flags & e_sleepFlag) == e_sleepFlag; -} - -inline void b2Body::AllowSleeping(bool flag) -{ - if (flag) - { - m_flags |= e_allowSleepFlag; - } - else - { - m_flags &= ~e_allowSleepFlag; - WakeUp(); - } -} - -inline void b2Body::WakeUp() -{ - m_flags &= ~e_sleepFlag; - m_sleepTime = 0.0f; -} - -inline void b2Body::PutToSleep() -{ - m_flags |= e_sleepFlag; - m_sleepTime = 0.0f; - m_linearVelocity.SetZero(); - m_angularVelocity = 0.0f; - m_force.SetZero(); - m_torque = 0.0f; -} - -inline b2Shape* b2Body::GetShapeList() -{ - return m_shapeList; -} - -inline b2JointEdge* b2Body::GetJointList() -{ - return m_jointList; -} - -inline b2Body* b2Body::GetNext() -{ - return m_next; -} - -inline void* b2Body::GetUserData() -{ - return m_userData; -} - -inline void b2Body::SetUserData(void* data) -{ - m_userData = data; -} - -inline bool b2Body::IsConnected(const b2Body* other) const -{ - for (b2JointEdge* jn = m_jointList; jn; jn = jn->next) - { - if (jn->other == other) - return jn->joint->m_collideConnected == false; - } - - return false; -} - -inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point) -{ - if (IsSleeping()) - { - WakeUp(); - } - m_force += force; - m_torque += b2Cross(point - m_sweep.c, force); -} - -inline void b2Body::ApplyTorque(float32 torque) -{ - if (IsSleeping()) - { - WakeUp(); - } - m_torque += torque; -} - -inline void b2Body::ApplyImpulse(const b2Vec2& impulse, const b2Vec2& point) -{ - if (IsSleeping()) - { - WakeUp(); - } - m_linearVelocity += m_invMass * impulse; - m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse); -} - -inline void b2Body::SynchronizeTransform() -{ - m_xf.R.Set(m_sweep.a); - m_xf.position = m_sweep.c - b2Mul(m_xf.R, m_sweep.localCenter); -} - -inline void b2Body::Advance(float32 t) -{ - // Advance to the new safe time. - m_sweep.Advance(t); - m_sweep.c = m_sweep.c0; - m_sweep.a = m_sweep.a0; - SynchronizeTransform(); -} - -inline b2World* b2Body::GetWorld() -{ - return m_world; -} - -#endif diff --git a/src/modules/physics/box2d/Source/Dynamics/b2ContactManager.cpp b/src/modules/physics/box2d/Source/Dynamics/b2ContactManager.cpp deleted file mode 100644 index 4fc73c2fd..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/b2ContactManager.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2ContactManager.h" -#include "b2World.h" -#include "b2Body.h" - -// This is a callback from the broadphase when two AABB proxies begin -// to overlap. We create a b2Contact to manage the narrow phase. -void* b2ContactManager::PairAdded(void* proxyUserData1, void* proxyUserData2) -{ - b2Shape* shape1 = (b2Shape*)proxyUserData1; - b2Shape* shape2 = (b2Shape*)proxyUserData2; - - b2Body* body1 = shape1->GetBody(); - b2Body* body2 = shape2->GetBody(); - - if (body1->IsStatic() && body2->IsStatic()) - { - return &m_nullContact; - } - - if (shape1->GetBody() == shape2->GetBody()) - { - return &m_nullContact; - } - - if (body2->IsConnected(body1)) - { - return &m_nullContact; - } - - if (m_world->m_contactFilter != NULL && m_world->m_contactFilter->ShouldCollide(shape1, shape2) == false) - { - return &m_nullContact; - } - - // Call the factory. - b2Contact* c = b2Contact::Create(shape1, shape2, &m_world->m_blockAllocator); - - if (c == NULL) - { - return &m_nullContact; - } - - // Contact creation may swap shapes. - shape1 = c->GetShape1(); - shape2 = c->GetShape2(); - body1 = shape1->GetBody(); - body2 = shape2->GetBody(); - - // Insert into the world. - c->m_prev = NULL; - c->m_next = m_world->m_contactList; - if (m_world->m_contactList != NULL) - { - m_world->m_contactList->m_prev = c; - } - m_world->m_contactList = c; - - // Connect to island graph. - - // Connect to body 1 - c->m_node1.contact = c; - c->m_node1.other = body2; - - c->m_node1.prev = NULL; - c->m_node1.next = body1->m_contactList; - if (body1->m_contactList != NULL) - { - body1->m_contactList->prev = &c->m_node1; - } - body1->m_contactList = &c->m_node1; - - // Connect to body 2 - c->m_node2.contact = c; - c->m_node2.other = body1; - - c->m_node2.prev = NULL; - c->m_node2.next = body2->m_contactList; - if (body2->m_contactList != NULL) - { - body2->m_contactList->prev = &c->m_node2; - } - body2->m_contactList = &c->m_node2; - - ++m_world->m_contactCount; - return c; -} - -// This is a callback from the broadphase when two AABB proxies cease -// to overlap. We retire the b2Contact. -void b2ContactManager::PairRemoved(void* proxyUserData1, void* proxyUserData2, void* pairUserData) -{ - B2_NOT_USED(proxyUserData1); - B2_NOT_USED(proxyUserData2); - - if (pairUserData == NULL) - { - return; - } - - b2Contact* c = (b2Contact*)pairUserData; - if (c == &m_nullContact) - { - return; - } - - // An attached body is being destroyed, we must destroy this contact - // immediately to avoid orphaned shape pointers. - Destroy(c); -} - -void b2ContactManager::Destroy(b2Contact* c) -{ - b2Shape* shape1 = c->GetShape1(); - b2Shape* shape2 = c->GetShape2(); - - // Inform the user that this contact is ending. - int32 manifoldCount = c->GetManifoldCount(); - if (manifoldCount > 0 && m_world->m_contactListener) - { - b2Body* b1 = shape1->GetBody(); - b2Body* b2 = shape2->GetBody(); - - b2Manifold* manifolds = c->GetManifolds(); - b2ContactPoint cp; - cp.shape1 = c->GetShape1(); - cp.shape2 = c->GetShape2(); - cp.friction = c->m_friction; - cp.restitution = c->m_restitution; - - for (int32 i = 0; i < manifoldCount; ++i) - { - b2Manifold* manifold = manifolds + i; - cp.normal = manifold->normal; - - for (int32 j = 0; j < manifold->pointCount; ++j) - { - b2ManifoldPoint* mp = manifold->points + j; - cp.position = b1->GetWorldPoint(mp->localPoint1); - b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); - b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); - cp.velocity = v2 - v1; - cp.separation = mp->separation; - cp.id = mp->id; - m_world->m_contactListener->Remove(&cp); - } - } - } - - // 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_world->m_contactList) - { - m_world->m_contactList = c->m_next; - } - - b2Body* body1 = shape1->GetBody(); - b2Body* body2 = shape2->GetBody(); - - // Remove from body 1 - if (c->m_node1.prev) - { - c->m_node1.prev->next = c->m_node1.next; - } - - if (c->m_node1.next) - { - c->m_node1.next->prev = c->m_node1.prev; - } - - if (&c->m_node1 == body1->m_contactList) - { - body1->m_contactList = c->m_node1.next; - } - - // Remove from body 2 - if (c->m_node2.prev) - { - c->m_node2.prev->next = c->m_node2.next; - } - - if (c->m_node2.next) - { - c->m_node2.next->prev = c->m_node2.prev; - } - - if (&c->m_node2 == body2->m_contactList) - { - body2->m_contactList = c->m_node2.next; - } - - // Call the factory. - b2Contact::Destroy(c, &m_world->m_blockAllocator); - --m_world->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. - for (b2Contact* c = m_world->m_contactList; c; c = c->GetNext()) - { - b2Body* body1 = c->GetShape1()->GetBody(); - b2Body* body2 = c->GetShape2()->GetBody(); - if (body1->IsSleeping() && body2->IsSleeping()) - { - continue; - } - - c->Update(m_world->m_contactListener); - } -} diff --git a/src/modules/physics/box2d/Source/Dynamics/b2World.cpp b/src/modules/physics/box2d/Source/Dynamics/b2World.cpp deleted file mode 100644 index ab752807c..000000000 --- a/src/modules/physics/box2d/Source/Dynamics/b2World.cpp +++ /dev/null @@ -1,1064 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 "b2World.h" -#include "b2Body.h" -#include "b2Island.h" -#include "Joints/b2PulleyJoint.h" -#include "Contacts/b2Contact.h" -#include "Contacts/b2ContactSolver.h" -#include "../Collision/b2Collision.h" -#include "../Collision/Shapes/b2CircleShape.h" -#include "../Collision/Shapes/b2PolygonShape.h" -#include - -b2World::b2World(const b2AABB& worldAABB, const b2Vec2& gravity, bool doSleep) -{ - m_destructionListener = NULL; - m_boundaryListener = NULL; - m_contactFilter = &b2_defaultFilter; - m_contactListener = NULL; - m_debugDraw = NULL; - - m_bodyList = NULL; - m_contactList = NULL; - m_jointList = NULL; - - m_bodyCount = 0; - m_contactCount = 0; - m_jointCount = 0; - - m_positionCorrection = true; - m_warmStarting = true; - m_continuousPhysics = true; - - m_allowSleep = doSleep; - m_gravity = gravity; - - m_lock = false; - - m_inv_dt0 = 0.0f; - - m_contactManager.m_world = this; - void* mem = b2Alloc(sizeof(b2BroadPhase)); - m_broadPhase = new (mem) b2BroadPhase(worldAABB, &m_contactManager); - - b2BodyDef bd; - m_groundBody = CreateBody(&bd); -} - -b2World::~b2World() -{ - DestroyBody(m_groundBody); - m_broadPhase->~b2BroadPhase(); - b2Free(m_broadPhase); -} - -void b2World::SetDestructionListener(b2DestructionListener* listener) -{ - m_destructionListener = listener; -} - -void b2World::SetBoundaryListener(b2BoundaryListener* listener) -{ - m_boundaryListener = listener; -} - -void b2World::SetContactFilter(b2ContactFilter* filter) -{ - m_contactFilter = filter; -} - -void b2World::SetContactListener(b2ContactListener* listener) -{ - m_contactListener = listener; -} - -void b2World::SetDebugDraw(b2DebugDraw* debugDraw) -{ - m_debugDraw = debugDraw; -} - -b2Body* b2World::CreateBody(const b2BodyDef* def) -{ - b2Assert(m_lock == false); - if (m_lock == true) - { - 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(m_lock == false); - if (m_lock == true) - { - return; - } - - // Delete the attached joints. - b2JointEdge* jn = b->m_jointList; - while (jn) - { - b2JointEdge* jn0 = jn; - jn = jn->next; - - if (m_destructionListener) - { - m_destructionListener->SayGoodbye(jn0->joint); - } - - DestroyJoint(jn0->joint); - } - - // Delete the attached shapes. This destroys broad-phase - // proxies and pairs, leading to the destruction of contacts. - b2Shape* s = b->m_shapeList; - while (s) - { - b2Shape* s0 = s; - s = s->m_next; - - if (m_destructionListener) - { - m_destructionListener->SayGoodbye(s0); - } - - s0->DestroyProxy(m_broadPhase); - b2Shape::Destroy(s0, &m_blockAllocator); - } - - // 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(m_lock == false); - - 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_node1.joint = j; - j->m_node1.other = j->m_body2; - j->m_node1.prev = NULL; - j->m_node1.next = j->m_body1->m_jointList; - if (j->m_body1->m_jointList) j->m_body1->m_jointList->prev = &j->m_node1; - j->m_body1->m_jointList = &j->m_node1; - - j->m_node2.joint = j; - j->m_node2.other = j->m_body1; - j->m_node2.prev = NULL; - j->m_node2.next = j->m_body2->m_jointList; - if (j->m_body2->m_jointList) j->m_body2->m_jointList->prev = &j->m_node2; - j->m_body2->m_jointList = &j->m_node2; - - // If the joint prevents collisions, then reset collision filtering. - if (def->collideConnected == false) - { - // Reset the proxies on the body with the minimum number of shapes. - b2Body* b = def->body1->m_shapeCount < def->body2->m_shapeCount ? def->body1 : def->body2; - for (b2Shape* s = b->m_shapeList; s; s = s->m_next) - { - s->RefilterProxy(m_broadPhase, b->GetXForm()); - } - } - - return j; -} - -void b2World::DestroyJoint(b2Joint* j) -{ - b2Assert(m_lock == false); - - 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* body1 = j->m_body1; - b2Body* body2 = j->m_body2; - - // Wake up connected bodies. - body1->WakeUp(); - body2->WakeUp(); - - // Remove from body 1. - if (j->m_node1.prev) - { - j->m_node1.prev->next = j->m_node1.next; - } - - if (j->m_node1.next) - { - j->m_node1.next->prev = j->m_node1.prev; - } - - if (&j->m_node1 == body1->m_jointList) - { - body1->m_jointList = j->m_node1.next; - } - - j->m_node1.prev = NULL; - j->m_node1.next = NULL; - - // Remove from body 2 - if (j->m_node2.prev) - { - j->m_node2.prev->next = j->m_node2.next; - } - - if (j->m_node2.next) - { - j->m_node2.next->prev = j->m_node2.prev; - } - - if (&j->m_node2 == body2->m_jointList) - { - body2->m_jointList = j->m_node2.next; - } - - j->m_node2.prev = NULL; - j->m_node2.next = NULL; - - b2Joint::Destroy(j, &m_blockAllocator); - - b2Assert(m_jointCount > 0); - --m_jointCount; - - // If the joint prevents collisions, then reset collision filtering. - if (collideConnected == false) - { - // Reset the proxies on the body with the minimum number of shapes. - b2Body* b = body1->m_shapeCount < body2->m_shapeCount ? body1 : body2; - for (b2Shape* s = b->m_shapeList; s; s = s->m_next) - { - s->RefilterProxy(m_broadPhase, b->GetXForm()); - } - } -} - -void b2World::Refilter(b2Shape* shape) -{ - shape->RefilterProxy(m_broadPhase, shape->GetBody()->GetXForm()); -} - -// Find islands, integrate and solve constraints, solve position constraints -void b2World::Solve(const b2TimeStep& step) -{ - m_positionIterationCount = 0; - - // Size the island for the worst case. - b2Island island(m_bodyCount, m_contactCount, m_jointCount, &m_stackAllocator, 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_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 | b2Body::e_sleepFlag | b2Body::e_frozenFlag)) - { - continue; - } - - if (seed->IsStatic()) - { - 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]; - island.Add(b); - - // Make sure the body is awake. - b->m_flags &= ~b2Body::e_sleepFlag; - - // To keep islands as small as possible, we don't - // propagate islands across static bodies. - if (b->IsStatic()) - { - continue; - } - - // Search all contacts connected to this body. - for (b2ContactEdge* cn = b->m_contactList; cn; cn = cn->next) - { - // Has this contact already been added to an island? - if (cn->contact->m_flags & (b2Contact::e_islandFlag | b2Contact::e_nonSolidFlag)) - { - continue; - } - - // Is this contact touching? - if (cn->contact->GetManifoldCount() == 0) - { - continue; - } - - island.Add(cn->contact); - cn->contact->m_flags |= b2Contact::e_islandFlag; - - b2Body* other = cn->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* jn = b->m_jointList; jn; jn = jn->next) - { - if (jn->joint->m_islandFlag == true) - { - continue; - } - - island.Add(jn->joint); - jn->joint->m_islandFlag = true; - - b2Body* other = jn->other; - if (other->m_flags & b2Body::e_islandFlag) - { - continue; - } - - b2Assert(stackCount < stackSize); - stack[stackCount++] = other; - other->m_flags |= b2Body::e_islandFlag; - } - } - - island.Solve(step, m_gravity, m_positionCorrection, m_allowSleep); - m_positionIterationCount = b2Max(m_positionIterationCount, island.m_positionIterationCount); - - // 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->IsStatic()) - { - b->m_flags &= ~b2Body::e_islandFlag; - } - } - } - - m_stackAllocator.Free(stack); - - // Synchronize shapes, check for out of range bodies. - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - if (b->m_flags & (b2Body::e_sleepFlag | b2Body::e_frozenFlag)) - { - continue; - } - - if (b->IsStatic()) - { - continue; - } - - // Update shapes (for broad-phase). If the shapes go out of - // the world AABB then shapes and contacts may be destroyed, - // including contacts that are - bool inRange = b->SynchronizeShapes(); - - // Did the body's shapes leave the world? - if (inRange == false && m_boundaryListener != NULL) - { - m_boundaryListener->Violation(b); - } - } - - // Commit shape proxy movements to the broad-phase so that new contacts are created. - // Also, some contacts can be destroyed. - m_broadPhase->Commit(); -} - -// Find TOI contacts and solve them. -void b2World::SolveTOI(const b2TimeStep& step) -{ - // Reserve an island and a stack for TOI island solution. - b2Island island(m_bodyCount, b2_maxTOIContactsPerIsland, 0, &m_stackAllocator, m_contactListener); - int32 stackSize = m_bodyCount; - b2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*)); - - for (b2Body* b = m_bodyList; b; b = b->m_next) - { - b->m_flags &= ~b2Body::e_islandFlag; - b->m_sweep.t0 = 0.0f; - } - - for (b2Contact* c = m_contactList; c; c = c->m_next) - { - // Invalidate TOI - c->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag); - } - - // Find TOI events and solve them. - for (;;) - { - // Find the first TOI. - b2Contact* minContact = NULL; - float32 minTOI = 1.0f; - - for (b2Contact* c = m_contactList; c; c = c->m_next) - { - if (c->m_flags & (b2Contact::e_slowFlag | b2Contact::e_nonSolidFlag)) - { - continue; - } - - // TODO_ERIN keep a counter on the contact, only respond to M TOIs per contact. - - float32 toi = 1.0f; - if (c->m_flags & b2Contact::e_toiFlag) - { - // This contact has a valid cached TOI. - toi = c->m_toi; - } - else - { - // Compute the TOI for this contact. - b2Shape* s1 = c->GetShape1(); - b2Shape* s2 = c->GetShape2(); - b2Body* b1 = s1->GetBody(); - b2Body* b2 = s2->GetBody(); - - if ((b1->IsStatic() || b1->IsSleeping()) && (b2->IsStatic() || b2->IsSleeping())) - { - continue; - } - - // Put the sweeps onto the same time interval. - float32 t0 = b1->m_sweep.t0; - - if (b1->m_sweep.t0 < b2->m_sweep.t0) - { - t0 = b2->m_sweep.t0; - b1->m_sweep.Advance(t0); - } - else if (b2->m_sweep.t0 < b1->m_sweep.t0) - { - t0 = b1->m_sweep.t0; - b2->m_sweep.Advance(t0); - } - - b2Assert(t0 < 1.0f); - - // Compute the time of impact. - toi = b2TimeOfImpact(c->m_shape1, b1->m_sweep, c->m_shape2, b2->m_sweep); - - b2Assert(0.0f <= toi && toi <= 1.0f); - - if (toi > 0.0f && toi < 1.0f) - { - toi = b2Min((1.0f - toi) * t0 + toi, 1.0f); - } - - - c->m_toi = toi; - c->m_flags |= b2Contact::e_toiFlag; - } - - if (B2_FLT_EPSILON < toi && toi < minTOI) - { - // This is the minimum TOI found so far. - minContact = c; - minTOI = toi; - } - } - - if (minContact == NULL || 1.0f - 100.0f * B2_FLT_EPSILON < minTOI) - { - // No more TOI events. Done! - break; - } - - // Advance the bodies to the TOI. - b2Shape* s1 = minContact->GetShape1(); - b2Shape* s2 = minContact->GetShape2(); - b2Body* b1 = s1->GetBody(); - b2Body* b2 = s2->GetBody(); - b1->Advance(minTOI); - b2->Advance(minTOI); - - // The TOI contact likely has some new contact points. - minContact->Update(m_contactListener); - minContact->m_flags &= ~b2Contact::e_toiFlag; - - if (minContact->GetManifoldCount() == 0) - { - // This shouldn't happen. Numerical error? - //b2Assert(false); - continue; - } - - // Build the TOI island. We need a dynamic seed. - b2Body* seed = b1; - if (seed->IsStatic()) - { - seed = b2; - } - - // 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 contact graph. - while (stackCount > 0) - { - // Grab the next body off the stack and add it to the island. - b2Body* b = stack[--stackCount]; - island.Add(b); - - // Make sure the body is awake. - b->m_flags &= ~b2Body::e_sleepFlag; - - // To keep islands as small as possible, we don't - // propagate islands across static bodies. - if (b->IsStatic()) - { - continue; - } - - // Search all contacts connected to this body. - for (b2ContactEdge* cn = b->m_contactList; cn; cn = cn->next) - { - // Does the TOI island still have space for contacts? - if (island.m_contactCount == island.m_contactCapacity) - { - continue; - } - - // Has this contact already been added to an island? Skip slow or non-solid contacts. - if (cn->contact->m_flags & (b2Contact::e_islandFlag | b2Contact::e_slowFlag | b2Contact::e_nonSolidFlag)) - { - continue; - } - - // Is this contact touching? For performance we are not updating this contact. - if (cn->contact->GetManifoldCount() == 0) - { - continue; - } - - island.Add(cn->contact); - cn->contact->m_flags |= b2Contact::e_islandFlag; - - // Update other body. - b2Body* other = cn->other; - - // Was the other body already added to this island? - if (other->m_flags & b2Body::e_islandFlag) - { - continue; - } - - // March forward, this can do no harm since this is the min TOI. - if (other->IsStatic() == false) - { - other->Advance(minTOI); - other->WakeUp(); - } - - b2Assert(stackCount < stackSize); - stack[stackCount++] = other; - other->m_flags |= b2Body::e_islandFlag; - } - } - - b2TimeStep subStep; - subStep.dt = (1.0f - minTOI) * step.dt; - b2Assert(subStep.dt > B2_FLT_EPSILON); - subStep.inv_dt = 1.0f / subStep.dt; - subStep.maxIterations = step.maxIterations; - - island.SolveTOI(subStep); - - // Post solve cleanup. - for (int32 i = 0; i < island.m_bodyCount; ++i) - { - // Allow bodies to participate in future TOI islands. - b2Body* b = island.m_bodies[i]; - b->m_flags &= ~b2Body::e_islandFlag; - - if (b->m_flags & (b2Body::e_sleepFlag | b2Body::e_frozenFlag)) - { - continue; - } - - if (b->IsStatic()) - { - continue; - } - - // Update shapes (for broad-phase). If the shapes go out of - // the world AABB then shapes and contacts may be destroyed, - // including contacts that are - bool inRange = b->SynchronizeShapes(); - - // Did the body's shapes leave the world? - if (inRange == false && m_boundaryListener != NULL) - { - m_boundaryListener->Violation(b); - } - - // Invalidate all contact TOIs associated with this body. Some of these - // may not be in the island because they were not touching. - for (b2ContactEdge* cn = b->m_contactList; cn; cn = cn->next) - { - cn->contact->m_flags &= ~b2Contact::e_toiFlag; - } - } - - for (int32 i = 0; i < island.m_contactCount; ++i) - { - // Allow contacts to participate in future TOI islands. - b2Contact* c = island.m_contacts[i]; - c->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag); - } - - // Commit shape proxy movements to the broad-phase so that new contacts are created. - // Also, some contacts can be destroyed. - m_broadPhase->Commit(); - } - - m_stackAllocator.Free(stack); -} - -void b2World::Step(float32 dt, int32 iterations) -{ - m_lock = true; - - b2TimeStep step; - step.dt = dt; - step.maxIterations = iterations; - if (dt > 0.0f) - { - step.inv_dt = 1.0f / dt; - } - else - { - step.inv_dt = 0.0f; - } - - step.dtRatio = m_inv_dt0 * dt; - - step.positionCorrection = m_positionCorrection; - step.warmStarting = m_warmStarting; - - // Update contacts. - m_contactManager.Collide(); - - // Integrate velocities, solve velocity constraints, and integrate positions. - if (step.dt > 0.0f) - { - Solve(step); - } - - // Handle TOI events. - if (m_continuousPhysics && step.dt > 0.0f) - { - SolveTOI(step); - } - - // Draw debug information. - DrawDebugData(); - - m_inv_dt0 = step.inv_dt; - m_lock = false; -} - -int32 b2World::Query(const b2AABB& aabb, b2Shape** shapes, int32 maxCount) -{ - void** results = (void**)m_stackAllocator.Allocate(maxCount * sizeof(void*)); - - int32 count = m_broadPhase->Query(aabb, results, maxCount); - - for (int32 i = 0; i < count; ++i) - { - shapes[i] = (b2Shape*)results[i]; - } - - m_stackAllocator.Free(results); - return count; -} - -void b2World::DrawShape(b2Shape* shape, const b2XForm& xf, const b2Color& color, bool core) -{ - b2Color coreColor(0.9f, 0.6f, 0.6f); - - switch (shape->GetType()) - { - case e_circleShape: - { - b2CircleShape* circle = (b2CircleShape*)shape; - - b2Vec2 center = b2Mul(xf, circle->GetLocalPosition()); - float32 radius = circle->GetRadius(); - b2Vec2 axis = xf.R.col1; - - m_debugDraw->DrawSolidCircle(center, radius, axis, color); - - if (core) - { - m_debugDraw->DrawCircle(center, radius - b2_toiSlop, coreColor); - } - } - break; - - case e_polygonShape: - { - b2PolygonShape* poly = (b2PolygonShape*)shape; - int32 vertexCount = poly->GetVertexCount(); - const b2Vec2* localVertices = poly->GetVertices(); - - b2Assert(vertexCount <= b2_maxPolygonVertices); - b2Vec2 vertices[b2_maxPolygonVertices]; - - for (int32 i = 0; i < vertexCount; ++i) - { - vertices[i] = b2Mul(xf, localVertices[i]); - } - - m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color); - - if (core) - { - const b2Vec2* localCoreVertices = poly->GetCoreVertices(); - for (int32 i = 0; i < vertexCount; ++i) - { - vertices[i] = b2Mul(xf, localCoreVertices[i]); - } - m_debugDraw->DrawPolygon(vertices, vertexCount, coreColor); - } - } - break; - } -} - -void b2World::DrawJoint(b2Joint* joint) -{ - b2Body* b1 = joint->GetBody1(); - b2Body* b2 = joint->GetBody2(); - const b2XForm& xf1 = b1->GetXForm(); - const b2XForm& xf2 = b2->GetXForm(); - b2Vec2 x1 = xf1.position; - b2Vec2 x2 = xf2.position; - b2Vec2 p1 = joint->GetAnchor1(); - b2Vec2 p2 = joint->GetAnchor2(); - - 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->GetGroundAnchor1(); - b2Vec2 s2 = pulley->GetGroundAnchor2(); - 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 & b2DebugDraw::e_shapeBit) - { - bool core = (flags & b2DebugDraw::e_coreShapeBit) == b2DebugDraw::e_coreShapeBit; - - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - const b2XForm& xf = b->GetXForm(); - for (b2Shape* s = b->GetShapeList(); s; s = s->GetNext()) - { - if (b->IsStatic()) - { - DrawShape(s, xf, b2Color(0.5f, 0.9f, 0.5f), core); - } - else if (b->IsSleeping()) - { - DrawShape(s, xf, b2Color(0.5f, 0.5f, 0.9f), core); - } - else - { - DrawShape(s, xf, b2Color(0.9f, 0.9f, 0.9f), core); - } - } - } - } - - if (flags & b2DebugDraw::e_jointBit) - { - for (b2Joint* j = m_jointList; j; j = j->GetNext()) - { - if (j->GetType() != e_mouseJoint) - { - DrawJoint(j); - } - } - } - - if (flags & b2DebugDraw::e_pairBit) - { - b2BroadPhase* bp = m_broadPhase; - b2Vec2 invQ; - invQ.Set(1.0f / bp->m_quantizationFactor.x, 1.0f / bp->m_quantizationFactor.y); - b2Color color(0.9f, 0.9f, 0.3f); - - for (int32 i = 0; i < b2_tableCapacity; ++i) - { - uint16 index = bp->m_pairManager.m_hashTable[i]; - while (index != b2_nullPair) - { - b2Pair* pair = bp->m_pairManager.m_pairs + index; - b2Proxy* p1 = bp->m_proxyPool + pair->proxyId1; - b2Proxy* p2 = bp->m_proxyPool + pair->proxyId2; - - b2AABB b1, b2; - b1.lowerBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p1->lowerBounds[0]].value; - b1.lowerBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p1->lowerBounds[1]].value; - b1.upperBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p1->upperBounds[0]].value; - b1.upperBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p1->upperBounds[1]].value; - b2.lowerBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p2->lowerBounds[0]].value; - b2.lowerBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p2->lowerBounds[1]].value; - b2.upperBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p2->upperBounds[0]].value; - b2.upperBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p2->upperBounds[1]].value; - - b2Vec2 x1 = 0.5f * (b1.lowerBound + b1.upperBound); - b2Vec2 x2 = 0.5f * (b2.lowerBound + b2.upperBound); - - m_debugDraw->DrawSegment(x1, x2, color); - - index = pair->next; - } - } - } - - if (flags & b2DebugDraw::e_aabbBit) - { - b2BroadPhase* bp = m_broadPhase; - b2Vec2 worldLower = bp->m_worldAABB.lowerBound; - b2Vec2 worldUpper = bp->m_worldAABB.upperBound; - - b2Vec2 invQ; - invQ.Set(1.0f / bp->m_quantizationFactor.x, 1.0f / bp->m_quantizationFactor.y); - b2Color color(0.9f, 0.3f, 0.9f); - for (int32 i = 0; i < b2_maxProxies; ++i) - { - b2Proxy* p = bp->m_proxyPool + i; - if (p->IsValid() == false) - { - continue; - } - - b2AABB b; - b.lowerBound.x = worldLower.x + invQ.x * bp->m_bounds[0][p->lowerBounds[0]].value; - b.lowerBound.y = worldLower.y + invQ.y * bp->m_bounds[1][p->lowerBounds[1]].value; - b.upperBound.x = worldLower.x + invQ.x * bp->m_bounds[0][p->upperBounds[0]].value; - b.upperBound.y = worldLower.y + invQ.y * bp->m_bounds[1][p->upperBounds[1]].value; - - b2Vec2 vs[4]; - vs[0].Set(b.lowerBound.x, b.lowerBound.y); - vs[1].Set(b.upperBound.x, b.lowerBound.y); - vs[2].Set(b.upperBound.x, b.upperBound.y); - vs[3].Set(b.lowerBound.x, b.upperBound.y); - - m_debugDraw->DrawPolygon(vs, 4, color); - } - - b2Vec2 vs[4]; - vs[0].Set(worldLower.x, worldLower.y); - vs[1].Set(worldUpper.x, worldLower.y); - vs[2].Set(worldUpper.x, worldUpper.y); - vs[3].Set(worldLower.x, worldUpper.y); - m_debugDraw->DrawPolygon(vs, 4, b2Color(0.3f, 0.9f, 0.9f)); - } - - if (flags & b2DebugDraw::e_obbBit) - { - b2Color color(0.5f, 0.3f, 0.5f); - - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - const b2XForm& xf = b->GetXForm(); - for (b2Shape* s = b->GetShapeList(); s; s = s->GetNext()) - { - if (s->GetType() != e_polygonShape) - { - continue; - } - - b2PolygonShape* poly = (b2PolygonShape*)s; - const b2OBB& obb = poly->GetOBB(); - b2Vec2 h = obb.extents; - b2Vec2 vs[4]; - vs[0].Set(-h.x, -h.y); - vs[1].Set( h.x, -h.y); - vs[2].Set( h.x, h.y); - vs[3].Set(-h.x, h.y); - - for (int32 i = 0; i < 4; ++i) - { - vs[i] = obb.center + b2Mul(obb.R, vs[i]); - vs[i] = b2Mul(xf, vs[i]); - } - - m_debugDraw->DrawPolygon(vs, 4, color); - } - } - } - - if (flags & b2DebugDraw::e_centerOfMassBit) - { - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - b2XForm xf = b->GetXForm(); - xf.position = b->GetWorldCenter(); - m_debugDraw->DrawXForm(xf); - } - } -} - -void b2World::Validate() -{ - m_broadPhase->Validate(); -} - -int32 b2World::GetProxyCount() const -{ - return m_broadPhase->m_proxyCount; -} - -int32 b2World::GetPairCount() const -{ - return m_broadPhase->m_pairManager.m_pairCount; -} diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index af3f84ce5..7cdfc8ba2 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -30,7 +30,7 @@ #include // Box2D -#include "Include/Box2D.h" +#include namespace love { From e32a373dc9952bfbaa8106e5123c539c0445d876 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 13 Mar 2011 08:04:43 -0400 Subject: [PATCH 003/384] add new joint enums (no implementation yet) --HG-- branch : box2d-update --- src/modules/physics/Joint.cpp | 3 +++ src/modules/physics/Joint.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/modules/physics/Joint.cpp b/src/modules/physics/Joint.cpp index 99b90041c..add6b33bf 100644 --- a/src/modules/physics/Joint.cpp +++ b/src/modules/physics/Joint.cpp @@ -46,6 +46,9 @@ namespace physics {"mouse", Joint::JOINT_MOUSE}, {"pulley", Joint::JOINT_PULLEY}, {"gear", Joint::JOINT_GEAR}, + {"friction", Joint::JOINT_FRICTION}, + {"line", Joint::JOINT_LINE}, + {"weld", Joint::JOINT_WELD}, }; StringMap Joint::types(Joint::typeEntries, sizeof(Joint::typeEntries)); diff --git a/src/modules/physics/Joint.h b/src/modules/physics/Joint.h index f5e49aa4a..efa89bec3 100644 --- a/src/modules/physics/Joint.h +++ b/src/modules/physics/Joint.h @@ -42,6 +42,9 @@ namespace physics JOINT_MOUSE, JOINT_PULLEY, JOINT_GEAR, + JOINT_FRICTION, + JOINT_LINE, + JOINT_WELD, JOINT_MAX_ENUM }; From caca6243a209fa88080b5d5832f3f07872ce90c9 Mon Sep 17 00:00:00 2001 From: rude Date: Sun, 13 Mar 2011 13:13:37 +0100 Subject: [PATCH 004/384] No SSE2 on Windows. --- platform/msvc2010/love.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 66379eef9..605a93ed9 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -395,7 +395,7 @@ true include;include\SDL;include\AL;..\..\src;..\..\src\modules;%(AdditionalIncludeDirectories) MultiThreaded - StreamingSIMDExtensions2 + NotSet %(Identity).obj VC_EXTRALEAN;NDEBUG;%(PreprocessorDefinitions) From 3024597f9d9f7d770f4b736f12d07d03f371fc31 Mon Sep 17 00:00:00 2001 From: rude Date: Sun, 13 Mar 2011 13:21:18 +0100 Subject: [PATCH 005/384] Updating freetype242MT.lib -> freetype244MT.lib. --- platform/msvc2010/love.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 605a93ed9..6436ae4dd 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -382,7 +382,7 @@ true lib - opengl32.lib;glu32.lib;DevIL.lib;freetype242MT.lib;libmpg123.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua.lib;modplug_d.lib;OpenAL32.lib;physfs.lib;SDL.lib;SDLmain.lib;libFLAC_static_D.lib;libFLAC++_static_D.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;DevIL.lib;freetype244MT.lib;libmpg123.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua.lib;modplug_d.lib;OpenAL32.lib;physfs.lib;SDL.lib;SDLmain.lib;libFLAC_static_D.lib;libFLAC++_static_D.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) Console /FORCE:MULTIPLE %(AdditionalOptions) @@ -408,7 +408,7 @@ false true true - opengl32.lib;glu32.lib;DevIL.lib;freetype242MT.lib;libmpg123.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua.lib;modplug.lib;OpenAL32.lib;physfs.lib;SDL.lib;SDLmain.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;DevIL.lib;freetype244MT.lib;libmpg123.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua.lib;modplug.lib;OpenAL32.lib;physfs.lib;SDL.lib;SDLmain.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) lib Windows From 427db4f28b9bf14cec38f80bf6f8fb3a28d9e8e6 Mon Sep 17 00:00:00 2001 From: rude Date: Sun, 13 Mar 2011 13:23:01 +0100 Subject: [PATCH 006/384] Added recent Windows binary updates to the changelog. --- changes.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/changes.txt b/changes.txt index f9709ae44..53e61971d 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,14 @@ +LOVE 0.7.2 [Game Slave] +----------------------- + + * 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] ----------------------- From ffa9e205eb74f5900ea9bec613cdca4d8bafe4df Mon Sep 17 00:00:00 2001 From: rude Date: Sun, 13 Mar 2011 13:50:30 +0100 Subject: [PATCH 007/384] Updating version -> 0.7.2. --- src/common/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/version.h b/src/common/version.h index 024bd52ea..bb6cd4bd8 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -26,10 +26,10 @@ namespace love // Version stuff. const int VERSION_MAJOR = 0; const int VERSION_MINOR = 7; - const int VERSION_REV = 1; + const int VERSION_REV = 2; const int VERSION = VERSION_MAJOR*100 + VERSION_MINOR*10 + VERSION_REV; - const int VERSION_COMPATIBILITY[] = { VERSION, 070, 0 }; - const char * VERSION_STR = "0.7.1"; + const int VERSION_COMPATIBILITY[] = { VERSION, 071, 070, 0 }; + const char * VERSION_STR = "0.7.2"; const char * VERSION_CODENAME = "Game Slave"; } // love From c3d69746c1a8a234f3a084a9a814d3550f604053 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 13 Mar 2011 09:33:32 -0400 Subject: [PATCH 008/384] making a stab at updating Shapes --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 6 + src/modules/physics/box2d/CircleShape.cpp | 45 ++-- src/modules/physics/box2d/CircleShape.h | 21 +- src/modules/physics/box2d/Fixture.cpp | 9 + src/modules/physics/box2d/Fixture.h | 197 ++++++++++++++ src/modules/physics/box2d/Physics.cpp | 57 ++-- src/modules/physics/box2d/Physics.h | 21 +- src/modules/physics/box2d/PolygonShape.cpp | 12 +- src/modules/physics/box2d/PolygonShape.h | 2 +- src/modules/physics/box2d/Shape.cpp | 244 +----------------- src/modules/physics/box2d/Shape.h | 140 +--------- .../physics/box2d/wrap_CircleShape.cpp | 49 +--- src/modules/physics/box2d/wrap_CircleShape.h | 3 +- .../physics/box2d/wrap_PolygonShape.cpp | 22 -- src/modules/physics/box2d/wrap_Shape.cpp | 196 -------------- src/modules/physics/box2d/wrap_Shape.h | 22 -- 16 files changed, 300 insertions(+), 746 deletions(-) create mode 100644 src/modules/physics/box2d/Fixture.cpp create mode 100644 src/modules/physics/box2d/Fixture.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index eee5e9af9..933c8eeaa 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -184,6 +184,7 @@ A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */; }; A986EC85132CE6DB00F048C8 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */; }; A986EC86132CE6DB00F048C8 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */; }; + A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986ECAD132CEB9300F048C8 /* Fixture.cpp */; }; A98D914410507C97008E03F2 /* EncodedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98D914310507C97008E03F2 /* EncodedImageData.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; A9B4BA9D1045937F001DBC80 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */; }; @@ -598,6 +599,8 @@ A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; A986EC12132CE6D800F048C8 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; A986ECAC132CE82F00F048C8 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; + A986ECAD132CEB9300F048C8 /* Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Fixture.cpp; sourceTree = ""; }; + A986ECAE132CEB9B00F048C8 /* Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fixture.h; sourceTree = ""; }; A98D913E10507BF9008E03F2 /* EncodedImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EncodedImageData.h; sourceTree = ""; }; A98D914310507C97008E03F2 /* EncodedImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EncodedImageData.cpp; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; @@ -1144,6 +1147,8 @@ A93E6AF010420AC7007D418B /* Contact.h */, A93E6AF110420AC7007D418B /* DistanceJoint.cpp */, A93E6AF210420AC7007D418B /* DistanceJoint.h */, + A986ECAD132CEB9300F048C8 /* Fixture.cpp */, + A986ECAE132CEB9B00F048C8 /* Fixture.h */, A93E6AF310420AC7007D418B /* GearJoint.cpp */, A93E6AF410420AC7007D418B /* GearJoint.h */, A93E6AF510420AC7007D418B /* graham */, @@ -1672,6 +1677,7 @@ A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */, A986EC85132CE6DB00F048C8 /* b2RevoluteJoint.cpp in Sources */, A986EC86132CE6DB00F048C8 /* b2WeldJoint.cpp in Sources */, + A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index 2c1546756..3fa88e1d0 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -30,41 +30,28 @@ namespace physics { namespace box2d { - CircleShape::CircleShape(Body * body, b2CircleDef * def) - : Shape(body) + CircleShape::CircleShape(b2CircleShape * c) { - def->localPosition = body->world->scaleDown(def->localPosition); - def->radius = body->world->scaleDown(def->radius); - radius = def->radius; - this->localPosition = def->localPosition; - - def->userData = (void*)data; - shape = body->body->CreateShape(def); + shape = c; } CircleShape::~CircleShape() { + shape = NULL; } - - float CircleShape::getRadius() const - { - return body->world->scaleUp(radius); - } - - void CircleShape::getLocalCenter(float & x, float & y) const - { - x = localPosition.x; - y = localPosition.y; - body->world->scaleUp(x, y); - } - - void CircleShape::getWorldCenter(float & x, float & y) const - { - b2Vec2 worldCenter = body->body->GetWorldPoint(localPosition); - worldCenter = body->world->scaleUp(worldCenter); - x = worldCenter.x; - y = worldCenter.y; - } + + float CircleShape::getRadius() const + { + return shape->m_radius; + } + + /** + * Gets the radius for the circle. + **/ + void CircleShape::setRadius(float r) + { + shape->m_radius = r; + } } // box2d } // physics diff --git a/src/modules/physics/box2d/CircleShape.h b/src/modules/physics/box2d/CircleShape.h index 7b00e5db8..a48becb06 100644 --- a/src/modules/physics/box2d/CircleShape.h +++ b/src/modules/physics/box2d/CircleShape.h @@ -41,15 +41,6 @@ namespace box2d **/ class CircleShape : public Shape { - private: - - // The radius of the circle. We need to store this because - // Box2D has no built-in method for getting the radius. - float radius; - - // Local offset. - b2Vec2 localPosition; - public: /** @@ -58,7 +49,7 @@ namespace box2d * @param body The parent body. * @param def The CircleShape definition. **/ - CircleShape(Body * body, b2CircleDef * def); + CircleShape(b2CircleShape * c); virtual ~CircleShape(); @@ -66,11 +57,11 @@ namespace box2d * Gets the radius for the circle. **/ float getRadius() const; - - // There is no support for setting the radius. - - void getLocalCenter(float & x, float & y) const; - void getWorldCenter(float & x, float & y) const; + + /** + * Gets the radius for the circle. + **/ + void setRadius(float r); }; } // box2d diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp new file mode 100644 index 000000000..fca250b11 --- /dev/null +++ b/src/modules/physics/box2d/Fixture.cpp @@ -0,0 +1,9 @@ +// +// Fixture.cpp +// love +// +// Created by Bill Meltsner on 3/13/11. +// Copyright 2011 Bill Meltsner. All rights reserved. +// + +#include "Fixture.h" diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h new file mode 100644 index 000000000..76760b5d7 --- /dev/null +++ b/src/modules/physics/box2d/Fixture.h @@ -0,0 +1,197 @@ +/** +* 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_PHYSICS_BOX2D_FIXTURE_H +#define LOVE_PHYSICS_BOX2D_FIXTURE_H + +// LOVE +#include +#include +#include +#include +#include + +// 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 + { + protected: + + b2Fixture * fixture; + fixtureudata * data; + + public: + + /** + * Creates a Fixture. + **/ + Fixture(Body * body, Shape * shape); + + virtual ~Fixture(); + + /** + * Gets the type of the Fixture's Shape. Useful for + * debug drawing. + **/ + Shape::Type getType() const; + + /** + * 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); + + /** + * Set whether this Fixture should be a sensor or not. + * @param sensor True if sensor, false if not. + **/ + void setSensor(bool sensor); + + /** + * 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 whether this Fixture acts as a sensor. + * @return True if sensor, false otherwise. + **/ + bool isSensor() const; + + /** + * Get the body attatched to this Fixture. + * @return The parent Body. + **/ + Body * getBody() const; + + /** + * Checks if a point is inside the Fixture. + * @param x The x-component of the Fixture. + * @param y The y-component of the Fixture. + **/ + bool testPoint(float x, float y) const; + + /** + * Tests whether a line segment intersects a Fixture. + **/ + int testSegment(lua_State * L); + + /** + * 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); + + 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); + + /** + * 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 setData(lua_State * L); + + /** + * Gets the data set with setData. If no + * data is set, nil is returned. + **/ + int getData(lua_State * L); + + /** + * 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); + }; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_FIXTURE_H diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 92f6b1de1..7829a1ec9 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -78,41 +78,40 @@ namespace box2d return new CircleShape(body, &def); } - PolygonShape * Physics::newRectangleShape(Body * body, float w, float h) + PolygonShape * Physics::newRectangleShape(float w, float h) { return newRectangleShape(body, 0, 0, w, h, 0); } - PolygonShape * Physics::newRectangleShape(Body * body, float x, float y, float w, float h) + PolygonShape * Physics::newRectangleShape(float x, float y, float w, float h) { return newRectangleShape(body, x, y, w, h, 0); } - PolygonShape * Physics::newRectangleShape(Body * body, float x, float y, float w, float h, float angle) + PolygonShape * Physics::newRectangleShape(float x, float y, float w, float h, float angle) { - b2PolygonDef def; - def.friction = 0.5f; - def.restitution = 0.1f; - def.density = 1.0f; - def.SetAsBox(w/2.0f, h/2.0f, b2Vec2(x, y), angle); - return new PolygonShape(body, &def); + b2PolygonShape s; + s.SetAsBox(w/2.0f, h/2.0f, b2Vec2(x, y), angle); + return new PolygonShape(&s); + } + + PolygonShape * Physics::newEdgeShape(float x1, float y1, float x2, float y2) + { + b2PolygonShape s; + s.SetAsEdge(b2vec2(x1, y1), b2vec2(x2, y2)); + return new PolygonShape(&s); } int Physics::newPolygonShape(lua_State * L) { int argc = lua_gettop(L); - int vcount = (int)(argc-1)/2; - // 1 body + 3 vertices - love::luax_assert_argc(L, 1 + (2 * 3)); + int vcount = (int)argc/2; + // 3 vertices + love::luax_assert_argc(L, 2 * 3); - Body * b = luax_checkbody(L, 1); + b2PolygonShape s; - b2PolygonDef def; - def.friction = 0.5f; - def.restitution = 0.1f; - def.density = 1.0f; - - std::vector points(def.vertexCount); + std::vector points(s.m_vertexCount); std::vector convex_hull; for(int i = 0;ivertexCount; i++) - def->vertices[i] = body->world->scaleDown(def->vertices[i]); - - def->userData = (void*)data; - shape = body->body->CreateShape(def); + shape = p; } PolygonShape::~PolygonShape() @@ -48,11 +43,10 @@ namespace box2d { love::luax_assert_argc(L, 0); b2PolygonShape * p = (b2PolygonShape *)shape; - const b2Vec2 * vertices = p->GetVertices(); int count = p->GetVertexCount(); for(int i = 0;iworld->scaleUp(body->body->GetWorldPoint(vertices[i])); + b2Vec2 v = p->GetVertex(i); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); } diff --git a/src/modules/physics/box2d/PolygonShape.h b/src/modules/physics/box2d/PolygonShape.h index 7c02c9fed..91969031d 100644 --- a/src/modules/physics/box2d/PolygonShape.h +++ b/src/modules/physics/box2d/PolygonShape.h @@ -47,7 +47,7 @@ namespace box2d * @param body The parent Body. * @param def The polygon definition. **/ - PolygonShape(Body * body, b2PolygonDef * def); + PolygonShape(b2PolygonShape * p); virtual ~PolygonShape(); diff --git a/src/modules/physics/box2d/Shape.cpp b/src/modules/physics/box2d/Shape.cpp index 32dcb3304..c3d30854c 100644 --- a/src/modules/physics/box2d/Shape.cpp +++ b/src/modules/physics/box2d/Shape.cpp @@ -33,265 +33,29 @@ namespace physics { namespace box2d { - Shape::Shape(Body * body) - : body(body), shape(NULL) + Shape::Shape() + : shape(NULL) { - body->retain(); - data = new shapeudata(); - data->ref = 0; } Shape::~Shape() { - if(data->ref != 0) - delete data->ref; - - delete data; - data = 0; - - if (shape) - body->body->DestroyShape(shape); shape = 0; - - body->release(); } Shape::Type Shape::getType() const { switch(shape->GetType()) { - case e_circleShape: + case b2Shape::e_circle: return SHAPE_CIRCLE; - case e_polygonShape: + case b2Shape::e_polygon: return SHAPE_POLYGON; default: return SHAPE_INVALID; } } - void Shape::setFriction(float friction) - { - shape->m_friction = friction; - } - - void Shape::setRestitution(float restitution) - { - shape->m_restitution = restitution; - } - - void Shape::setDensity(float density) - { - shape->m_density = density; - } - - void Shape::setSensor(bool sensor) - { - shape->m_isSensor = sensor; - } - - float Shape::getFriction() const - { - return shape->GetFriction(); - } - - float Shape::getRestitution() const - { - return shape->GetRestitution(); - } - - float Shape::getDensity() const - { - return shape->m_density; - } - - bool Shape::isSensor() const - { - return shape->IsSensor(); - } - - Body * Shape::getBody() const - { - return body; - } - - bool Shape::testPoint(float x, float y) const - { - return shape->TestPoint(shape->GetBody()->GetXForm(), body->getWorld()->scaleDown(b2Vec2(x, y))); - } - - int Shape::testSegment(lua_State * L) - { - love::luax_assert_argc(L, 4, 4); - - b2Segment s; - - s.p1.x = (float)lua_tonumber(L, 1); - s.p1.y = (float)lua_tonumber(L, 2); - s.p2.x = (float)lua_tonumber(L, 3); - s.p2.y = (float)lua_tonumber(L, 4); - - s.p1 = body->getWorld()->scaleDown(s.p1); - s.p2 = body->getWorld()->scaleDown(s.p2); - - float lambda; - b2Vec2 normal; - - if(shape->TestSegment(shape->GetBody()->GetXForm(), &lambda, &normal, s, 1.0f)) - { - lua_pushnumber(L, lambda); - normal = body->getWorld()->scaleUp(normal); - lua_pushnumber(L, normal.x); - lua_pushnumber(L, normal.y); - return 3; - } - - return 0; - } - - void Shape::setFilterData(int * v) - { - b2FilterData f; - f.categoryBits = (unsigned short)v[0]; - f.maskBits = (unsigned short)v[1]; - f.groupIndex = v[2]; - shape->SetFilterData(f); - shape->GetBody()->GetWorld()->Refilter(shape); - } - - void Shape::getFilterData(int * v) - { - b2FilterData f = shape->GetFilterData(); - v[0] = (int)f.categoryBits; - v[1] = (int)f.maskBits; - v[2] = f.groupIndex; - } - - int Shape::setCategory(lua_State * L) - { - b2FilterData f = shape->GetFilterData(); - f.categoryBits = (uint16)getBits(L); - shape->SetFilterData(f); - shape->GetBody()->GetWorld()->Refilter(shape); - return 0; - } - - int Shape::setMask(lua_State * L) - { - b2FilterData f = shape->GetFilterData(); - f.maskBits = ~(uint16)getBits(L); - shape->SetFilterData(f); - shape->GetBody()->GetWorld()->Refilter(shape); - return 0; - } - - void Shape::setGroupIndex(int index) - { - b2FilterData f = shape->GetFilterData(); - f.groupIndex = (uint16)index; - shape->SetFilterData(f); - shape->GetBody()->GetWorld()->Refilter(shape); - } - - int Shape::getGroupIndex() const - { - b2FilterData f = shape->GetFilterData(); - return f.groupIndex; - } - - int Shape::getCategory(lua_State * L) - { - return pushBits(L, shape->GetFilterData().categoryBits); - } - - int Shape::getMask(lua_State * L) - { - return pushBits(L, ~(shape->GetFilterData().maskBits)); - } - - uint16 Shape::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 Shape::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 Shape::setData(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 Shape::getData(lua_State * L) - { - love::luax_assert_argc(L, 0, 0); - if(data->ref != 0) - data->ref->push(); - else - lua_pushnil(L); - - return 1; - } - - int Shape::getBoundingBox(lua_State * L) - { - love::luax_assert_argc(L, 0, 0); - b2AABB bb; - shape->ComputeAABB(&bb, shape->GetBody()->GetXForm()); - bb = body->getWorld()->scaleUp(bb); - - // Top left. - lua_pushnumber(L, bb.lowerBound.x); - lua_pushnumber(L, bb.upperBound.y); - - // Bottom left. - lua_pushnumber(L, bb.lowerBound.x); - lua_pushnumber(L, bb.lowerBound.y); - - // Bottom right. - lua_pushnumber(L, bb.upperBound.x); - lua_pushnumber(L, bb.lowerBound.y); - - // Top right. - lua_pushnumber(L, bb.upperBound.x); - lua_pushnumber(L, bb.upperBound.y); - - return 8; - } - } // box2d } // physics } // love diff --git a/src/modules/physics/box2d/Shape.h b/src/modules/physics/box2d/Shape.h index 254465167..bb77239f3 100644 --- a/src/modules/physics/box2d/Shape.h +++ b/src/modules/physics/box2d/Shape.h @@ -35,20 +35,9 @@ namespace physics { namespace box2d { - /** - * This struct is stored in a void pointer - * in the Box2D Shape class. For now, all we - * need is a Lua reference to arbitrary data, - * but we might need more later. - **/ - struct shapeudata - { - // Reference to arbitrary data. - Reference * ref; - }; /** - * A Shape is geometry attached to a Body. + * 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. @@ -57,26 +46,15 @@ namespace box2d { protected: - // A pointer to the parent Body. If the Body - // is destroyed, all child shapes are destroyed as well. - // This ensures that all child shapes are always destroyed - // *before* the parent Body. - Body * body; - // The Box2D shape. b2Shape * shape; - // Our shape data, to be stored in - // the Box2D shape. - shapeudata * data; - public: /** - * Creates a Shape attatched to the specified - * Body. + * Creates a Shape. **/ - Shape(Body * body); + Shape(); virtual ~Shape(); @@ -85,118 +63,6 @@ namespace box2d * debug drawing. **/ Type getType() const; - - /** - * Sets the friction of the Shape. - * @param friction The new friction. - **/ - void setFriction(float friction); - - /** - * Sets the restitution for the Shape. - * @param restitution The restitution. - **/ - void setRestitution(float restitution); - - /** - * Sets the density of the Shape. - * @param density The density of the Shape. - **/ - void setDensity(float density); - - /** - * Set whether this shape should be a sensor or not. - * @param sensor True if sensor, false if not. - **/ - void setSensor(bool sensor); - - /** - * Gets the friction of the Shape. - * @returns The friction. - **/ - float getFriction() const; - - /** - * Gets the restitution of the Shape. - * @return The restitution of the Shape. - **/ - float getRestitution() const; - - /** - * Gets the density of the Shape. - * @return The density. - **/ - float getDensity() const; - - /** - * Checks whether this Shape acts as a sensor. - * @return True if sensor, false otherwise. - **/ - bool isSensor() const; - - /** - * Get the body attatched to this Shape. - * @return The parent Body. - **/ - Body * getBody() const; - - /** - * Checks if a point is inside the Shape. - * @param x The x-component of the Shape. - * @param y The y-component of the Shape. - **/ - bool testPoint(float x, float y) const; - - /** - * Tests whether a line segment intersects a Shape. - **/ - int testSegment(lua_State * L); - - /** - * 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); - - 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); - - /** - * This function stores an in-C reference to - * arbitrary Lua data in the Box2D shape object. - * - * The data set here will be passed to the collision - * handler when collisions occur. - **/ - int setData(lua_State * L); - - /** - * Gets the data set with setData. If no - * data is set, nil is returned. - **/ - int getData(lua_State * L); - - /** - * Gets the bounding box for this Shape. - * The function returns eight values which can be - * passed directly to love.graphics.polygon. - **/ - int getBoundingBox(lua_State * L); }; } // box2d diff --git a/src/modules/physics/box2d/wrap_CircleShape.cpp b/src/modules/physics/box2d/wrap_CircleShape.cpp index 157b905d2..a17bef0d9 100644 --- a/src/modules/physics/box2d/wrap_CircleShape.cpp +++ b/src/modules/physics/box2d/wrap_CircleShape.cpp @@ -38,54 +38,19 @@ namespace box2d return 1; } - int w_CircleShape_getLocalCenter(lua_State * L) - { - CircleShape * c = luax_checkcircleshape(L, 1); - float x, y; - c->getLocalCenter(x, y); - lua_pushnumber(L, x); - lua_pushnumber(L, y); - return 2; - } - - int w_CircleShape_getWorldCenter(lua_State * L) - { - CircleShape * c = luax_checkcircleshape(L, 1); - float x, y; - c->getWorldCenter(x, y); - lua_pushnumber(L, x); - lua_pushnumber(L, y); - return 2; + 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 }, - { "getLocalCenter", w_CircleShape_getLocalCenter }, - { "getWorldCenter", w_CircleShape_getWorldCenter }, + { "setRadius", w_CircleShape_setRadius }, // From Shape. { "getType", w_Shape_getType }, - { "setFriction", w_Shape_setFriction }, - { "setRestitution", w_Shape_setRestitution }, - { "setDensity", w_Shape_setDensity }, - { "setSensor", w_Shape_setSensor }, - { "getFriction", w_Shape_getFriction }, - { "getRestitution", w_Shape_getRestitution }, - { "getDensity", w_Shape_getDensity }, - { "getBody", w_Shape_getBody }, - { "isSensor", w_Shape_isSensor }, - { "testPoint", w_Shape_testPoint }, - { "testSegment", w_Shape_testSegment }, - { "setFilterData", w_Shape_setFilterData }, - { "getFilterData", w_Shape_getFilterData }, - { "setCategory", w_Shape_setCategory }, - { "getCategory", w_Shape_getCategory }, - { "setMask", w_Shape_setMask }, - { "getMask", w_Shape_getMask }, - { "setData", w_Shape_setData }, - { "getData", w_Shape_getData }, - { "getBoundingBox", w_Shape_getBoundingBox }, - { "getGroupIndex", w_Shape_getGroupIndex }, - { "setGroupIndex", w_Shape_setGroupIndex }, { "destroy", w_Shape_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_CircleShape.h b/src/modules/physics/box2d/wrap_CircleShape.h index 17925391f..4cd879b51 100644 --- a/src/modules/physics/box2d/wrap_CircleShape.h +++ b/src/modules/physics/box2d/wrap_CircleShape.h @@ -34,8 +34,7 @@ namespace box2d { CircleShape * luax_checkcircleshape(lua_State * L, int idx); int w_CircleShape_getRadius(lua_State * L); - int w_CircleShape_getLocalCenter(lua_State * L); - int w_CircleShape_getWorldCenter(lua_State * L); + int w_CircleShape_setRadius(lua_State * L); int luaopen_circleshape(lua_State * L); } // box2d diff --git a/src/modules/physics/box2d/wrap_PolygonShape.cpp b/src/modules/physics/box2d/wrap_PolygonShape.cpp index af5e0d8e2..8b8a5cc28 100644 --- a/src/modules/physics/box2d/wrap_PolygonShape.cpp +++ b/src/modules/physics/box2d/wrap_PolygonShape.cpp @@ -42,28 +42,6 @@ namespace box2d { "getPoints", w_PolygonShape_getPoints }, // From Shape. { "getType", w_Shape_getType }, - { "setFriction", w_Shape_setFriction }, - { "setRestitution", w_Shape_setRestitution }, - { "setDensity", w_Shape_setDensity }, - { "setSensor", w_Shape_setSensor }, - { "getFriction", w_Shape_getFriction }, - { "getRestitution", w_Shape_getRestitution }, - { "getDensity", w_Shape_getDensity }, - { "getBody", w_Shape_getBody }, - { "isSensor", w_Shape_isSensor }, - { "testPoint", w_Shape_testPoint }, - { "testSegment", w_Shape_testSegment }, - { "setFilterData", w_Shape_setFilterData }, - { "getFilterData", w_Shape_getFilterData }, - { "setCategory", w_Shape_setCategory }, - { "getCategory", w_Shape_getCategory }, - { "setMask", w_Shape_setMask }, - { "getMask", w_Shape_getMask }, - { "setData", w_Shape_setData }, - { "getData", w_Shape_getData }, - { "getBoundingBox", w_Shape_getBoundingBox }, - { "getGroupIndex", w_Shape_getGroupIndex }, - { "setGroupIndex", w_Shape_setGroupIndex }, { "destroy", w_Shape_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Shape.cpp b/src/modules/physics/box2d/wrap_Shape.cpp index 758a4c6ad..510b75b16 100644 --- a/src/modules/physics/box2d/wrap_Shape.cpp +++ b/src/modules/physics/box2d/wrap_Shape.cpp @@ -41,180 +41,6 @@ namespace box2d return 1; } - int w_Shape_setFriction(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - float arg1 = (float)luaL_checknumber(L, 2); - t->setFriction(arg1); - return 0; - } - - int w_Shape_setRestitution(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - float arg1 = (float)luaL_checknumber(L, 2); - t->setRestitution(arg1); - return 0; - } - - int w_Shape_setDensity(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - float arg1 = (float)luaL_checknumber(L, 2); - t->setDensity(arg1); - return 0; - } - - int w_Shape_setSensor(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - bool arg1 = luax_toboolean(L, 2); - t->setSensor(arg1); - return 0; - } - - int w_Shape_getFriction(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_pushnumber(L, t->getFriction()); - return 1; - } - - int w_Shape_getRestitution(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_pushnumber(L, t->getRestitution()); - return 1; - } - - int w_Shape_getDensity(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_pushnumber(L, t->getDensity()); - return 1; - } - - int w_Shape_isSensor(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - luax_pushboolean(L, t->isSensor()); - return 1; - } - - int w_Shape_getBody(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - Body * body = t->getBody(); - if(body == 0) - return 0; - body->retain(); - luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); - 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); - luax_pushboolean(L, t->testPoint(x, y)); - return 1; - } - - int w_Shape_testSegment(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->testSegment(L); - } - - int w_Shape_setFilterData(lua_State * L) - { - Shape * t = luax_checkshape(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_Shape_getFilterData(lua_State * L) - { - Shape * t = luax_checkshape(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_Shape_setCategory(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->setCategory(L); - } - - int w_Shape_getCategory(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->getCategory(L); - } - - int w_Shape_setMask(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->setMask(L); - } - - int w_Shape_getMask(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->getMask(L); - } - - int w_Shape_setData(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->setData(L); - } - - int w_Shape_getData(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->getData(L); - } - - int w_Shape_getBoundingBox(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - lua_remove(L, 1); - return t->getBoundingBox(L); - } - - int w_Shape_getGroupIndex(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - int i = t->getGroupIndex(); - lua_pushinteger(L, i); - return 1; - } - - int w_Shape_setGroupIndex(lua_State * L) - { - Shape * t = luax_checkshape(L, 1); - int i = luaL_checkint(L, 2); - t->setGroupIndex(i); - return 0; - } - int w_Shape_destroy(lua_State * L) { Proxy * p = (Proxy *)lua_touserdata(L, 1); @@ -227,28 +53,6 @@ namespace box2d static const luaL_Reg functions[] = { { "getType", w_Shape_getType }, - { "setFriction", w_Shape_setFriction }, - { "setRestitution", w_Shape_setRestitution }, - { "setDensity", w_Shape_setDensity }, - { "setSensor", w_Shape_setSensor }, - { "getFriction", w_Shape_getFriction }, - { "getRestitution", w_Shape_getRestitution }, - { "getDensity", w_Shape_getDensity }, - { "getBody", w_Shape_getBody }, - { "isSensor", w_Shape_isSensor }, - { "testPoint", w_Shape_testPoint }, - { "testSegment", w_Shape_testSegment }, - { "setFilterData", w_Shape_setFilterData }, - { "getFilterData", w_Shape_getFilterData }, - { "setCategory", w_Shape_setCategory }, - { "getCategory", w_Shape_getCategory }, - { "setMask", w_Shape_setMask }, - { "getMask", w_Shape_getMask }, - { "setData", w_Shape_setData }, - { "getData", w_Shape_getData }, - { "getBoundingBox", w_Shape_getBoundingBox }, - { "getGroupIndex", w_Shape_getGroupIndex }, - { "setGroupIndex", w_Shape_setGroupIndex }, { "destroy", w_Shape_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Shape.h b/src/modules/physics/box2d/wrap_Shape.h index 24d7ff21a..02950111d 100644 --- a/src/modules/physics/box2d/wrap_Shape.h +++ b/src/modules/physics/box2d/wrap_Shape.h @@ -33,28 +33,6 @@ namespace box2d { Shape * luax_checkshape(lua_State * L, int idx); int w_Shape_getType(lua_State * L); - int w_Shape_setFriction(lua_State * L); - int w_Shape_setRestitution(lua_State * L); - int w_Shape_setDensity(lua_State * L); - int w_Shape_setSensor(lua_State * L); - int w_Shape_getFriction(lua_State * L); - int w_Shape_getRestitution(lua_State * L); - int w_Shape_getDensity(lua_State * L); - int w_Shape_isSensor(lua_State * L); - int w_Shape_getBody(lua_State * L); - int w_Shape_testPoint(lua_State * L); - int w_Shape_testSegment(lua_State * L); - int w_Shape_setFilterData(lua_State * L); - int w_Shape_getFilterData(lua_State * L); - int w_Shape_setCategory(lua_State * L); - int w_Shape_getCategory(lua_State * L); - int w_Shape_setMask(lua_State * L); - int w_Shape_getMask(lua_State * L); - int w_Shape_setData(lua_State * L); - int w_Shape_getData(lua_State * L); - int w_Shape_getBoundingBox(lua_State * L); - int w_Shape_getGroupIndex(lua_State * L); - int w_Shape_setGroupIndex(lua_State * L); int w_Shape_destroy(lua_State * L); int luaopen_shape(lua_State * L); From be146c5f61dedafa73177960a59e38ffb8746a2d Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 13 Mar 2011 10:09:17 -0400 Subject: [PATCH 009/384] some more Shape fixes --HG-- branch : box2d-update --- src/modules/physics/box2d/wrap_Physics.cpp | 51 +++++++++++++--------- src/modules/physics/box2d/wrap_Physics.h | 3 +- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index e94bf1e2b..cd5d79cf8 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -63,22 +63,21 @@ namespace box2d int w_newCircleShape(lua_State * L) { - Body * body = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); int top = lua_gettop(L); - if(top == 2) + if(top == 1) { - float radius = (float)luaL_checknumber(L, 2); - CircleShape * shape = instance->newCircleShape(body, radius); + float radius = (float)luaL_checknumber(L, 1); + CircleShape * shape = instance->newCircleShape(radius); luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); return 1; } - else if(top == 4) + else if(top == 3) { - float x = (float)luaL_checknumber(L, 2); - float y = (float)luaL_checknumber(L, 3); - float radius = (float)luaL_checknumber(L, 4); - CircleShape * shape = instance->newCircleShape(body, x, y, radius); + float x = (float)luaL_checknumber(L, 1); + float y = (float)luaL_checknumber(L, 2); + float radius = (float)luaL_checknumber(L, 3); + CircleShape * shape = instance->newCircleShape(x, y, radius); luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); return 1; } @@ -88,31 +87,41 @@ namespace box2d int w_newRectangleShape(lua_State * L) { - Body * body = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); int top = lua_gettop(L); - if(top == 3) + if(top == 2) { - float w = (float)luaL_checknumber(L, 2); - float h = (float)luaL_checknumber(L, 3); - PolygonShape * shape = instance->newRectangleShape(body, w, h); + float w = (float)luaL_checknumber(L, 1); + float h = (float)luaL_checknumber(L, 2); + PolygonShape * shape = instance->newRectangleShape(w, h); luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); return 1; } - else if(top == 5 || top == 6) + else if(top == 4 || top == 5) { - 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); - float angle = (float)luaL_optnumber(L, 6, 0); - PolygonShape * shape = instance->newRectangleShape(body, x, y, w, h, angle); + 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 = instance->newRectangleShape(x, y, w, h, angle); luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)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); + PolygonShape * shape = instance->newEdgeShape(x1, y1, x2, y2); + luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); + return 1; + } int w_newPolygonShape(lua_State * L) { diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 46cbb55ff..5385a6e7b 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -48,7 +48,8 @@ namespace box2d int w_newBody(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_newPolygonShape(lua_State * L); int w_newDistanceJoint(lua_State * L); int w_newMouseJoint(lua_State * L); int w_newRevoluteJoint(lua_State * L); From b4fae893fd54227bf20696a34d0a7a9d9cfa7f36 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 13 Mar 2011 13:16:02 -0400 Subject: [PATCH 010/384] updating the Joints --HG-- branch : box2d-update --- src/modules/physics/box2d/DistanceJoint.cpp | 12 ++--- src/modules/physics/box2d/GearJoint.cpp | 8 +-- src/modules/physics/box2d/Joint.cpp | 25 +++------ src/modules/physics/box2d/Joint.h | 14 +---- src/modules/physics/box2d/MouseJoint.cpp | 12 ++--- src/modules/physics/box2d/Physics.cpp | 2 +- src/modules/physics/box2d/PrismaticJoint.cpp | 7 +-- src/modules/physics/box2d/PrismaticJoint.h | 5 -- src/modules/physics/box2d/PulleyJoint.cpp | 51 ++----------------- src/modules/physics/box2d/PulleyJoint.h | 23 --------- src/modules/physics/box2d/RevoluteJoint.cpp | 7 +-- src/modules/physics/box2d/RevoluteJoint.h | 5 -- src/modules/physics/box2d/World.cpp | 8 +++ src/modules/physics/box2d/World.h | 9 ++++ .../physics/box2d/wrap_PrismaticJoint.cpp | 8 --- .../physics/box2d/wrap_PrismaticJoint.h | 1 - .../physics/box2d/wrap_PulleyJoint.cpp | 44 ---------------- src/modules/physics/box2d/wrap_PulleyJoint.h | 5 -- .../physics/box2d/wrap_RevoluteJoint.cpp | 8 --- .../physics/box2d/wrap_RevoluteJoint.h | 1 - 20 files changed, 50 insertions(+), 205 deletions(-) diff --git a/src/modules/physics/box2d/DistanceJoint.cpp b/src/modules/physics/box2d/DistanceJoint.cpp index 3089139e4..d05ee3883 100644 --- a/src/modules/physics/box2d/DistanceJoint.cpp +++ b/src/modules/physics/box2d/DistanceJoint.cpp @@ -46,32 +46,32 @@ namespace box2d void DistanceJoint::setLength(float length) { - joint->m_length = world->scaleDown(length); + joint->SetLength(world->scaleDown(length)); } float DistanceJoint::getLength() const { - return world->scaleUp(joint->m_length); + return world->scaleUp(joint->GetLength()); } void DistanceJoint::setFrequency(float hz) { - joint->m_frequencyHz = hz; + joint->SetFrequency(hz); } float DistanceJoint::getFrequency() const { - return joint->m_frequencyHz; + return joint->GetFrequency(); } void DistanceJoint::setDampingRatio(float d) { - joint->m_dampingRatio = d; + joint->SetDampingRatio(d); } float DistanceJoint::getDampingRatio() const { - return joint->m_dampingRatio; + return joint->GetDampingRatio(); } diff --git a/src/modules/physics/box2d/GearJoint.cpp b/src/modules/physics/box2d/GearJoint.cpp index 6dba58348..aad347f45 100644 --- a/src/modules/physics/box2d/GearJoint.cpp +++ b/src/modules/physics/box2d/GearJoint.cpp @@ -36,8 +36,8 @@ namespace box2d b2GearJointDef def; def.joint1 = joint1->joint; def.joint2 = joint2->joint; - def.body1 = joint1->body2->body; - def.body2 = joint2->body2->body; + def.bodyA = joint1->body2->body; + def.bodyB = joint2->body2->body; def.ratio = ratio; joint = (b2GearJoint*)createJoint(&def); @@ -51,12 +51,12 @@ namespace box2d void GearJoint::setRatio(float ratio) { - joint->m_ratio = ratio; + joint->SetRatio(ratio); } float GearJoint::getRatio() const { - return joint->m_ratio; + return joint->GetRatio(); } } // box2d diff --git a/src/modules/physics/box2d/Joint.cpp b/src/modules/physics/box2d/Joint.cpp index 4e7f0368e..a32f97372 100644 --- a/src/modules/physics/box2d/Joint.cpp +++ b/src/modules/physics/box2d/Joint.cpp @@ -79,34 +79,25 @@ namespace box2d int Joint::getAnchors(lua_State * L) { - lua_pushnumber(L, world->scaleUp(joint->GetAnchor1().x)); - lua_pushnumber(L, world->scaleUp(joint->GetAnchor1().y)); - lua_pushnumber(L, world->scaleUp(joint->GetAnchor2().x)); - lua_pushnumber(L, world->scaleUp(joint->GetAnchor2().y)); + lua_pushnumber(L, world->scaleUp(joint->GetAnchorA().x)); + lua_pushnumber(L, world->scaleUp(joint->GetAnchorA().y)); + lua_pushnumber(L, world->scaleUp(joint->GetAnchorB().x)); + lua_pushnumber(L, world->scaleUp(joint->GetAnchorB().y)); return 4; } int Joint::getReactionForce(lua_State * L) { - b2Vec2 v = joint->GetReactionForce(); + float dt = (float)luaL_checknumber(L, 2); + b2Vec2 v = joint->GetReactionForce(dt); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); return 2; } - float Joint::getReactionTorque() + float Joint::getReactionTorque(float dt) { - return joint->GetReactionTorque(); - } - - void Joint::setCollideConnected(bool collide) - { - joint->m_collideConnected = collide; - } - - bool Joint::getCollideConnected() const - { - return joint->m_collideConnected; + return joint->GetReactionTorque(dt); } b2Joint * Joint::createJoint(b2JointDef * def) diff --git a/src/modules/physics/box2d/Joint.h b/src/modules/physics/box2d/Joint.h index 6393f0dcb..f05beb735 100644 --- a/src/modules/physics/box2d/Joint.h +++ b/src/modules/physics/box2d/Joint.h @@ -97,19 +97,7 @@ namespace box2d /** * Gets the reaction torque on body2. **/ - float getReactionTorque(); - - /** - * Sets whether connected bodies should collide - * or not. Default is false. - **/ - void setCollideConnected(bool collide); - - /** - * Gets whether connected bodies should collide - * or not. - **/ - bool getCollideConnected() const; + float getReactionTorque(float dt); protected: diff --git a/src/modules/physics/box2d/MouseJoint.cpp b/src/modules/physics/box2d/MouseJoint.cpp index e35f37445..e3f239b8b 100644 --- a/src/modules/physics/box2d/MouseJoint.cpp +++ b/src/modules/physics/box2d/MouseJoint.cpp @@ -35,8 +35,8 @@ namespace box2d { b2MouseJointDef def; - def.body1 = body1->world->world->GetGroundBody(); - def.body2 = body1->body; + def.bodyA = body1->world->getGroundBody(); + def.bodyB = body1->body; def.maxForce = 1000.0f * body1->body->GetMass(); def.target = body1->world->scaleDown(b2Vec2(x,y)); joint = (b2MouseJoint*)createJoint(&def); @@ -55,19 +55,19 @@ namespace box2d int MouseJoint::getTarget(lua_State * L) { - lua_pushnumber(L, world->scaleUp(joint->m_target.x)); - lua_pushnumber(L, world->scaleUp(joint->m_target.y)); + lua_pushnumber(L, world->scaleUp(joint->GetTarget().x)); + lua_pushnumber(L, world->scaleUp(joint->GetTarget().y)); return 2; } void MouseJoint::setMaxForce(float force) { - joint->m_maxForce = force; + joint->SetMaxForce(force); } float MouseJoint::getMaxForce() const { - return joint->m_maxForce; + return joint->GetMaxForce(); } } // box2d diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 7829a1ec9..f76d9c9d1 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -131,7 +131,7 @@ namespace box2d if(count < 3) return luaL_error(L, "Polygon degenerated to less than three points."); - b2vec2 vecs[] = new b2vec2[count]; + b2Vec2 vecs[] = new b2vec2[count]; for (int i = 0; i < count; i++) { vecs[i].Set(convex_hull[i].x, convex_hull[i].y); diff --git a/src/modules/physics/box2d/PrismaticJoint.cpp b/src/modules/physics/box2d/PrismaticJoint.cpp index b613cbe6f..f97eba491 100644 --- a/src/modules/physics/box2d/PrismaticJoint.cpp +++ b/src/modules/physics/box2d/PrismaticJoint.cpp @@ -72,12 +72,7 @@ namespace box2d { joint->SetMaxMotorForce(force); } - - float PrismaticJoint::getMaxMotorForce() const - { - return joint->m_maxMotorForce; - } - + void PrismaticJoint::setMotorSpeed(float speed) { joint->SetMotorSpeed(speed); diff --git a/src/modules/physics/box2d/PrismaticJoint.h b/src/modules/physics/box2d/PrismaticJoint.h index 01baf40e1..6a0fb3b1b 100644 --- a/src/modules/physics/box2d/PrismaticJoint.h +++ b/src/modules/physics/box2d/PrismaticJoint.h @@ -75,11 +75,6 @@ namespace box2d **/ void setMaxMotorForce(float force); - /** - * Get the current motor force, usually in N. - **/ - float getMaxMotorForce() const; - /** * Set the motor speed, usually in meters per second. **/ diff --git a/src/modules/physics/box2d/PulleyJoint.cpp b/src/modules/physics/box2d/PulleyJoint.cpp index e4193902b..d45c850da 100644 --- a/src/modules/physics/box2d/PulleyJoint.cpp +++ b/src/modules/physics/box2d/PulleyJoint.cpp @@ -48,49 +48,13 @@ namespace box2d int PulleyJoint::getGroundAnchors(lua_State * L) { - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchor1().x)); - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchor1().y)); - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchor2().x)); - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchor2().y)); + lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorA().x)); + lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorA().y)); + lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorB().x)); + lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorB().y)); return 4; } - void PulleyJoint::setMaxLengths(float maxlength1, float maxlength2) - { - // Apply Box2D's maximum lengths too. They know better. - - if (maxlength1 > 0) - { - joint->m_maxLength1 = b2Min(world->scaleDown(maxlength1), joint->m_constant - joint->m_ratio * b2_minPulleyLength); - } - - if (maxlength2 > 0) - { - joint->m_maxLength2 = b2Min(world->scaleDown(maxlength2), (joint->m_constant - b2_minPulleyLength) / joint->m_ratio); - } - } - - int PulleyJoint::getMaxLengths(lua_State * L) - { - lua_pushnumber(L, world->scaleUp(joint->m_maxLength1)); - lua_pushnumber(L, world->scaleUp(joint->m_maxLength2)); - return 2; - } - - void PulleyJoint::setConstant(float constant) - { - joint->m_constant = world->scaleDown(constant); - - // Update the max lengths, as does Box2D - joint->m_maxLength1 = joint->m_constant - joint->m_ratio * b2_minPulleyLength; - joint->m_maxLength2 = (joint->m_constant - b2_minPulleyLength) / joint->m_ratio; - } - - float PulleyJoint::getConstant() const - { - return world->scaleUp(joint->m_constant); - } - float PulleyJoint::getLength1() const { return world->scaleUp(joint->GetLength1()); @@ -101,14 +65,9 @@ namespace box2d return world->scaleUp(joint->GetLength2()); } - void PulleyJoint::setRatio(float ratio) - { - joint->m_ratio = ratio; - } - float PulleyJoint::getRatio() const { - return joint->m_ratio; + return joint->GetRatio(); } } // box2d diff --git a/src/modules/physics/box2d/PulleyJoint.h b/src/modules/physics/box2d/PulleyJoint.h index 8e5154c66..9e16e8c33 100644 --- a/src/modules/physics/box2d/PulleyJoint.h +++ b/src/modules/physics/box2d/PulleyJoint.h @@ -56,29 +56,6 @@ namespace box2d **/ int getGroundAnchors(lua_State * L); - /** - * Sets the max rope lengths (a value of zero keeps it - * unchanged). Beware that Box2D also imposes a maximum, - * so the smallest of these is actually set. - **/ - void setMaxLengths(float maxlength1, float maxlength2); - - /** - * Gets the max rope lengths. - **/ - int getMaxLengths(lua_State * L); - - /** - * Sets the total length of the rope and updates the - * MaxLengths values accordingly. - **/ - void setConstant(float length); - - /** - * Gets the total length of the rope. - **/ - float getConstant() const; - /** * Gets the current length of the segment attached to body1. **/ diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index a3003f900..01276ca80 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -70,12 +70,7 @@ namespace box2d { joint->SetMaxMotorTorque(torque); } - - float RevoluteJoint::getMaxMotorTorque() const - { - return joint->m_maxMotorTorque; - } - + void RevoluteJoint::setMotorSpeed(float speed) { joint->SetMotorSpeed(speed); diff --git a/src/modules/physics/box2d/RevoluteJoint.h b/src/modules/physics/box2d/RevoluteJoint.h index 1d9685299..359caa7fb 100644 --- a/src/modules/physics/box2d/RevoluteJoint.h +++ b/src/modules/physics/box2d/RevoluteJoint.h @@ -75,11 +75,6 @@ namespace box2d **/ void setMaxMotorTorque(float torque); - /** - * Gets the maximum motor torque, usually in N-m. - **/ - float getMaxMotorTorque() const; - /** * Sets the motor speed in degrees per second. **/ diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 87594530f..bcb8582a7 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -100,6 +100,8 @@ namespace box2d { world = new b2World(scaleDown(aabb), b2Vec2(0,0), true); world->SetContactListener(this); + b2BodyDef def; + groundBody = world->CreateBody(def); } World::World(b2AABB aabb, b2Vec2 gravity, bool sleep, int meter) @@ -111,6 +113,7 @@ namespace box2d World::~World() { + world->DestroyBody(groundBody); delete world; } @@ -272,6 +275,11 @@ namespace box2d t.upperBound = scaleUp(aabb.upperBound); return t; } + + b2Body * World::getGroundBody() + { + return groundBody; + } } // box2d } // physics diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 7cdfc8ba2..68ed12af1 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -77,6 +77,9 @@ namespace box2d // Pointer to the Box2D world. b2World * world; + + // Ground body + b2Body * groundBody; // Contact callbacks. ContactCallback add, persist, remove, result; @@ -241,6 +244,12 @@ namespace box2d * @return The scaled AABB. **/ b2AABB scaleUp(const b2AABB & aabb); + + /** + * Gets the ground body. + * @return The ground body. + **/ + b2Body * getGroundBody(); }; diff --git a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp index 86b335508..80146caac 100644 --- a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp +++ b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp @@ -68,13 +68,6 @@ namespace box2d return 0; } - int w_PrismaticJoint_getMaxMotorForce(lua_State * L) - { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - lua_pushnumber(L, t->getMaxMotorForce()); - return 1; - } - int w_PrismaticJoint_setMotorSpeed(lua_State * L) { PrismaticJoint * t = luax_checkprismaticjoint(L, 1); @@ -164,7 +157,6 @@ namespace box2d { "setMotorEnabled", w_PrismaticJoint_setMotorEnabled }, { "isMotorEnabled", w_PrismaticJoint_isMotorEnabled }, { "setMaxMotorForce", w_PrismaticJoint_setMaxMotorForce }, - { "getMaxMotorForce", w_PrismaticJoint_getMaxMotorForce }, { "setMotorSpeed", w_PrismaticJoint_setMotorSpeed }, { "getMotorSpeed", w_PrismaticJoint_getMotorSpeed }, { "getMotorForce", w_PrismaticJoint_getMotorForce }, diff --git a/src/modules/physics/box2d/wrap_PrismaticJoint.h b/src/modules/physics/box2d/wrap_PrismaticJoint.h index 1044d1aec..d420e26cb 100644 --- a/src/modules/physics/box2d/wrap_PrismaticJoint.h +++ b/src/modules/physics/box2d/wrap_PrismaticJoint.h @@ -38,7 +38,6 @@ namespace box2d int w_PrismaticJoint_setMotorEnabled(lua_State * L); int w_PrismaticJoint_isMotorEnabled(lua_State * L); int w_PrismaticJoint_setMaxMotorForce(lua_State * L); - int w_PrismaticJoint_getMaxMotorForce(lua_State * L); int w_PrismaticJoint_setMotorSpeed(lua_State * L); int w_PrismaticJoint_getMotorSpeed(lua_State * L); int w_PrismaticJoint_getMotorForce(lua_State * L); diff --git a/src/modules/physics/box2d/wrap_PulleyJoint.cpp b/src/modules/physics/box2d/wrap_PulleyJoint.cpp index ac45af23f..aa68acda3 100644 --- a/src/modules/physics/box2d/wrap_PulleyJoint.cpp +++ b/src/modules/physics/box2d/wrap_PulleyJoint.cpp @@ -37,37 +37,6 @@ namespace box2d lua_remove(L, 1); return t->getGroundAnchors(L); } - - int w_PulleyJoint_setMaxLengths(lua_State * L) - { - PulleyJoint * t = luax_checkpulleyjoint(L, 1); - float arg1 = (float)luaL_optnumber(L, 2, 0.0); - float arg2 = (float)luaL_optnumber(L, 3, 0.0); - t->setMaxLengths(arg1, arg2); - return 0; - } - - int w_PulleyJoint_getMaxLengths(lua_State * L) - { - PulleyJoint * t = luax_checkpulleyjoint(L, 1); - lua_remove(L, 1); - return t->getMaxLengths(L); - } - - int w_PulleyJoint_setConstant(lua_State * L) - { - PulleyJoint * t = luax_checkpulleyjoint(L, 1); - float arg1 = (float)luaL_checknumber(L, 2); - t->setConstant(arg1); - return 0; - } - - int w_PulleyJoint_getConstant(lua_State * L) - { - PulleyJoint * t = luax_checkpulleyjoint(L, 1); - lua_pushnumber(L, t->getConstant()); - return 1; - } int w_PulleyJoint_getLength1(lua_State * L) { @@ -83,14 +52,6 @@ namespace box2d return 1; } - int w_PulleyJoint_setRatio(lua_State * L) - { - PulleyJoint * t = luax_checkpulleyjoint(L, 1); - float arg1 = (float)luaL_checknumber(L, 2); - t->setRatio(arg1); - return 0; - } - int w_PulleyJoint_getRatio(lua_State * L) { PulleyJoint * t = luax_checkpulleyjoint(L, 1); @@ -100,13 +61,8 @@ namespace box2d static const luaL_Reg functions[] = { { "getGroundAnchors", w_PulleyJoint_getGroundAnchors }, - { "setMaxLengths", w_PulleyJoint_setMaxLengths }, - { "getMaxLengths", w_PulleyJoint_getMaxLengths }, - { "setConstant", w_PulleyJoint_setConstant }, - { "getConstant", w_PulleyJoint_getConstant }, { "getLength1", w_PulleyJoint_getLength1 }, { "getLength2", w_PulleyJoint_getLength2 }, - { "setRatio", w_PulleyJoint_setRatio }, { "getRatio", w_PulleyJoint_getRatio }, // From Joint. { "getType", w_Joint_getType }, diff --git a/src/modules/physics/box2d/wrap_PulleyJoint.h b/src/modules/physics/box2d/wrap_PulleyJoint.h index 3ccd33995..6001a5f85 100644 --- a/src/modules/physics/box2d/wrap_PulleyJoint.h +++ b/src/modules/physics/box2d/wrap_PulleyJoint.h @@ -34,13 +34,8 @@ namespace box2d { PulleyJoint * luax_checkpulleyjoint(lua_State * L, int idx); int w_PulleyJoint_getGroundAnchors(lua_State * L); - int w_PulleyJoint_setMaxLengths(lua_State * L); - int w_PulleyJoint_getMaxLengths(lua_State * L); - int w_PulleyJoint_setConstant(lua_State * L); - int w_PulleyJoint_getConstant(lua_State * L); int w_PulleyJoint_getLength1(lua_State * L); int w_PulleyJoint_getLength2(lua_State * L); - int w_PulleyJoint_setRatio(lua_State * L); int w_PulleyJoint_getRatio(lua_State * L); int luaopen_pulleyjoint(lua_State * L); diff --git a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp index 58e2ab6ee..6545d125e 100644 --- a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp +++ b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp @@ -68,13 +68,6 @@ namespace box2d return 0; } - int w_RevoluteJoint_getMaxMotorTorque(lua_State * L) - { - RevoluteJoint * t = luax_checkrevolutejoint(L, 1); - lua_pushnumber(L, t->getMaxMotorTorque()); - return 1; - } - int w_RevoluteJoint_setMotorSpeed(lua_State * L) { RevoluteJoint * t = luax_checkrevolutejoint(L, 1); @@ -164,7 +157,6 @@ namespace box2d { "setMotorEnabled", w_RevoluteJoint_setMotorEnabled }, { "isMotorEnabled", w_RevoluteJoint_isMotorEnabled }, { "setMaxMotorTorque", w_RevoluteJoint_setMaxMotorTorque }, - { "getMaxMotorTorque", w_RevoluteJoint_getMaxMotorTorque }, { "setMotorSpeed", w_RevoluteJoint_setMotorSpeed }, { "getMotorSpeed", w_RevoluteJoint_getMotorSpeed }, { "getMotorTorque", w_RevoluteJoint_getMotorTorque }, diff --git a/src/modules/physics/box2d/wrap_RevoluteJoint.h b/src/modules/physics/box2d/wrap_RevoluteJoint.h index 89c856b62..ad03ce4e1 100644 --- a/src/modules/physics/box2d/wrap_RevoluteJoint.h +++ b/src/modules/physics/box2d/wrap_RevoluteJoint.h @@ -38,7 +38,6 @@ namespace box2d int w_RevoluteJoint_setMotorEnabled(lua_State * L); int w_RevoluteJoint_isMotorEnabled(lua_State * L); int w_RevoluteJoint_setMaxMotorTorque(lua_State * L); - int w_RevoluteJoint_getMaxMotorTorque(lua_State * L); int w_RevoluteJoint_setMotorSpeed(lua_State * L); int w_RevoluteJoint_getMotorSpeed(lua_State * L); int w_RevoluteJoint_getMotorTorque(lua_State * L); From 20364c67bd253b04d2202ef04122afd742821fbb Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 16 Mar 2011 23:23:20 +0100 Subject: [PATCH 011/384] Added love.event.clear, because why not. (Issue #202). --- src/modules/event/sdl/Event.cpp | 10 ++++++++++ src/modules/event/sdl/Event.h | 5 +++++ src/modules/event/sdl/wrap_Event.cpp | 7 +++++++ src/modules/event/sdl/wrap_Event.h | 1 + 4 files changed, 23 insertions(+) diff --git a/src/modules/event/sdl/Event.cpp b/src/modules/event/sdl/Event.cpp index b5e369abe..32881af3d 100644 --- a/src/modules/event/sdl/Event.cpp +++ b/src/modules/event/sdl/Event.cpp @@ -73,6 +73,16 @@ namespace sdl return ok && (SDL_PushEvent(&e) == 0); } + void Event::clear() + { + static SDL_Event e; + + while(SDL_PollEvent(&e)) + { + // Do nothing with 'e' ... + } + } + bool Event::convert(SDL_Event & e, Message & m) { switch(e.type) diff --git a/src/modules/event/sdl/Event.h b/src/modules/event/sdl/Event.h index 1502bc57e..01a91051c 100644 --- a/src/modules/event/sdl/Event.h +++ b/src/modules/event/sdl/Event.h @@ -74,6 +74,11 @@ namespace sdl **/ bool push(Message & message); + /** + * Clears the event queue. + */ + void clear(); + private: bool convert(SDL_Event & e, Message & m); diff --git a/src/modules/event/sdl/wrap_Event.cpp b/src/modules/event/sdl/wrap_Event.cpp index 77b4e6fe5..b9c494bd4 100644 --- a/src/modules/event/sdl/wrap_Event.cpp +++ b/src/modules/event/sdl/wrap_Event.cpp @@ -177,12 +177,19 @@ namespace sdl return 1; } + int w_clear(lua_State * L) + { + instance->clear(); + return 0; + } + // 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 }, { 0, 0 } }; diff --git a/src/modules/event/sdl/wrap_Event.h b/src/modules/event/sdl/wrap_Event.h index 107a0ace9..d06401edb 100644 --- a/src/modules/event/sdl/wrap_Event.h +++ b/src/modules/event/sdl/wrap_Event.h @@ -35,6 +35,7 @@ namespace sdl int w_poll(lua_State * L); int w_wait(lua_State * L); int w_push(lua_State * L); + int w_clear(lua_State * L); extern "C" LOVE_EXPORT int luaopen_love_event(lua_State * L); From 766c863484a488d3bb674eab42820d0f5a3f7af6 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 19 Mar 2011 12:47:39 +0100 Subject: [PATCH 012/384] Make isDown accept a list of keys (issue #121) --- src/modules/keyboard/sdl/Keyboard.cpp | 11 ++++++----- src/modules/keyboard/sdl/Keyboard.h | 4 ++-- src/modules/keyboard/sdl/wrap_Keyboard.cpp | 18 ++++++++++-------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/modules/keyboard/sdl/Keyboard.cpp b/src/modules/keyboard/sdl/Keyboard.cpp index 61b04161a..30b13bc8e 100644 --- a/src/modules/keyboard/sdl/Keyboard.cpp +++ b/src/modules/keyboard/sdl/Keyboard.cpp @@ -31,14 +31,15 @@ namespace sdl return "love.keyboard.sdl"; } - bool Keyboard::isDown(Key key) const + bool Keyboard::isDown(Key * keylist) const { SDLKey k; - - if(keys.find(key, k)) + Uint8 * keystate = SDL_GetKeyState(0); + + for (Key key = *keylist; key != KEY_MAX_ENUM; key = *(++keylist)) { - Uint8 * keystate = SDL_GetKeyState(0); - return keystate[(unsigned)k] == 1; + if (keys.find(key, k) && keystate[(unsigned)k] == 1) + return true; } return false; diff --git a/src/modules/keyboard/sdl/Keyboard.h b/src/modules/keyboard/sdl/Keyboard.h index af807942b..4183ee7e0 100644 --- a/src/modules/keyboard/sdl/Keyboard.h +++ b/src/modules/keyboard/sdl/Keyboard.h @@ -46,7 +46,7 @@ namespace sdl * @param key A key identifier. * @return boolean **/ - bool isDown(Key key) const; + bool isDown(Key * keylist) const; /** * Enables key repeating. @@ -78,4 +78,4 @@ namespace sdl } // keyboard } // love -#endif // LOVE_KEYBOARD_SDL_KEYBOARD_H \ No newline at end of file +#endif // LOVE_KEYBOARD_SDL_KEYBOARD_H diff --git a/src/modules/keyboard/sdl/wrap_Keyboard.cpp b/src/modules/keyboard/sdl/wrap_Keyboard.cpp index 6987f6d81..e7bb06893 100644 --- a/src/modules/keyboard/sdl/wrap_Keyboard.cpp +++ b/src/modules/keyboard/sdl/wrap_Keyboard.cpp @@ -31,16 +31,18 @@ namespace sdl int w_isDown(lua_State * L) { Keyboard::Key k; - - if(Keyboard::getConstant(luaL_checkstring(L, 1), 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++) { - luax_pushboolean(L, instance->isDown(k)); + if(Keyboard::getConstant(luaL_checkstring(L, i+1), k)) + keylist[counter++] = k; } - else - { - luax_pushboolean(L, false); - } - + keylist[counter] = Keyboard::KEY_MAX_ENUM; + + luax_pushboolean(L, instance->isDown(keylist)); return 1; } From 803306270e66f763198ba753f06fc41c03b50dcf Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 19 Mar 2011 10:20:29 -0400 Subject: [PATCH 013/384] Fix a memory leak --- src/modules/keyboard/sdl/wrap_Keyboard.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/keyboard/sdl/wrap_Keyboard.cpp b/src/modules/keyboard/sdl/wrap_Keyboard.cpp index e7bb06893..11f11d459 100644 --- a/src/modules/keyboard/sdl/wrap_Keyboard.cpp +++ b/src/modules/keyboard/sdl/wrap_Keyboard.cpp @@ -43,6 +43,7 @@ namespace sdl keylist[counter] = Keyboard::KEY_MAX_ENUM; luax_pushboolean(L, instance->isDown(keylist)); + delete[] keylist; return 1; } From 27c94e2bc2c413b7174ca8b5708faf862e1112e9 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 19 Mar 2011 23:52:30 -0500 Subject: [PATCH 014/384] update changelog for 0.7.2 --- changes.txt | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/changes.txt b/changes.txt index 53e61971d..879c42712 100644 --- a/changes.txt +++ b/changes.txt @@ -1,13 +1,23 @@ LOVE 0.7.2 [Game Slave] ----------------------- - * 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. + * Added Framebuffer:get/setWrap. + * Added love.event.clear. + * Added support for any number of arguments to love.keyboard.isDown. + + * 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. + + * 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] ----------------------- From 01fdbac92dfd383f63de06491376416441c18d80 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 19 Mar 2011 23:58:14 -0500 Subject: [PATCH 015/384] update OS X version to 0.7.2 --- platform/macosx/love-Info.plist | 66 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/platform/macosx/love-Info.plist b/platform/macosx/love-Info.plist index 0587e2428..112377eb6 100644 --- a/platform/macosx/love-Info.plist +++ b/platform/macosx/love-Info.plist @@ -13,16 +13,16 @@ CFBundleTypeIconFile LoveDocument.icns + CFBundleTypeMIMETypes + + application/x-love-game + CFBundleTypeName Love Project CFBundleTypeOSTypes LOVE - CFBundleTypeMIMETypes - - application/x-love-game - CFBundleTypeRole Viewer LSIsAppleDefaultForType @@ -41,34 +41,6 @@ Viewer - UTExportedTypeDeclarations - - - UTTypeConformsTo - - com.pkware.zip-archive - - UTTypeIdentifier - org.love2d.love-game - UTTypeDescription - Love Project - UTTypeIconFile - LoveDocument.icns - UTTypeTagSpecification - - com.apple.ostype - LOVE - public.filename-extension - - love - - public.mime-type - application/x-love-game - - UTTypeReferenceURL - http://love2d.org/wiki/Game_Distribution - - CFBundleExecutable love CFBundleIconFile @@ -84,10 +56,38 @@ CFBundleSignature LoVe CFBundleVersion - 0.7.1 + 0.7.2 NSMainNibFile SDLMain NSPrincipalClass NSApplication + UTExportedTypeDeclarations + + + UTTypeConformsTo + + com.pkware.zip-archive + + UTTypeDescription + Love 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 + + + From 678f6fdadf192fd67c21397bfa428357f456e132 Mon Sep 17 00:00:00 2001 From: vrld Date: Sun, 3 Apr 2011 16:54:18 +0200 Subject: [PATCH 016/384] Fix getBlendMode() to detect subtractive and multiplicative blend modes. --- src/modules/graphics/opengl/Graphics.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 269233bad..25f2ae172 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -568,7 +568,7 @@ namespace opengl glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); else if (mode == BLEND_MULTIPLICATIVE) glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); - else + else // mode == BLEND_ADDITIVE || mode == BLEND_SUBTRACTIVE glBlendFunc(GL_SRC_ALPHA, GL_ONE); } @@ -580,16 +580,21 @@ namespace opengl glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } - Graphics::BlendMode Graphics::getBlendMode() + Graphics::BlendMode Graphics::getBlendMode () { - GLint dst, src; + GLint dst, src, equation; glGetIntegerv(GL_BLEND_DST, &dst); glGetIntegerv(GL_BLEND_SRC, &src); + glGetIntegerv(GL_BLEND_EQUATION, &equation); - if(src == GL_SRC_ALPHA && dst == GL_ONE) + if (equation == GL_FUNC_REVERSE_SUBTRACT) // && src == GL_SRC_ALPHA && dst == GL_ONE + return BLEND_SUBTRACTIVE; + else if(src == GL_SRC_ALPHA && dst == GL_ONE) // && equation == GL_FUNC_ADD return BLEND_ADDITIVE; - else // src == GL_SRC_ALPHA && dst == GL_ONE_MINUS_SRC_ALPHA + else if (src == GL_SRC_ALPHA && dst == GL_ONE_MINUS_SRC_ALPHA) // && equation == GL_FUNC_ADD return BLEND_ALPHA; + else // src == GL_DST_COLOR && dst == GL_ONE_MINUS_SRC_ALPHA && equation == GL_FUNC_ADD + return BLEND_MULTIPLICATIVE; } Graphics::ColorMode Graphics::getColorMode() From 4f6acb5f488ed5f7eb7c0a841b1f0fda4366d8fd Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 5 Apr 2011 22:13:11 +0200 Subject: [PATCH 017/384] Make love.mouse.isDown accept a list too Credits go to Boolsheet for making this patch (imported unmodified!) --- src/modules/mouse/sdl/Mouse.cpp | 13 ++++++++----- src/modules/mouse/sdl/Mouse.h | 4 ++-- src/modules/mouse/sdl/wrap_Mouse.cpp | 21 ++++++++++++++------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/modules/mouse/sdl/Mouse.cpp b/src/modules/mouse/sdl/Mouse.cpp index 5a2248e33..010510b78 100644 --- a/src/modules/mouse/sdl/Mouse.cpp +++ b/src/modules/mouse/sdl/Mouse.cpp @@ -63,14 +63,17 @@ namespace sdl SDL_ShowCursor(visible ? SDL_ENABLE : SDL_DISABLE); } - bool Mouse::isDown(Button button) const + bool Mouse::isDown(Button * buttonlist) const { - unsigned b = 0; + Uint8 buttonstate = SDL_GetMouseState(0, 0); - if(!buttons.find(button, b)) - return false; + for (Button button = *buttonlist; button != BUTTON_MAX_ENUM; button = *(++buttonlist)) + { + if (buttonstate & SDL_BUTTON(button)) + return true; + } - return (SDL_GetMouseState(0, 0) & SDL_BUTTON(b)) != 0; + return false; } bool Mouse::isVisible() const diff --git a/src/modules/mouse/sdl/Mouse.h b/src/modules/mouse/sdl/Mouse.h index dd1e7ed28..31b03fb95 100644 --- a/src/modules/mouse/sdl/Mouse.h +++ b/src/modules/mouse/sdl/Mouse.h @@ -43,7 +43,7 @@ namespace sdl void getPosition(int & x, int & y) const; void setPosition(int x, int y); void setVisible(bool visible); - bool isDown(Button button) const; + bool isDown(Button * buttonlist) const; bool isVisible() const; void setGrab(bool grab); bool isGrabbed() const; @@ -59,4 +59,4 @@ namespace sdl } // mouse } // love -#endif // LOVE_MOUSE_SDL_MOUSE_H \ No newline at end of file +#endif // LOVE_MOUSE_SDL_MOUSE_H diff --git a/src/modules/mouse/sdl/wrap_Mouse.cpp b/src/modules/mouse/sdl/wrap_Mouse.cpp index f5baef0f9..c99f0e7f3 100644 --- a/src/modules/mouse/sdl/wrap_Mouse.cpp +++ b/src/modules/mouse/sdl/wrap_Mouse.cpp @@ -59,13 +59,20 @@ namespace sdl int w_isDown(lua_State * L) { - Mouse::Button button; - - if(!Mouse::getConstant(luaL_checkstring(L, 1), button)) - luax_pushboolean(L, false); - else - luax_pushboolean(L, instance->isDown(button)); - + 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; } From 7e5e60c0a2b49c05e44270b478fde502afd22602 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 6 Apr 2011 11:20:25 -0400 Subject: [PATCH 018/384] fix the Xcode project --- platform/macosx/love.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 2143a7b5e..0f4a422e0 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -182,7 +182,6 @@ A968F0D91083A9FC00A895AA /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D81083A9FC00A895AA /* Mouse.cpp */; }; A968F0DD1083AA6600A895AA /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DB1083AA6600A895AA /* Shape.cpp */; }; A968F0DE1083AA6600A895AA /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DC1083AA6600A895AA /* Joint.cpp */; }; - A97E3843132A9EDE00198A2F /* love-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A97E3842132A9EDE00198A2F /* love-Info.plist */; }; A986DEB5113249A800810279 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB1113249A800810279 /* Thread.cpp */; }; A986DEB6113249A800810279 /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB3113249A800810279 /* wrap_Thread.cpp */; }; A98D914410507C97008E03F2 /* EncodedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98D914310507C97008E03F2 /* EncodedImageData.cpp */; }; @@ -1477,7 +1476,6 @@ files = ( A9DEC1C11046EFA70049C70C /* Love.icns in Resources */, A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */, - A97E3843132A9EDE00198A2F /* love-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 179bc614276bd8bd81b34735e108a75fd515f535 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 6 Apr 2011 11:21:36 -0400 Subject: [PATCH 019/384] update changelog --- changes.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changes.txt b/changes.txt index 879c42712..f360fe621 100644 --- a/changes.txt +++ b/changes.txt @@ -3,13 +3,14 @@ LOVE 0.7.2 [Game Slave] * Added Framebuffer:get/setWrap. * Added love.event.clear. - * Added support for any number of arguments to love.keyboard.isDown. + * Added support for any number of arguments to love.keyboard.isDown and love.mouse.isDown. * 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. * Updated PhysicsFS version to 2.0.2 on Windows * Updated OpenAL Soft version to 1.13 on Windows From fe6d168bf1769d4d5f0db44a3416613d43720a57 Mon Sep 17 00:00:00 2001 From: rude Date: Thu, 7 Apr 2011 18:16:44 +0200 Subject: [PATCH 020/384] Enable mStereoSeparation/mMaxMixChannels settings in Windows. --- src/modules/sound/lullaby/ModPlugDecoder.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modules/sound/lullaby/ModPlugDecoder.cpp b/src/modules/sound/lullaby/ModPlugDecoder.cpp index 4dff48aa7..701b6e963 100644 --- a/src/modules/sound/lullaby/ModPlugDecoder.cpp +++ b/src/modules/sound/lullaby/ModPlugDecoder.cpp @@ -41,11 +41,9 @@ namespace lullaby // fill with modplug defaults (modplug _memsets_, so we could get // garbage settings when the struct is only partially initialized) -#ifndef LOVE_WINDOWS // This does not exist yet on Windows. settings.mStereoSeparation = 128; settings.mMaxMixChannels = 32; -#endif // LOVE_WINDOWS settings.mReverbDepth = 0; settings.mReverbDelay = 0; settings.mBassAmount = 0; From 529530c1987888038452190389428016e804eee9 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 7 Apr 2011 19:06:36 +0200 Subject: [PATCH 021/384] love.joystick.isDown gets multiple arguments too --- changes.txt | 2 +- src/modules/joystick/sdl/Joystick.cpp | 15 ++++++++++----- src/modules/joystick/sdl/Joystick.h | 4 ++-- src/modules/joystick/sdl/wrap_Joystick.cpp | 14 ++++++++++++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/changes.txt b/changes.txt index f360fe621..6aaecfead 100644 --- a/changes.txt +++ b/changes.txt @@ -3,7 +3,7 @@ LOVE 0.7.2 [Game Slave] * Added Framebuffer:get/setWrap. * Added love.event.clear. - * Added support for any number of arguments to love.keyboard.isDown and love.mouse.isDown. + * Added support for any number of arguments to love.keyboard.isDown, love.mouse.isDown and love.joystick.isDown. * Fixed fused games not working. * Fixed ParticleSystem:setSize ignoring the variation argument. diff --git a/src/modules/joystick/sdl/Joystick.cpp b/src/modules/joystick/sdl/Joystick.cpp index 5c896147a..e3c1e5032 100644 --- a/src/modules/joystick/sdl/Joystick.cpp +++ b/src/modules/joystick/sdl/Joystick.cpp @@ -189,15 +189,20 @@ namespace sdl return 2; } - bool Joystick::isDown(int index, int button) + bool Joystick::isDown(int index, int * buttonlist) { if(!verifyJoystick(index)) return false; + + int num = getNumButtons(index); + + for (int button = *buttonlist; button != -1; button = *(++buttonlist)) + { + if (button < num && SDL_JoystickGetButton(joysticks[index], button) == 1) + return true; + } - if(button >= getNumButtons(index)) - return false; - - return (SDL_JoystickGetButton(joysticks[index], button) == 1); + return false; } Joystick::Hat Joystick::getHat(int index, int hat) diff --git a/src/modules/joystick/sdl/Joystick.h b/src/modules/joystick/sdl/Joystick.h index 6788ebb4d..72cceac2e 100644 --- a/src/modules/joystick/sdl/Joystick.h +++ b/src/modules/joystick/sdl/Joystick.h @@ -59,7 +59,7 @@ namespace sdl float getAxis(int index, int axis); int getAxes(lua_State * L); int getBall(lua_State * L); - bool isDown(int index, int button); + bool isDown(int index, int * buttonlist); Hat getHat(int index, int hat); void close(int index); @@ -74,4 +74,4 @@ namespace sdl } // joystick } // love -#endif // LOVE_JOYSTICK_SDL_JOYSTICK_H \ No newline at end of file +#endif // LOVE_JOYSTICK_SDL_JOYSTICK_H diff --git a/src/modules/joystick/sdl/wrap_Joystick.cpp b/src/modules/joystick/sdl/wrap_Joystick.cpp index 6d82b8a1a..a76e2c60b 100644 --- a/src/modules/joystick/sdl/wrap_Joystick.cpp +++ b/src/modules/joystick/sdl/wrap_Joystick.cpp @@ -104,8 +104,18 @@ namespace sdl int w_isDown(lua_State * L) { int index = luaL_checkint(L, 1); - int button = luaL_checkint(L, 2); - luax_pushboolean(L, instance->isDown(index, button)); + unsigned int num = lua_gettop(L); + int * buttonlist = new int[num]; + unsigned int counter = 0; + + for (unsigned int i = 1; i < num; i++) + { + buttonlist[counter++] = luaL_checknumber(L, i+1); + } + buttonlist[counter] = -1; + + luax_pushboolean(L, instance->isDown(index, buttonlist)); + delete[] buttonlist; return 1; } From d55941f7fa7c107e84093cb7a8e1ea48374f53f8 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 7 Apr 2011 19:22:55 +0200 Subject: [PATCH 022/384] No more crashes when there is no memory for newImageData (issue #209) --- changes.txt | 1 + src/modules/image/devil/ImageData.cpp | 23 ++++++++++++++++++++++- src/modules/image/wrap_Image.cpp | 7 ++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/changes.txt b/changes.txt index 6aaecfead..0e69c0a09 100644 --- a/changes.txt +++ b/changes.txt @@ -11,6 +11,7 @@ LOVE 0.7.2 [Game Slave] * 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 diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index 1f0ca891d..5d0742df7 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -88,7 +88,28 @@ namespace devil // Bind the image. ilBindImage(image); - ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0); + bool success = ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0); + int err = ilGetError(); + if (err != IL_NO_ERROR){ + switch (err) { + case IL_ILLEGAL_OPERATION: + throw love::Exception("Error: Illegal operation"); + break; + case IL_INVALID_PARAM: + throw love::Exception("Error: invalid parameters"); + break; + case IL_OUT_OF_MEMORY: + throw love::Exception("Error: out of memory"); + break; + default: + throw love::Exception("Error: unknown error"); + break; + } + } + + if(!success) { + throw love::Exception("Could not decode image data."); + } // Set to black. memset((void*)ilGetData(), 0, width*height*4); diff --git a/src/modules/image/wrap_Image.cpp b/src/modules/image/wrap_Image.cpp index a63eebbbe..560c6df74 100644 --- a/src/modules/image/wrap_Image.cpp +++ b/src/modules/image/wrap_Image.cpp @@ -43,7 +43,12 @@ namespace image { int w = luaL_checkint(L, 1); int h = luaL_checkint(L, 2); - ImageData * t = instance->newImageData(w, h); + ImageData * t = 0; + try { + t = instance->newImageData(w, h); + } catch (love::Exception & e) { + return luaL_error(L, e.what()); + } luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void*)t); return 1; } From cdf85280b6dcd14cf59d79ec879e144a3ceda3aa Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 8 Apr 2011 09:12:30 +0200 Subject: [PATCH 023/384] Fix 2 compiler warnings --- src/modules/image/devil/ImageData.cpp | 2 +- src/modules/joystick/sdl/wrap_Joystick.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index 5d0742df7..b5bb8183f 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -88,7 +88,7 @@ namespace devil // Bind the image. ilBindImage(image); - bool success = ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0); + bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0) == IL_TRUE); int err = ilGetError(); if (err != IL_NO_ERROR){ switch (err) { diff --git a/src/modules/joystick/sdl/wrap_Joystick.cpp b/src/modules/joystick/sdl/wrap_Joystick.cpp index a76e2c60b..7c3c2de00 100644 --- a/src/modules/joystick/sdl/wrap_Joystick.cpp +++ b/src/modules/joystick/sdl/wrap_Joystick.cpp @@ -110,7 +110,7 @@ namespace sdl for (unsigned int i = 1; i < num; i++) { - buttonlist[counter++] = luaL_checknumber(L, i+1); + buttonlist[counter++] = (int) luaL_checknumber(L, i+1); } buttonlist[counter] = -1; From bf9ad64559d12a512dc5bba5500d4da8dc69a5e2 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 23 Apr 2011 19:12:52 +0200 Subject: [PATCH 024/384] Prevent negative joystick button indices from being used by isDown. (as mentioned in issue #121) --- src/modules/joystick/sdl/Joystick.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/joystick/sdl/Joystick.cpp b/src/modules/joystick/sdl/Joystick.cpp index e3c1e5032..d6078f5d1 100644 --- a/src/modules/joystick/sdl/Joystick.cpp +++ b/src/modules/joystick/sdl/Joystick.cpp @@ -198,7 +198,7 @@ namespace sdl for (int button = *buttonlist; button != -1; button = *(++buttonlist)) { - if (button < num && SDL_JoystickGetButton(joysticks[index], button) == 1) + if (button >= 0 && button < num && SDL_JoystickGetButton(joysticks[index], button) == 1) return true; } From d60ad99da196c08083cc8107d46fa62fc258c2d2 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 23 Apr 2011 19:16:17 +0200 Subject: [PATCH 025/384] Prevent old DevIL errors from causing love errors --- src/modules/image/devil/ImageData.cpp | 65 +++++++++++++-------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index b5bb8183f..ba054732e 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -90,24 +90,24 @@ namespace devil bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0) == IL_TRUE); int err = ilGetError(); - if (err != IL_NO_ERROR){ - switch (err) { - case IL_ILLEGAL_OPERATION: - throw love::Exception("Error: Illegal operation"); - break; - case IL_INVALID_PARAM: - throw love::Exception("Error: invalid parameters"); - break; - case IL_OUT_OF_MEMORY: - throw love::Exception("Error: out of memory"); - break; - default: - throw love::Exception("Error: unknown error"); - break; - } - } if(!success) { + if (err != IL_NO_ERROR){ + switch (err) { + case IL_ILLEGAL_OPERATION: + throw love::Exception("Error: Illegal operation"); + break; + case IL_INVALID_PARAM: + throw love::Exception("Error: invalid parameters"); + break; + case IL_OUT_OF_MEMORY: + throw love::Exception("Error: out of memory"); + break; + default: + throw love::Exception("Error: unknown error"); + break; + } + } throw love::Exception("Could not decode image data."); } @@ -124,25 +124,24 @@ namespace devil ilBindImage(image); // Try to load the data. bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, data) == IL_TRUE); - int err = ilGetError(); - if (err != IL_NO_ERROR){ - switch (err) { - case IL_ILLEGAL_OPERATION: - throw love::Exception("Error: Illegal operation"); - break; - case IL_INVALID_PARAM: - throw love::Exception("Error: invalid parameters"); - break; - case IL_OUT_OF_MEMORY: - throw love::Exception("Error: out of memory"); - break; - default: - throw love::Exception("Error: unknown error"); - break; - } - } if(!success) { + if (err != IL_NO_ERROR){ + switch (err) { + case IL_ILLEGAL_OPERATION: + throw love::Exception("Error: Illegal operation"); + break; + case IL_INVALID_PARAM: + throw love::Exception("Error: invalid parameters"); + break; + case IL_OUT_OF_MEMORY: + throw love::Exception("Error: out of memory"); + break; + default: + throw love::Exception("Error: unknown error"); + break; + } + } throw love::Exception("Could not decode image data."); } } From 316ca607dfcbd008c18c5406fcfef28bc38e9e27 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 23 Apr 2011 19:18:05 +0200 Subject: [PATCH 026/384] Oops --- src/modules/image/devil/ImageData.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index ba054732e..ed6ba22a3 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -89,9 +89,9 @@ namespace devil ilBindImage(image); bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0) == IL_TRUE); - int err = ilGetError(); if(!success) { + int err = ilGetError(); if (err != IL_NO_ERROR){ switch (err) { case IL_ILLEGAL_OPERATION: @@ -126,6 +126,7 @@ namespace devil bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, data) == IL_TRUE); if(!success) { + int err = ilGetError(); if (err != IL_NO_ERROR){ switch (err) { case IL_ILLEGAL_OPERATION: From dc2d87a90f50360e833553998f71c408f62db269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Romero?= Date: Wed, 27 Apr 2011 16:35:14 +0200 Subject: [PATCH 027/384] Apply patch for issue #219 --- src/modules/graphics/opengl/SpriteBatch.cpp | 7 +++++++ src/modules/graphics/opengl/SpriteBatch.h | 2 ++ src/modules/graphics/opengl/wrap_SpriteBatch.cpp | 11 ++++++++++- src/modules/graphics/opengl/wrap_SpriteBatch.h | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index e0b51b367..ca5762f13 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -171,6 +171,13 @@ namespace opengl glBindBuffer(GL_ARRAY_BUFFER, 0); } + void SpriteBatch::setImage(Image * newimage) + { + image->release(); + image = newimage; + image->retain(); + } + void SpriteBatch::draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const { static Matrix t; diff --git a/src/modules/graphics/opengl/SpriteBatch.h b/src/modules/graphics/opengl/SpriteBatch.h index e375b912c..e6290d6fc 100644 --- a/src/modules/graphics/opengl/SpriteBatch.h +++ b/src/modules/graphics/opengl/SpriteBatch.h @@ -96,6 +96,8 @@ namespace opengl void * lock(); void unlock(); + void setImage(Image * newimage); + // Implements Drawable. void draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const; diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp index b6611f366..f9f6122b2 100644 --- a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp @@ -81,12 +81,21 @@ namespace opengl 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; + } + static const luaL_Reg functions[] = { { "add", w_SpriteBatch_add }, { "addq", w_SpriteBatch_addq }, { "clear", w_SpriteBatch_clear }, { "lock", w_SpriteBatch_lock }, { "unlock", w_SpriteBatch_unlock }, + { "setImage", w_SpriteBatch_setImage }, { 0, 0 } }; @@ -97,4 +106,4 @@ namespace opengl } // opengl } // graphics -} // love \ No newline at end of file +} // love diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.h b/src/modules/graphics/opengl/wrap_SpriteBatch.h index b85b65899..d2ced3d63 100644 --- a/src/modules/graphics/opengl/wrap_SpriteBatch.h +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.h @@ -36,6 +36,8 @@ namespace opengl int w_SpriteBatch_clear(lua_State * L); int w_SpriteBatch_lock(lua_State * L); int w_SpriteBatch_unlock(lua_State * L); + int w_SpriteBatch_setImage(lua_State * L); + int luaopen_spritebatch(lua_State * L); } // opengl From 0ebca72192b9d78d34cf1de331962df26726620f Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 27 Apr 2011 16:40:26 +0200 Subject: [PATCH 028/384] Update changelog --- changes.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/changes.txt b/changes.txt index 0e69c0a09..1ca84bf96 100644 --- a/changes.txt +++ b/changes.txt @@ -4,6 +4,7 @@ LOVE 0.7.2 [Game Slave] * 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. From f136347bcab3b31059e1b25ec20a4362f95d24f2 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 4 May 2011 20:20:53 +0200 Subject: [PATCH 029/384] Added tag 0.7.2 for changeset bcca82b60d0f --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index de79d93b9..88919f4fe 100644 --- a/.hgtags +++ b/.hgtags @@ -3,3 +3,4 @@ db7cd0682883ed357adef013a326bbb26de28c98 0.6.2 9240be0fe0ea1070bc604954ab2e81320e278ad9 0.7.0 18d79c306466d188919c238d23e50ea705b07c03 0.7.1 +bcca82b60d0f5cd724edbe4ed65db18ab95d4691 0.7.2 From 2e675a40c03e09c866fe974d9572c83a2d04698f Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 8 May 2011 18:41:42 -0400 Subject: [PATCH 030/384] do a bit of type cleanup --- src/common/runtime.cpp | 3 +-- src/common/types.h | 6 ------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index d0cfe6401..95e9df64d 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -381,11 +381,10 @@ namespace love {"Drawable", GRAPHICS_DRAWABLE_ID}, {"Image", GRAPHICS_IMAGE_ID}, {"Quad", GRAPHICS_QUAD_ID}, - {"Glyph", GRAPHICS_GLYPH_ID}, {"Font", GRAPHICS_FONT_ID}, {"ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_ID}, {"SpriteBatch", GRAPHICS_SPRITE_BATCH_ID}, - {"VertexBuffer", GRAPHICS_VERTEX_BUFFER_ID}, + {"Framebuffer", GRAPHICS_FRAMEBUFFER_ID}, // Image {"ImageData", IMAGE_IMAGE_DATA_ID}, diff --git a/src/common/types.h b/src/common/types.h index 7009baa14..bbe0650d5 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -39,7 +39,6 @@ namespace love FILESYSTEM_FILE_DATA_ID, // Font - FONT_FONT_DATA_ID, FONT_GLYPH_DATA_ID, FONT_RASTERIZER_ID, @@ -47,11 +46,9 @@ namespace love GRAPHICS_DRAWABLE_ID, GRAPHICS_IMAGE_ID, GRAPHICS_QUAD_ID, - GRAPHICS_GLYPH_ID, GRAPHICS_FONT_ID, GRAPHICS_PARTICLE_SYSTEM_ID, GRAPHICS_SPRITE_BATCH_ID, - GRAPHICS_VERTEX_BUFFER_ID, GRAPHICS_FRAMEBUFFER_ID, // Image @@ -104,7 +101,6 @@ namespace love 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_FONT_DATA_T = (bits(1) << FONT_FONT_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; @@ -112,11 +108,9 @@ namespace love const bits GRAPHICS_DRAWABLE_T = (bits(1) << GRAPHICS_DRAWABLE_ID) | OBJECT_T; const bits GRAPHICS_IMAGE_T = (bits(1) << GRAPHICS_IMAGE_ID) | GRAPHICS_DRAWABLE_T; const bits GRAPHICS_QUAD_T = (bits(1) << GRAPHICS_QUAD_ID) | OBJECT_T; - const bits GRAPHICS_GLYPH_T = (bits(1) << GRAPHICS_GLYPH_ID) | GRAPHICS_DRAWABLE_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_VERTEX_BUFFER_T = (bits(1) << GRAPHICS_VERTEX_BUFFER_ID) | GRAPHICS_DRAWABLE_T; const bits GRAPHICS_FRAMEBUFFER_T = (bits(1) << GRAPHICS_FRAMEBUFFER_ID) | GRAPHICS_DRAWABLE_T; // Image. From a763fc88635c57c72e7cb10475f339be6951fee3 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 8 May 2011 18:50:01 -0400 Subject: [PATCH 031/384] some more cleanup --- src/modules/font/freetype/wrap_Font.h | 1 - src/modules/graphics/opengl/wrap_Graphics.cpp | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/modules/font/freetype/wrap_Font.h b/src/modules/font/freetype/wrap_Font.h index 5a7ca90c9..ac4cc59a2 100644 --- a/src/modules/font/freetype/wrap_Font.h +++ b/src/modules/font/freetype/wrap_Font.h @@ -33,7 +33,6 @@ namespace freetype { int w_newRasterizer(lua_State * L); int w_newGlyphData(lua_State * L); - int w_newFontData(lua_State * L); extern "C" LOVE_EXPORT int luaopen_love_font(lua_State * L); } // freetype diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 2b1a88cd7..4983116b2 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -241,7 +241,7 @@ namespace opengl } // Convert to Rasterizer, if necessary. - if(luax_istype(L, 1, DATA_T) && !luax_istype(L, 1, FONT_FONT_DATA_T)) { + if(luax_istype(L, 1, DATA_T)) { int idxs[] = {1, 2}; luax_convobj(L, idxs, 2, "font", "newRasterizer"); } @@ -266,7 +266,7 @@ namespace opengl Image::Filter img_filter; // Convert to ImageData if necessary. - if(lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || (luax_istype(L, 1, DATA_T) && !luax_istype(L, 1, IMAGE_IMAGE_DATA_T) && !luax_istype(L, 1, FONT_FONT_DATA_T))) + if(lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || (luax_istype(L, 1, DATA_T) && !luax_istype(L, 1, IMAGE_IMAGE_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); @@ -472,7 +472,7 @@ namespace opengl } // Convert to Rasterizer, if necessary. - if(luax_istype(L, 1, DATA_T) && !luax_istype(L, 1, FONT_FONT_DATA_T)) { + if(luax_istype(L, 1, DATA_T)) { int idxs[] = {1, 2}; luax_convobj(L, idxs, 2, "font", "newRasterizer"); } From 2acc6279fee2f6c3a4ef7ccbad5839493fcff49f Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 8 May 2011 19:23:25 -0400 Subject: [PATCH 032/384] update Info.plist for proper UTI compliance and a few aesthetic changes --- platform/macosx/love-Info.plist | 38 ++++++++++++++------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/platform/macosx/love-Info.plist b/platform/macosx/love-Info.plist index 112377eb6..9cdce09d8 100644 --- a/platform/macosx/love-Info.plist +++ b/platform/macosx/love-Info.plist @@ -7,28 +7,18 @@ CFBundleDocumentTypes - CFBundleTypeExtensions - - love - CFBundleTypeIconFile LoveDocument.icns - CFBundleTypeMIMETypes - - application/x-love-game - CFBundleTypeName - Love Project - CFBundleTypeOSTypes - - LOVE - + LÖVE Project CFBundleTypeRole Viewer - LSIsAppleDefaultForType - - LSTypeIsPackage - + LSItemContentTypes + + org.love2d.love-game + + LSHandlerRank + Owner CFBundleTypeName @@ -39,6 +29,8 @@ CFBundleTypeRole Viewer + LSHandlerRank + None CFBundleExecutable @@ -50,13 +42,15 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - love + LÖVE CFBundlePackageType - LoVe + APPL + CFBundleShortVersionString + 0.8.0 CFBundleSignature LoVe - CFBundleVersion - 0.7.2 + NSHumanReadableCopyright + © 2006-2011 LÖVE Development Team NSMainNibFile SDLMain NSPrincipalClass @@ -69,7 +63,7 @@ com.pkware.zip-archive UTTypeDescription - Love Project + LÖVE Project UTTypeIconFile LoveDocument.icns UTTypeIdentifier From cf60754ef008a9f7a32050803872a6d24911b6f3 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 13 May 2011 15:55:41 +0200 Subject: [PATCH 033/384] Make love.image automatically pad ImageData (and thus all images) to PO2. Two notes: - I don't think I ever clear the textures, so are they only transparent by coincidence? - Maybe it's best if we surround the actually po2-ifying with ifs if we ever find a way to test if it's needed. --- src/modules/image/devil/ImageData.cpp | 165 +++++++++++++------------- src/modules/image/devil/ImageData.h | 6 + 2 files changed, 86 insertions(+), 85 deletions(-) diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index 9c7d69304..34c235b1a 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -33,97 +33,19 @@ namespace image { namespace devil { - void ImageData::load(Data * data) + void ImageData::createPo2(int width, int height, void * data) { - // Generate DevIL image. + //create the image ilGenImages(1, &image); - // Bind the image. + //bind it ilBindImage(image); - // Try to load the image. - ILboolean success = ilLoadL(IL_TYPE_UNKNOWN, (void*)data->getData(), data->getSize()); + //scale to nearest bigger po2 + width = pow(2, ceil(log((double) width)/log(2.0))); + height = pow(2, ceil(log((double) height)/log(2.0))); - // Check for errors - if(!success) - { - throw love::Exception("Could not decode image!"); - return; - } - - width = ilGetInteger(IL_IMAGE_WIDTH); - height = ilGetInteger(IL_IMAGE_HEIGHT); - origin = ilGetInteger(IL_IMAGE_ORIGIN); - - // Make sure the image is in RGBA format. - ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); - - // This should always be four. - bpp = ilGetInteger(IL_IMAGE_BPP); - - if(bpp != 4) - { - std::cerr << "Bits per pixel != 4" << std::endl; - return; - } - } - - ImageData::ImageData(Data * data) - { - load(data); - } - - ImageData::ImageData(filesystem::File * file) - { - Data * data = file->read(); - load(data); - data->release(); - } - - ImageData::ImageData(int width, int height) - : width(width), height(height), origin(IL_ORIGIN_UPPER_LEFT), bpp(4) - { - // Generate DevIL image. - ilGenImages(1, &image); - - // Bind the image. - ilBindImage(image); - - bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0) == IL_TRUE); - - if(!success) { - int err = ilGetError(); - if (err != IL_NO_ERROR){ - switch (err) { - case IL_ILLEGAL_OPERATION: - throw love::Exception("Error: Illegal operation"); - break; - case IL_INVALID_PARAM: - throw love::Exception("Error: invalid parameters"); - break; - case IL_OUT_OF_MEMORY: - throw love::Exception("Error: out of memory"); - break; - default: - throw love::Exception("Error: unknown error"); - break; - } - } - throw love::Exception("Could not decode image data."); - } - - // Set to black. - memset((void*)ilGetData(), 0, width*height*4); - } - - ImageData::ImageData(int width, int height, void *data) - : width(width), height(height), origin(IL_ORIGIN_UPPER_LEFT), bpp(4) - { - // Generate DevIL image. - ilGenImages(1, &image); - // Bind the image. - ilBindImage(image); - // Try to load the data. + //create and populate the image bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, data) == IL_TRUE); if(!success) { @@ -148,6 +70,79 @@ namespace devil } } + void ImageData::load(Data * data) + { + // Create a temporary image to store + // the decoded image in. + ILuint tempimage; + + // Generate DevIL image. + ilGenImages(1, &tempimage); + + // Bind the image. + ilBindImage(tempimage); + + // Try to load the image. + ILboolean success = ilLoadL(IL_TYPE_UNKNOWN, (void*)data->getData(), data->getSize()); + + // Check for errors + if(!success) + { + ilDeleteImages(1, &tempimage); + throw love::Exception("Could not decode image!"); + return; + } + + width = ilGetInteger(IL_IMAGE_WIDTH); + height = ilGetInteger(IL_IMAGE_HEIGHT); + origin = ilGetInteger(IL_IMAGE_ORIGIN); + + // Make sure the image is in RGBA format. + ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); + + // This should always be four. + bpp = ilGetInteger(IL_IMAGE_BPP); + + if(bpp != 4) + { + ilDeleteImages(1, &tempimage); + std::cerr << "Bits per pixel != 4" << std::endl; + return; + } + + // Create a new, PO2, image based on it + createPo2(width, height, ilGetData()); + // Delete the temporary image. + ilDeleteImages(1, &tempimage); + } + + ImageData::ImageData(Data * data) + { + load(data); + } + + ImageData::ImageData(filesystem::File * file) + { + Data * data = file->read(); + load(data); + data->release(); + } + + ImageData::ImageData(int width, int height) + : width(width), height(height), origin(IL_ORIGIN_UPPER_LEFT), bpp(4) + { + createPo2(width, height); + + // Set to black. + memset((void*)ilGetData(), 0, width*height*4); + } + + ImageData::ImageData(int width, int height, void *data) + : width(width), height(height), origin(IL_ORIGIN_UPPER_LEFT), bpp(4) + { + createPo2(width, height, data); + } + ImageData::~ImageData() { ilDeleteImages(1, &image); diff --git a/src/modules/image/devil/ImageData.h b/src/modules/image/devil/ImageData.h index 43eee1734..4c6ae1da6 100644 --- a/src/modules/image/devil/ImageData.h +++ b/src/modules/image/devil/ImageData.h @@ -32,6 +32,9 @@ // String #include +// Math +#include + namespace love { namespace image @@ -57,6 +60,9 @@ namespace devil // DevIL image identifier. ILuint image; + // Create PO2 imagedata. + void createPo2(int width, int height, void * data = 0); + void load(Data * data); public: From 1a340cd6a0dbb0d857e731e6ab82fa7f7724a998 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 14 May 2011 23:02:52 +0200 Subject: [PATCH 034/384] Do not wrap when a single word is longer than the wrap limit. (So no extra, empty, newline.) --- src/modules/graphics/opengl/Graphics.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index ba0d95d01..ce76d5426 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -734,6 +734,7 @@ namespace opengl // put words back together until a wrap occurs float width = 0.0f; + float oldwidth = 0.0f; ostringstream string_builder; vector::const_iterator word_iter; for (word_iter = words.begin(); word_iter != words.end(); ++word_iter) { @@ -741,13 +742,14 @@ namespace opengl width += currentFont->getWidth( word ); // on wordwrap, push line to line buffer and clear string builder - if (width >= wrap) { + if (width >= wrap && oldwidth > 0) { lines_to_draw.push_back( string_builder.str() ); string_builder.str( "" ); width = static_cast(currentFont->getWidth( word )); } string_builder << word << " "; width += width_space; + oldwidth = width; } // push last line lines_to_draw.push_back( string_builder.str() ); From af809ab210182c371828b80d192e58c31cb4568f Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 15 May 2011 22:10:17 +0200 Subject: [PATCH 035/384] Switch to bitwise ops to po2ify --- src/modules/image/devil/ImageData.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index 34c235b1a..99a46b2e5 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -27,6 +27,18 @@ #include #include +int toPo2(int n) +{ + n -= 1; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n |= n >> 32; + return n+1; +} + namespace love { namespace image @@ -42,8 +54,8 @@ namespace devil ilBindImage(image); //scale to nearest bigger po2 - width = pow(2, ceil(log((double) width)/log(2.0))); - height = pow(2, ceil(log((double) height)/log(2.0))); + width = toPo2(width); + height = toPo2(height); //create and populate the image bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, data) == IL_TRUE); From 2e9e5a1502b3998dd2e2b63576ae11155fe0ed21 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 15 May 2011 16:33:38 -0400 Subject: [PATCH 036/384] make po2 stuff better --- src/common/math.h | 10 ++++++++++ src/modules/image/devil/ImageData.cpp | 18 ++++-------------- src/modules/image/devil/ImageData.h | 7 ------- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/common/math.h b/src/common/math.h index 4115f44d7..ae8e4aaa5 100644 --- a/src/common/math.h +++ b/src/common/math.h @@ -21,6 +21,8 @@ #ifndef LOVE_MATH_H #define LOVE_MATH_H +#include // for CHAR_BIT + /* Definitions of useful mathematical constants * M_E - e * M_LOG2E - log2(e) @@ -64,6 +66,14 @@ struct vertex float x, y; float s, t; }; + +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; +} } // love diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index 99a46b2e5..2f2e5834c 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -21,24 +21,14 @@ #include "ImageData.h" // STD +#include #include // LOVE #include +#include #include -int toPo2(int n) -{ - n -= 1; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n |= n >> 32; - return n+1; -} - namespace love { namespace image @@ -54,8 +44,8 @@ namespace devil ilBindImage(image); //scale to nearest bigger po2 - width = toPo2(width); - height = toPo2(height); + width = next_p2(width); + height = next_p2(height); //create and populate the image bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, data) == IL_TRUE); diff --git a/src/modules/image/devil/ImageData.h b/src/modules/image/devil/ImageData.h index 4c6ae1da6..055e7d864 100644 --- a/src/modules/image/devil/ImageData.h +++ b/src/modules/image/devil/ImageData.h @@ -23,18 +23,11 @@ // LOVE #include -#include #include // DevIL #include -// String -#include - -// Math -#include - namespace love { namespace image From 360c190ef79673ed348e952dcfe860d876d97d20 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 15 May 2011 23:31:12 +0200 Subject: [PATCH 037/384] Move po2ifying to Image, Quads broken at the moment --- src/modules/graphics/opengl/Image.cpp | 22 +++++++++++++++++++++- src/modules/image/devil/ImageData.cpp | 25 +++++-------------------- src/modules/image/devil/ImageData.h | 4 ++-- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index 84620fdf9..1b6357b84 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -284,13 +284,33 @@ namespace opengl glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + float p2width = next_p2(width); + float p2height = next_p2(height); + float t = width/p2width; + float s = height/p2height; + + vertices[1].t = t; + vertices[2].t = t; + vertices[2].s = s; + vertices[3].s = s; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, + (GLsizei)p2width, + (GLsizei)p2height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0); + + glTexSubImage2D(GL_TEXTURE_2D, + 0, + 0, + 0, (GLsizei)width, (GLsizei)height, - 0, GL_RGBA, GL_UNSIGNED_BYTE, data->getData()); diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index 2f2e5834c..e452985cf 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -35,7 +35,7 @@ namespace image { namespace devil { - void ImageData::createPo2(int width, int height, void * data) + void ImageData::create(int width, int height, void * data) { //create the image ilGenImages(1, &image); @@ -43,10 +43,6 @@ namespace devil //bind it ilBindImage(image); - //scale to nearest bigger po2 - width = next_p2(width); - height = next_p2(height); - //create and populate the image bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, data) == IL_TRUE); @@ -74,15 +70,11 @@ namespace devil void ImageData::load(Data * data) { - // Create a temporary image to store - // the decoded image in. - ILuint tempimage; - // Generate DevIL image. - ilGenImages(1, &tempimage); + ilGenImages(1, &image); // Bind the image. - ilBindImage(tempimage); + ilBindImage(image); // Try to load the image. ILboolean success = ilLoadL(IL_TYPE_UNKNOWN, (void*)data->getData(), data->getSize()); @@ -90,7 +82,6 @@ namespace devil // Check for errors if(!success) { - ilDeleteImages(1, &tempimage); throw love::Exception("Could not decode image!"); return; } @@ -107,15 +98,9 @@ namespace devil if(bpp != 4) { - ilDeleteImages(1, &tempimage); std::cerr << "Bits per pixel != 4" << std::endl; return; } - - // Create a new, PO2, image based on it - createPo2(width, height, ilGetData()); - // Delete the temporary image. - ilDeleteImages(1, &tempimage); } ImageData::ImageData(Data * data) @@ -133,7 +118,7 @@ namespace devil ImageData::ImageData(int width, int height) : width(width), height(height), origin(IL_ORIGIN_UPPER_LEFT), bpp(4) { - createPo2(width, height); + create(width, height); // Set to black. memset((void*)ilGetData(), 0, width*height*4); @@ -142,7 +127,7 @@ namespace devil ImageData::ImageData(int width, int height, void *data) : width(width), height(height), origin(IL_ORIGIN_UPPER_LEFT), bpp(4) { - createPo2(width, height, data); + create(width, height, data); } ImageData::~ImageData() diff --git a/src/modules/image/devil/ImageData.h b/src/modules/image/devil/ImageData.h index 055e7d864..20f9d379f 100644 --- a/src/modules/image/devil/ImageData.h +++ b/src/modules/image/devil/ImageData.h @@ -53,8 +53,8 @@ namespace devil // DevIL image identifier. ILuint image; - // Create PO2 imagedata. - void createPo2(int width, int height, void * data = 0); + // Create imagedata. + void create(int width, int height, void * data = 0); void load(Data * data); From e65f79e8e9bbd1db83fb8af57cd69156b9815688 Mon Sep 17 00:00:00 2001 From: rude Date: Mon, 16 May 2011 14:10:07 +0200 Subject: [PATCH 038/384] Updated MSVC2010 project file. --- platform/msvc2010/love.vcxproj | 2 -- platform/msvc2010/love.vcxproj.filters | 6 ------ 2 files changed, 8 deletions(-) diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 9bcc17743..23caa898d 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -14,7 +14,6 @@ - @@ -211,7 +210,6 @@ - diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index 5e28e739f..9ee8dc221 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -556,9 +556,6 @@ common - - common - common @@ -894,9 +891,6 @@ common - - common - common From 87fd3362e25a30e2f54107bdb76a976ce8982ae9 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 16 May 2011 17:02:43 +0200 Subject: [PATCH 039/384] Mixed up s and t, po2ify should work correctly now, quads still broken --- src/modules/graphics/opengl/Image.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index 1b6357b84..b4f9459dd 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -287,8 +287,8 @@ namespace opengl float p2width = next_p2(width); float p2height = next_p2(height); - float t = width/p2width; - float s = height/p2height; + float s = width/p2width; + float t = height/p2height; vertices[1].t = t; vertices[2].t = t; From 480568e6547bd7d4ffa9cb95b18d60ea500d4e8a Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 16 May 2011 17:12:37 +0200 Subject: [PATCH 040/384] Fix quads with padded images, tiling will still fail --- src/modules/graphics/opengl/Quad.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/graphics/opengl/Quad.cpp b/src/modules/graphics/opengl/Quad.cpp index d8efc470d..b6b0eaf10 100644 --- a/src/modules/graphics/opengl/Quad.cpp +++ b/src/modules/graphics/opengl/Quad.cpp @@ -43,6 +43,8 @@ namespace opengl void Quad::refresh(const Viewport & v, int sw, int sh) { + sw = next_p2(sw); + sh = next_p2(sh); viewport = v; vertices[0].x = 0; From be5cb1696b0e955c9c401af5836db0cf87779de0 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 16 May 2011 12:11:20 -0500 Subject: [PATCH 041/384] fix an "unused parameter" compiler warning --- src/modules/event/sdl/wrap_Event.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/event/sdl/wrap_Event.cpp b/src/modules/event/sdl/wrap_Event.cpp index b9c494bd4..26c8046f1 100644 --- a/src/modules/event/sdl/wrap_Event.cpp +++ b/src/modules/event/sdl/wrap_Event.cpp @@ -177,7 +177,7 @@ namespace sdl return 1; } - int w_clear(lua_State * L) + int w_clear(lua_State *) { instance->clear(); return 0; From 7b8df4431a7e3e8003e4b1ba399e8dae17135566 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 27 May 2011 16:59:46 +0200 Subject: [PATCH 042/384] Use proper chunk names, so tracebacks show filenames. --- src/modules/filesystem/physfs/Filesystem.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 2044acf43..4aea7bd0a 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -530,19 +530,19 @@ namespace physfs if(!lua_isstring(L, -1)) return luaL_error(L, "The argument must be a string."); - const char * filename = lua_tostring(L, -1); + std::string filename = lua_tostring(L, -1); // The file must exist. - if(!exists(filename)) - return luaL_error(L, "File %s does not exist.", filename); + if(!exists(filename.c_str())) + return luaL_error(L, "File %s does not exist.", filename.c_str()); // Create the file. - File * file = newFile(filename); + File * file = newFile(filename.c_str()); // Get the data from the file. Data * data = file->read(); - int status = luaL_loadbuffer(L, (const char *)data->getData(), data->getSize(), filename); + int status = luaL_loadbuffer(L, (const char *)data->getData(), data->getSize(), ("@" + filename).c_str()); data->release(); file->release(); From 8301af4e207efafa8b84a2f001022b8398f019e3 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 29 May 2011 15:19:41 +0200 Subject: [PATCH 043/384] Update changelog for 0.8.0 --- changes.txt | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/changes.txt b/changes.txt index 1ca84bf96..437e6d875 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,29 @@ +LOVE 0.8.0 [Name pending] +------------------------- + + * Added release error screen. + * Added alpha to love.graphics.setBackgroundColor. + * Added framebuffer:clear(r, g, b, a). + * Added love.graphics.arc. + * Added seek and tell to Source objects. + * Added Color class. + * Added color interpolation to ParticleSystem. + * Added alpha masking. + * Added automatic PO2 padding. + * Added UTF-8 support for fonts. + + * Fixed polygon drawing (was off by one). + * Fixed wrapping for single words. + * Fixed tracebacks not showing filenames. + + * Updated love.joystick to be 1-indexed. + * Updated love.thread to use get/set instead of send/receive. + * Updated font engine. + * Updated line drawing to a custom system. + + * Removed framebuffer auto-clearing. + * Removed EncodedImageData. + LOVE 0.7.2 [Game Slave] ----------------------- From 7fb2681836d737667db6bf7e7432a9d444c00fcd Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 29 May 2011 15:33:48 +0200 Subject: [PATCH 044/384] Improve the release error handler a bit --- src/scripts/boot.lua | 10 +- src/scripts/boot.lua.h | 3567 ++++++++++++++++++++-------------------- 2 files changed, 1791 insertions(+), 1786 deletions(-) diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 99cb7deae..68fc86618 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -267,7 +267,8 @@ function love.init() if c.release then love._release = { title = c.title ~= "Untitled" and c.title or nil, - author = c.author ~= "Unnamed" and c.author or nil + author = c.author ~= "Unnamed" and c.author or nil, + url = c.url } end @@ -892,8 +893,7 @@ function love.releaseerrhand(msg) love.graphics.setRenderTarget() -- Load. - love.graphics.setScissor() - love.graphics.setBlendMode("alpha") + love.graphics.reset() love.graphics.setBackgroundColor(89, 157, 220) local font = love.graphics.newFont(14) love.graphics.setFont(font) @@ -904,7 +904,7 @@ function love.releaseerrhand(msg) local err = {} - p = string.format("An error has occured that caused %s to stop\nyou can notify %s about this.", love._release.title or "this game", love._release.author or "the author") + p = string.format("An error has occured that caused %s to stop.\nYou can notify %s about this%s.", love._release.title or "this game", love._release.author or "the author", love._release.url and " at " .. love._release.url or "") local function draw() love.graphics.clear() @@ -937,7 +937,7 @@ end local result = xpcall(love.boot, error_printer) if not result then return end -local result = xpcall(love.init, love.errhand) +local result = xpcall(love.init, love._release and love.releaseerrhand or love.errhand) if not result then return end local result = xpcall(love.run, love._release and love.releaseerrhand or love.errhand) if not result then return end diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 4a948ac01..35775e393 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -264,1801 +264,1806 @@ const unsigned char boot_lua[] = 0x72,0x20,0x6E,0x69,0x6C,0x2C,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x3D, 0x20,0x63,0x2E,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x7E,0x3D,0x20,0x22,0x55, 0x6E,0x6E,0x61,0x6D,0x65,0x64,0x22,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x61, - 0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x6E,0x69,0x6C,0x20,0x7D,0x20, - 0x65,0x6E,0x64,0x20,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,0x20,0x63,0x2E,0x63,0x6F, - 0x6E,0x73,0x6F,0x6C,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x20,0x65,0x6E, - 0x64,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x70,0x61, - 0x69,0x72,0x73,0x28,0x63,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x29,0x20, - 0x64,0x6F,0x20,0x69,0x66,0x20,0x76,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65, - 0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x22,0x20,0x2E, - 0x2E,0x20,0x6B,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x20,0x74,0x68,0x65, - 0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x63,0x72,0x65,0x61,0x74,0x65,0x68,0x61, - 0x6E,0x64,0x6C,0x65,0x72,0x73,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66, - 0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x61,0x6E,0x64,0x20,0x63, - 0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x67,0x72,0x61,0x70,0x68,0x69, - 0x63,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x68,0x65,0x63,0x6B, - 0x4D,0x6F,0x64,0x65,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77, - 0x69,0x64,0x74,0x68,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E, - 0x68,0x65,0x69,0x67,0x68,0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65, - 0x6E,0x2E,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x29,0x20,0x6F, - 0x72,0x20,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64, - 0x74,0x68,0x20,0x3D,0x3D,0x20,0x30,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x73, - 0x63,0x72,0x65,0x65,0x6E,0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x3D, - 0x20,0x30,0x29,0x20,0x74,0x68,0x65,0x6E,0x20,0x61,0x73,0x73,0x65,0x72,0x74, - 0x28,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E, - 0x73,0x65,0x74,0x4D,0x6F,0x64,0x65,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65, - 0x6E,0x2E,0x77,0x69,0x64,0x74,0x68,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65, - 0x65,0x6E,0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x2C,0x20,0x63,0x2E,0x73,0x63, - 0x72,0x65,0x65,0x6E,0x2E,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E, - 0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x76,0x73,0x79,0x6E, - 0x63,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x66,0x73,0x61, - 0x61,0x29,0x2C,0x20,0x22,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20, - 0x73,0x65,0x74,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65, - 0x22,0x29,0x20,0x65,0x6C,0x73,0x65,0x20,0x65,0x72,0x72,0x6F,0x72,0x28,0x22, - 0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x73, - 0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x22,0x29,0x20,0x65,0x6E, - 0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, - 0x2E,0x73,0x65,0x74,0x43,0x61,0x70,0x74,0x69,0x6F,0x6E,0x28,0x63,0x2E,0x74, - 0x69,0x74,0x6C,0x65,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x66,0x69,0x6C,0x65,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x61, - 0x6E,0x64,0x20,0x63,0x2E,0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20,0x74, - 0x68,0x65,0x6E,0x20,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,0x29,0x20,0x65, - 0x6E,0x64,0x20,0x69,0x66,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,0x6D,0x61,0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29, - 0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22, - 0x6D,0x61,0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29,0x20,0x65,0x6E,0x64,0x20, - 0x69,0x66,0x20,0x6E,0x6F,0x5F,0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65, - 0x20,0x74,0x68,0x65,0x6E,0x20,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,0x20,0x65,0x6E,0x64,0x20,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, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x6F,0x70,0x65,0x6E,0x43,0x6F,0x6E,0x73, - 0x6F,0x6C,0x65,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x75, - 0x6E,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x64,0x74,0x20,0x3D,0x20,0x30,0x20,0x77,0x68,0x69,0x6C,0x65,0x20, - 0x74,0x72,0x75,0x65,0x20,0x64,0x6F,0x20,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, - 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,0x20,0x65,0x6E,0x64, - 0x20,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,0x69,0x66,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68, - 0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63, - 0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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,0x20,0x65, - 0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E, - 0x74,0x20,0x74,0x68,0x65,0x6E,0x20,0x66,0x6F,0x72,0x20,0x65,0x2C,0x61,0x2C, - 0x62,0x2C,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,0x20,0x69,0x66, - 0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20, - 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,0x20,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,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65, - 0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x68,0x61,0x6E, - 0x64,0x6C,0x65,0x72,0x73,0x5B,0x65,0x5D,0x28,0x61,0x2C,0x62,0x2C,0x63,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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, - 0x31,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72, - 0x65,0x73,0x65,0x6E,0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64, - 0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x6E,0x6F,0x67,0x61,0x6D,0x65,0x28,0x29,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65, - 0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x43,0x37,0x6D,0x6C,0x44, - 0x51,0x31,0x42,0x4A,0x51,0x30,0x4D,0x67,0x55,0x48,0x4A,0x76,0x5A,0x6D,0x6C, - 0x73,0x5A,0x51,0x41,0x41,0x20,0x65,0x41,0x47,0x46,0x56,0x4D,0x39,0x72,0x45, - 0x30,0x45,0x55,0x2F,0x6A,0x5A,0x75,0x71,0x64,0x41,0x69,0x43,0x46,0x70,0x72, - 0x44,0x72,0x4A,0x34,0x6B,0x43,0x4A,0x4A,0x57,0x61,0x74,0x6F,0x52,0x64,0x51, - 0x32,0x2F,0x52,0x46,0x69,0x61,0x77,0x7A,0x62,0x48,0x37,0x5A,0x46,0x6B,0x47, - 0x51,0x7A,0x53,0x64,0x5A,0x75,0x4E,0x75,0x76,0x75,0x4A,0x72,0x57,0x6C,0x69, - 0x4F,0x54,0x69,0x20,0x30,0x53,0x72,0x65,0x52,0x65,0x32,0x68,0x42,0x2F,0x2B, - 0x41,0x48,0x6E,0x72,0x77,0x5A,0x43,0x39,0x4B,0x68,0x56,0x70,0x46,0x4B,0x4E, - 0x36,0x72,0x4B,0x47,0x4B,0x68,0x46,0x79,0x33,0x78,0x7A,0x57,0x35,0x4D,0x74, - 0x71,0x58,0x71,0x77,0x4D,0x35,0x2B,0x38,0x39,0x34,0x33,0x37,0x33,0x31,0x76, - 0x64,0x74,0x38,0x41,0x44,0x58,0x4C,0x53,0x4E,0x50,0x57,0x41,0x42,0x4F,0x51, - 0x4E,0x20,0x78,0x31,0x4B,0x69,0x45,0x57,0x6C,0x73,0x66,0x45,0x4A,0x71,0x2F, - 0x49,0x67,0x41,0x6A,0x71,0x49,0x4A,0x51,0x54,0x51,0x6C,0x56,0x64,0x76,0x73, - 0x54,0x69,0x51,0x47,0x51,0x59,0x4E,0x7A,0x2B,0x58,0x76,0x6E,0x32,0x48,0x6F, - 0x50,0x67,0x56,0x74,0x57,0x77,0x33,0x76,0x37,0x64,0x37,0x4A,0x33,0x72,0x5A, - 0x72,0x53,0x74,0x70,0x6F,0x48,0x68,0x50,0x31,0x41,0x34,0x45,0x65,0x61,0x20, - 0x32,0x53,0x71,0x77,0x37,0x78,0x64,0x78,0x43,0x6C,0x6B,0x53,0x41,0x6F,0x67, - 0x38,0x33,0x36,0x45,0x70,0x78,0x33,0x51,0x49,0x33,0x2B,0x50,0x59,0x38,0x75, - 0x79,0x50,0x4F,0x55,0x35,0x35,0x65,0x4D,0x47,0x31,0x44,0x79,0x73,0x39,0x78, - 0x46,0x6B,0x69,0x66,0x45,0x41,0x31,0x4C,0x63,0x35,0x2F,0x54,0x62,0x68,0x54, - 0x7A,0x53,0x58,0x54,0x51,0x49,0x4E,0x49,0x4F,0x4A,0x54,0x31,0x20,0x63,0x56, - 0x49,0x2B,0x6E,0x4E,0x65,0x4C,0x6C,0x4E,0x63,0x64,0x42,0x32,0x6C,0x75,0x5A, - 0x73,0x62,0x49,0x45,0x4C,0x31,0x50,0x6B,0x4B,0x61,0x37,0x7A,0x4F,0x36,0x72, - 0x59,0x71,0x47,0x63,0x54,0x76,0x59,0x4F,0x6B,0x4C,0x32,0x64,0x39,0x48,0x35, - 0x4F,0x73,0x39,0x34,0x2B,0x77,0x69,0x48,0x43,0x43,0x78,0x6D,0x74,0x50,0x30, - 0x61,0x34,0x6A,0x5A,0x37,0x31,0x6A,0x4E,0x55,0x2F,0x20,0x34,0x6D,0x48,0x68, - 0x70,0x4F,0x62,0x45,0x68,0x6A,0x30,0x63,0x47,0x44,0x58,0x30,0x2B,0x47,0x41, - 0x56,0x74,0x78,0x71,0x70,0x2B,0x44,0x58,0x43,0x46,0x46,0x38,0x51,0x54,0x53, - 0x65,0x69,0x56,0x48,0x48,0x5A,0x4C,0x67,0x33,0x78,0x6D,0x4B,0x37,0x39,0x56, - 0x76,0x4A,0x4B,0x67,0x6E,0x43,0x51,0x4F,0x4D,0x70,0x6B,0x59,0x59,0x42,0x7A, - 0x57,0x6B,0x68,0x50,0x31,0x30,0x78,0x75,0x20,0x2B,0x4C,0x71,0x48,0x42,0x58, - 0x30,0x6D,0x31,0x78,0x4F,0x76,0x34,0x6E,0x64,0x57,0x55,0x65,0x46,0x35,0x6A, - 0x78,0x4E,0x6E,0x33,0x74,0x54,0x64,0x37,0x30,0x58,0x61,0x41,0x71,0x38,0x77, - 0x44,0x68,0x30,0x4D,0x47,0x67,0x79,0x61,0x44,0x55,0x68,0x51,0x45,0x45,0x55, - 0x45,0x59,0x5A,0x69,0x77,0x55,0x45,0x43,0x47,0x50,0x42,0x6F,0x78,0x4E,0x4C, - 0x4A,0x79,0x50,0x79,0x4F,0x72,0x20,0x42,0x68,0x75,0x54,0x65,0x7A,0x4A,0x31, - 0x4A,0x47,0x71,0x37,0x64,0x47,0x4A,0x45,0x73,0x55,0x46,0x37,0x4E,0x74,0x77, - 0x39,0x74,0x31,0x47,0x6B,0x33,0x54,0x7A,0x2B,0x4B,0x43,0x4A,0x78,0x6C,0x45, - 0x4F,0x31,0x43,0x4A,0x4C,0x38,0x51,0x66,0x34,0x71,0x72,0x38,0x6C,0x50,0x35, - 0x58,0x6E,0x35,0x79,0x31,0x79,0x77,0x32,0x46,0x62,0x33,0x6C,0x4B,0x32,0x62, - 0x6D,0x72,0x72,0x79,0x20,0x34,0x44,0x76,0x46,0x35,0x5A,0x6D,0x35,0x47,0x68, - 0x37,0x58,0x30,0x38,0x6A,0x6A,0x63,0x30,0x31,0x65,0x66,0x4A,0x58,0x55,0x64, - 0x70,0x4E,0x58,0x52,0x35,0x61,0x73,0x65,0x58,0x71,0x38,0x6D,0x75,0x77,0x61, - 0x50,0x2B,0x78,0x58,0x6C,0x7A,0x48,0x6D,0x67,0x6A,0x57,0x50,0x78,0x48,0x4F, - 0x77,0x2B,0x2F,0x45,0x74,0x58,0x35,0x58,0x4D,0x6C,0x79,0x6D,0x4D,0x46,0x4D, - 0x58,0x6A,0x20,0x56,0x66,0x50,0x71,0x53,0x34,0x52,0x31,0x57,0x6A,0x45,0x33, - 0x33,0x35,0x39,0x73,0x66,0x7A,0x73,0x39,0x34,0x69,0x37,0x50,0x4C,0x72,0x58, - 0x57,0x63,0x36,0x32,0x4A,0x69,0x7A,0x64,0x57,0x6D,0x35,0x64,0x6E,0x2F,0x57, - 0x70,0x49,0x2B,0x2B,0x36,0x71,0x76,0x4A,0x50,0x6D,0x56,0x66,0x6C,0x50,0x58, - 0x76,0x58,0x78,0x2F,0x47,0x66,0x4E,0x78,0x47,0x50,0x69,0x4B,0x54,0x45,0x6D, - 0x20,0x64,0x6F,0x72,0x6E,0x49,0x59,0x6D,0x58,0x78,0x53,0x37,0x78,0x6B,0x74, - 0x68,0x4C,0x71,0x77,0x76,0x69,0x59,0x47,0x33,0x48,0x43,0x4A,0x32,0x56,0x68, - 0x69,0x6E,0x53,0x62,0x5A,0x48,0x36,0x4A,0x4E,0x56,0x67,0x59,0x4A,0x71,0x38, - 0x39,0x53,0x39,0x64,0x50,0x31,0x74,0x34,0x76,0x55,0x5A,0x2F,0x44,0x50,0x56, - 0x52,0x6C,0x42,0x6E,0x4D,0x30,0x6C,0x53,0x4A,0x39,0x33,0x2F,0x43,0x20,0x4B, - 0x6D,0x51,0x30,0x6E,0x62,0x6B,0x4F,0x62,0x2F,0x71,0x50,0x32,0x38,0x66,0x38, - 0x46,0x2B,0x54,0x33,0x69,0x75,0x65,0x66,0x4B,0x41,0x49,0x76,0x62,0x4F,0x44, - 0x49,0x6D,0x62,0x70,0x74,0x55,0x33,0x48,0x76,0x45,0x4B,0x46,0x6C,0x70,0x57, - 0x35,0x7A,0x72,0x67,0x49,0x58,0x76,0x39,0x46,0x39,0x38,0x4C,0x5A,0x75,0x61, - 0x36,0x4E,0x2B,0x4F,0x50,0x77,0x45,0x57,0x44,0x79,0x72,0x20,0x46,0x71,0x31, - 0x53,0x4E,0x5A,0x38,0x67,0x76,0x41,0x45,0x63,0x64,0x6F,0x64,0x36,0x48,0x75, - 0x67,0x70,0x6D,0x4E,0x4F,0x57,0x6C,0x73,0x30,0x35,0x55,0x6F,0x63,0x73,0x6E, - 0x35,0x4F,0x36,0x36,0x63,0x70,0x69,0x55,0x73,0x78,0x51,0x32,0x30,0x4E,0x53, - 0x55,0x74,0x63,0x6C,0x31,0x32,0x56,0x4C,0x46,0x72,0x4F,0x5A,0x56,0x57,0x4C, - 0x70,0x64,0x74,0x69,0x5A,0x30,0x78,0x31,0x75,0x20,0x48,0x4B,0x45,0x35,0x51, - 0x76,0x66,0x45,0x70,0x30,0x70,0x6C,0x6B,0x2F,0x71,0x76,0x38,0x52,0x47,0x77, - 0x2F,0x62,0x42,0x53,0x2B,0x66,0x6D,0x73,0x55,0x74,0x6C,0x2B,0x54,0x68,0x72, - 0x57,0x67,0x5A,0x66,0x36,0x62,0x38,0x43,0x38,0x2F,0x55,0x58,0x41,0x65,0x49, - 0x75,0x4A,0x41,0x41,0x41,0x41,0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41, - 0x41,0x73,0x54,0x41,0x41,0x41,0x4C,0x20,0x45,0x77,0x45,0x41,0x6D,0x70,0x77, - 0x59,0x41,0x41,0x41,0x4B,0x45,0x45,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65, - 0x32,0x62,0x61,0x32,0x77,0x55,0x31,0x78,0x58,0x48,0x7A,0x2B,0x79,0x75,0x71, - 0x59,0x33,0x42,0x59,0x4F,0x4D,0x51,0x61,0x48,0x69,0x6B,0x78,0x6A,0x7A,0x69, - 0x4E,0x70,0x41,0x55,0x4D,0x49,0x4B,0x6B,0x77,0x71,0x56,0x53,0x68,0x49,0x54, - 0x55,0x79,0x6C,0x58,0x56,0x20,0x56,0x71,0x6F,0x71,0x52,0x61,0x71,0x45,0x43, - 0x46,0x43,0x70,0x4C,0x53,0x4A,0x53,0x50,0x79,0x56,0x52,0x50,0x30,0x51,0x69, - 0x55,0x6C,0x73,0x56,0x62,0x45,0x64,0x52,0x50,0x31,0x53,0x4B,0x2B,0x69,0x47, - 0x4B,0x57,0x74,0x52,0x55,0x53,0x47,0x33,0x56,0x68,0x78,0x49,0x6C,0x63,0x62, - 0x7A,0x47,0x45,0x46,0x4A,0x6B,0x31,0x6D,0x76,0x41,0x42,0x76,0x78,0x65,0x76, - 0x4C,0x62,0x58,0x20,0x33,0x76,0x55,0x2B,0x35,0x2F,0x62,0x63,0x54,0x55,0x31, - 0x32,0x5A,0x32,0x62,0x78,0x47,0x74,0x74,0x6E,0x7A,0x39,0x72,0x6E,0x66,0x74, - 0x6D,0x39,0x64,0x2B,0x37,0x4D,0x4F,0x66,0x64,0x2F,0x66,0x6E,0x76,0x75,0x7A, - 0x4A,0x32,0x37,0x68,0x6C,0x49,0x4B,0x70,0x43,0x78,0x66,0x42,0x56,0x7A,0x4C, - 0x64,0x2B,0x67,0x79,0x63,0x71,0x32,0x41,0x41,0x4C,0x44,0x4D,0x4F,0x52,0x41, - 0x41,0x20,0x42,0x49,0x42,0x6C,0x72,0x73,0x41,0x79,0x48,0x37,0x35,0x6B,0x41, - 0x41,0x46,0x67,0x6D,0x53,0x75,0x77,0x7A,0x49,0x63,0x76,0x47,0x55,0x41,0x41, - 0x57,0x4F,0x59,0x4B,0x4C,0x50,0x50,0x68,0x65,0x35,0x62,0x79,0x2B,0x4E,0x73, - 0x37,0x6D,0x7A,0x65,0x59,0x62,0x6E,0x67,0x65,0x46,0x4F,0x77,0x46,0x51,0x32, - 0x30,0x48,0x4D,0x4A,0x37,0x45,0x38,0x64,0x59,0x41,0x71,0x45,0x72,0x38,0x20, - 0x7A,0x43,0x77,0x39,0x65,0x43,0x79,0x49,0x37,0x64,0x63,0x4D,0x4D,0x47,0x34, - 0x72,0x55,0x33,0x6E,0x4E,0x31,0x66,0x45,0x50,0x44,0x32,0x37,0x36,0x2B,0x58, - 0x52,0x6D,0x70,0x36,0x58,0x34,0x33,0x56,0x68,0x4B,0x4B,0x34,0x47,0x74,0x66, - 0x62,0x38,0x70,0x63,0x30,0x2B,0x56,0x4E,0x49,0x4C,0x68,0x4F,0x71,0x49,0x4D, - 0x4F,0x41,0x78,0x4B,0x31,0x63,0x34,0x76,0x61,0x45,0x59,0x48,0x20,0x43,0x76, - 0x51,0x2B,0x77,0x6E,0x4F,0x70,0x66,0x75,0x66,0x70,0x66,0x38,0x2F,0x76,0x57, - 0x6A,0x7A,0x50,0x58,0x68,0x49,0x41,0x65,0x50,0x31,0x4E,0x6A,0x57,0x44,0x43, - 0x6A,0x7A,0x48,0x6F,0x6A,0x59,0x73,0x6C,0x4D,0x32,0x61,0x47,0x43,0x57,0x57, - 0x6F,0x64,0x38,0x42,0x30,0x76,0x58,0x56,0x67,0x31,0x30,0x73,0x64,0x69,0x32, - 0x57,0x48,0x2B,0x72,0x70,0x46,0x44,0x59,0x43,0x33,0x20,0x75,0x2B,0x57,0x59, - 0x53,0x70,0x6E,0x6E,0x77,0x49,0x41,0x36,0x59,0x75,0x48,0x65,0x4D,0x31,0x50, - 0x47,0x6D,0x59,0x4E,0x31,0x4A,0x32,0x38,0x53,0x32,0x31,0x31,0x77,0x63,0x30, - 0x55,0x4A,0x51,0x4B,0x76,0x2F,0x66,0x4C,0x31,0x62,0x75,0x56,0x37,0x48,0x31, - 0x31,0x68,0x48,0x46,0x6C,0x79,0x52,0x75,0x56,0x33,0x77,0x37,0x52,0x56,0x75, - 0x38,0x38,0x79,0x7A,0x74,0x54,0x38,0x4E,0x20,0x7A,0x4F,0x30,0x30,0x50,0x72, - 0x32,0x4C,0x43,0x6F,0x42,0x57,0x2F,0x35,0x74,0x50,0x75,0x4D,0x33,0x55,0x2B, - 0x58,0x78,0x54,0x66,0x53,0x49,0x56,0x68,0x39,0x42,0x30,0x45,0x4D,0x4C,0x78, - 0x45,0x45,0x53,0x54,0x59,0x59,0x67,0x6C,0x6F,0x68,0x42,0x4C,0x52,0x69,0x46, - 0x70,0x4A,0x72,0x49,0x69,0x38,0x43,0x56,0x50,0x47,0x58,0x68,0x63,0x48,0x6C, - 0x69,0x35,0x59,0x6A,0x57,0x55,0x20,0x65,0x6B,0x71,0x68,0x76,0x48,0x51,0x74, - 0x72,0x43,0x6D,0x74,0x41,0x73,0x50,0x49,0x37,0x79,0x6E,0x5A,0x41,0x47,0x68, - 0x4A,0x6C,0x63,0x66,0x50,0x46,0x4F,0x4E,0x4E,0x59,0x39,0x45,0x41,0x34,0x4F, - 0x31,0x71,0x4F,0x61,0x48,0x41,0x62,0x4D,0x6D,0x4B,0x6E,0x45,0x4E,0x6C,0x4F, - 0x68,0x47,0x47,0x2B,0x31,0x4D,0x44,0x45,0x49,0x79,0x4D,0x77,0x48,0x51,0x38, - 0x37,0x4E,0x41,0x6A,0x20,0x76,0x79,0x59,0x64,0x2F,0x41,0x6F,0x45,0x6F,0x57, - 0x72,0x6C,0x65,0x6C,0x68,0x58,0x76,0x68,0x45,0x38,0x37,0x70,0x4A,0x5A,0x54, - 0x6A,0x53,0x36,0x58,0x59,0x5A,0x36,0x61,0x66,0x2B,0x4F,0x55,0x2F,0x2B,0x61, - 0x70,0x53,0x4F,0x72,0x77,0x2B,0x77,0x42,0x2B,0x4C,0x54,0x33,0x74,0x32,0x74, - 0x6A,0x30,0x5A,0x49,0x57,0x6E,0x4F,0x64,0x2F,0x2B,0x44,0x44,0x6C,0x67,0x70, - 0x46,0x68,0x20,0x36,0x42,0x2F,0x76,0x67,0x58,0x41,0x73,0x39,0x4C,0x42,0x75, - 0x6A,0x33,0x51,0x4D,0x62,0x77,0x43,0x68,0x73,0x72,0x77,0x61,0x4E,0x6C,0x64, - 0x75,0x68,0x37,0x4B,0x53,0x56,0x62,0x4E,0x64,0x34,0x34,0x30,0x44,0x4F,0x30, - 0x2B,0x39,0x50,0x46,0x73,0x6E,0x4C,0x73,0x64,0x5A,0x41,0x2B,0x44,0x74,0x75, - 0x72,0x41,0x50,0x38,0x2F,0x41,0x66,0x63,0x4D,0x2F,0x4B,0x56,0x33,0x4D,0x4A, - 0x20,0x4E,0x68,0x55,0x64,0x68,0x7A,0x76,0x42,0x4C,0x70,0x69,0x4D,0x54,0x65, - 0x54,0x71,0x73,0x6D,0x44,0x74,0x47,0x6F,0x54,0x71,0x56,0x52,0x73,0x52,0x68, - 0x46,0x70,0x59,0x67,0x56,0x4E,0x46,0x72,0x6F,0x4C,0x39,0x50,0x6F,0x34,0x4D, - 0x42,0x67,0x34,0x33,0x4E,0x4C,0x79,0x53,0x7A,0x4E,0x57,0x48,0x53,0x7A,0x74, - 0x62,0x41,0x44,0x37,0x78,0x58,0x57,0x67,0x77,0x4D,0x50,0x67,0x6F,0x20,0x31, - 0x46,0x59,0x6E,0x73,0x58,0x53,0x71,0x76,0x78,0x76,0x30,0x77,0x31,0x69,0x45, - 0x2F,0x76,0x37,0x4C,0x5A,0x62,0x68,0x68,0x51,0x38,0x56,0x6D,0x65,0x47,0x4A, - 0x4E,0x44,0x62,0x6A,0x64,0x4F,0x64,0x62,0x53,0x46,0x4C,0x52,0x35,0x56,0x45, - 0x6E,0x6A,0x33,0x71,0x65,0x4F,0x44,0x7A,0x72,0x35,0x7A,0x36,0x57,0x4E,0x4A, - 0x51,0x44,0x74,0x2F,0x71,0x5A,0x76,0x6D,0x51,0x72,0x65,0x20,0x51,0x5A,0x48, - 0x57,0x4F,0x51,0x6E,0x56,0x50,0x33,0x34,0x4C,0x2B,0x73,0x5A,0x75,0x34,0x77, - 0x4A,0x66,0x59,0x62,0x65,0x7A,0x6C,0x62,0x68,0x4B,0x59,0x4E,0x76,0x36,0x70, - 0x32,0x46,0x74,0x57,0x62,0x57,0x54,0x6D,0x35,0x69,0x38,0x6A,0x4B,0x74,0x4A, - 0x74,0x2B,0x76,0x6F,0x6F,0x57,0x30,0x6E,0x52,0x68,0x77,0x37,0x4D,0x47,0x6A, - 0x4D,0x37,0x7A,0x61,0x58,0x30,0x46,0x47,0x64,0x20,0x39,0x70,0x55,0x79,0x33, - 0x6B,0x61,0x54,0x74,0x75,0x41,0x6E,0x55,0x77,0x6D,0x34,0x4D,0x64,0x51,0x42, - 0x39,0x38,0x5A,0x75,0x46,0x54,0x7A,0x34,0x57,0x70,0x49,0x45,0x50,0x6B,0x33, - 0x34,0x68,0x71,0x36,0x67,0x50,0x39,0x31,0x59,0x73,0x38,0x4F,0x49,0x71,0x36, - 0x7A,0x50,0x75,0x68,0x4F,0x70,0x39,0x33,0x52,0x66,0x72,0x6F,0x56,0x56,0x42, - 0x76,0x6A,0x34,0x31,0x70,0x76,0x72,0x20,0x33,0x63,0x6E,0x55,0x2B,0x79,0x6A, - 0x57,0x4C,0x71,0x74,0x67,0x73,0x65,0x51,0x30,0x42,0x76,0x38,0x79,0x52,0x42, - 0x4D,0x38,0x6C,0x2B,0x65,0x72,0x79,0x68,0x2B,0x44,0x37,0x59,0x2F,0x74,0x79, - 0x66,0x48,0x6F,0x61,0x44,0x51,0x66,0x32,0x48,0x6E,0x79,0x6C,0x48,0x56,0x4D, - 0x48,0x4F,0x71,0x73,0x4D,0x6F,0x41,0x6E,0x61,0x56,0x35,0x30,0x43,0x76,0x35, - 0x30,0x59,0x67,0x71,0x75,0x20,0x39,0x37,0x65,0x78,0x44,0x62,0x34,0x4F,0x5A, - 0x44,0x41,0x63,0x67,0x42,0x75,0x44,0x6C,0x79,0x47,0x6C,0x55,0x67,0x35,0x78, - 0x56,0x53,0x66,0x62,0x2F,0x45,0x30,0x43,0x67,0x49,0x4D,0x79,0x44,0x35,0x72, - 0x61,0x75,0x70,0x72,0x4F,0x34,0x5A,0x78,0x2B,0x36,0x45,0x48,0x44,0x2F,0x37, - 0x39,0x45,0x45,0x78,0x48,0x6F,0x48,0x47,0x6A,0x48,0x64,0x42,0x75,0x33,0x48, - 0x6D,0x4A,0x58,0x20,0x44,0x38,0x58,0x47,0x6F,0x57,0x76,0x34,0x43,0x72,0x36, - 0x44,0x4D,0x75,0x32,0x2B,0x4B,0x62,0x6A,0x51,0x37,0x6D,0x75,0x32,0x6A,0x63, - 0x2F,0x65,0x6B,0x62,0x61,0x46,0x52,0x51,0x62,0x34,0x70,0x4C,0x76,0x35,0x4B, - 0x52,0x7A,0x32,0x57,0x65,0x76,0x51,0x39,0x55,0x71,0x65,0x62,0x37,0x67,0x6A, - 0x50,0x64,0x64,0x61,0x6A,0x33,0x47,0x74,0x68,0x36,0x62,0x48,0x34,0x47,0x62, - 0x67,0x20,0x76,0x34,0x37,0x75,0x6D,0x51,0x62,0x4D,0x75,0x70,0x44,0x6C,0x65, - 0x4F,0x49,0x69,0x4E,0x72,0x49,0x41,0x77,0x47,0x58,0x43,0x37,0x2B,0x31,0x6A, - 0x56,0x4E,0x41,0x64,0x75,0x4D,0x59,0x36,0x37,0x64,0x74,0x39,0x2F,0x72,0x78, - 0x6C,0x4E,0x49,0x79,0x4C,0x55,0x6D,0x4E,0x4F,0x37,0x34,0x6E,0x55,0x62,0x71, - 0x2B,0x2F,0x2B,0x58,0x79,0x75,0x38,0x77,0x72,0x52,0x58,0x6E,0x41,0x41,0x20, - 0x63,0x71,0x58,0x2B,0x65,0x79,0x69,0x67,0x2F,0x6A,0x55,0x56,0x61,0x2B,0x6E, - 0x44,0x56,0x63,0x6C,0x51,0x31,0x4F,0x34,0x2F,0x50,0x68,0x6D,0x63,0x31,0x68, - 0x74,0x56,0x75,0x49,0x79,0x72,0x6F,0x41,0x43,0x38,0x43,0x2B,0x2B,0x36,0x63, - 0x64,0x58,0x73,0x75,0x46,0x57,0x4D,0x53,0x52,0x52,0x75,0x59,0x4C,0x7A,0x58, - 0x32,0x6C,0x78,0x55,0x64,0x62,0x31,0x47,0x6F,0x61,0x63,0x43,0x20,0x70,0x35, - 0x74,0x43,0x33,0x4B,0x58,0x45,0x4A,0x67,0x73,0x55,0x46,0x49,0x43,0x74,0x76, - 0x68,0x46,0x39,0x34,0x37,0x63,0x6D,0x4F,0x37,0x49,0x4B,0x65,0x6B,0x5A,0x76, - 0x73,0x48,0x6A,0x4F,0x7A,0x2F,0x5A,0x72,0x37,0x72,0x55,0x34,0x76,0x6E,0x6E, - 0x73,0x78,0x7A,0x55,0x4C,0x65,0x31,0x48,0x66,0x61,0x2F,0x56,0x64,0x65,0x4E, - 0x72,0x65,0x54,0x74,0x39,0x53,0x55,0x41,0x44,0x77,0x20,0x6F,0x66,0x6B,0x6E, - 0x31,0x69,0x45,0x50,0x68,0x2B,0x35,0x42,0x4A,0x44,0x35,0x6C,0x62,0x53,0x37, - 0x61,0x2B,0x6D,0x44,0x6F,0x4C,0x74,0x37,0x48,0x52,0x47,0x7A,0x2B,0x75,0x38, - 0x46,0x34,0x7A,0x64,0x5A,0x59,0x67,0x49,0x61,0x43,0x41,0x64,0x44,0x6D,0x61, - 0x7A,0x70,0x75,0x2F,0x66,0x58,0x72,0x78,0x36,0x66,0x2B,0x69,0x5A,0x34,0x43, - 0x79,0x4C,0x42,0x34,0x4A,0x76,0x57,0x59,0x20,0x50,0x6C,0x38,0x70,0x7A,0x4C, - 0x61,0x68,0x39,0x7A,0x52,0x30,0x64,0x50,0x35,0x75,0x53,0x33,0x59,0x72,0x66, - 0x61,0x31,0x67,0x41,0x42,0x67,0x47,0x76,0x47,0x67,0x64,0x37,0x73,0x68,0x6B, - 0x48,0x38,0x53,0x54,0x4D,0x57,0x74,0x7A,0x30,0x64,0x65,0x44,0x59,0x64,0x79, - 0x62,0x67,0x43,0x2B,0x76,0x72,0x43,0x58,0x70,0x39,0x76,0x7A,0x43,0x32,0x6B, - 0x5A,0x64,0x7A,0x2F,0x45,0x71,0x20,0x61,0x33,0x48,0x64,0x61,0x4F,0x31,0x73, - 0x72,0x6E,0x57,0x35,0x34,0x61,0x44,0x56,0x79,0x73,0x44,0x45,0x48,0x57,0x74, - 0x54,0x56,0x6E,0x33,0x6E,0x78,0x75,0x64,0x67,0x30,0x37,0x71,0x76,0x34,0x55, - 0x61,0x4E,0x44,0x54,0x41,0x53,0x75,0x67,0x6B,0x39,0x67,0x58,0x59,0x59,0x47, - 0x50,0x4E,0x6E,0x39,0x58,0x6E,0x55,0x79,0x75,0x71,0x79,0x4B,0x74,0x69,0x31, - 0x38,0x54,0x42,0x73,0x20,0x71,0x74,0x71,0x4E,0x64,0x2B,0x39,0x44,0x30,0x44, - 0x64,0x36,0x48,0x61,0x39,0x2F,0x46,0x59,0x47,0x30,0x70,0x2B,0x2B,0x35,0x32, - 0x74,0x41,0x33,0x68,0x49,0x4F,0x68,0x58,0x71,0x68,0x5A,0x5A,0x33,0x32,0x72, - 0x72,0x62,0x36,0x4E,0x31,0x2F,0x72,0x5A,0x58,0x4B,0x2B,0x33,0x6B,0x50,0x30, - 0x4C,0x38,0x69,0x37,0x41,0x32,0x39,0x56,0x30,0x46,0x6C,0x2B,0x64,0x6E,0x4D, - 0x73,0x63,0x20,0x53,0x43,0x67,0x61,0x68,0x45,0x35,0x63,0x53,0x6E,0x55,0x71, - 0x4B,0x7A,0x77,0x72,0x34,0x62,0x76,0x31,0x72,0x38,0x48,0x6A,0x46,0x54,0x74, - 0x73,0x68,0x2B,0x2F,0x65,0x76,0x77,0x4B,0x58,0x50,0x6E,0x31,0x6A,0x58,0x6F, - 0x48,0x61,0x58,0x39,0x4D,0x49,0x68,0x33,0x61,0x38,0x61,0x4C,0x74,0x32,0x4E, - 0x42,0x47,0x43,0x76,0x33,0x2F,0x32,0x61,0x2B,0x68,0x46,0x45,0x4F,0x5A,0x62, - 0x20,0x33,0x50,0x67,0x4B,0x65,0x65,0x2F,0x57,0x42,0x74,0x43,0x76,0x6B,0x6A, - 0x4F,0x4C,0x71,0x64,0x54,0x75,0x67,0x37,0x74,0x4F,0x4F,0x36,0x38,0x63,0x5A, - 0x58,0x5A,0x63,0x70,0x4F,0x38,0x46,0x6D,0x51,0x4C,0x77,0x62,0x64,0x39,0x68, - 0x36,0x33,0x67,0x43,0x6B,0x77,0x50,0x57,0x70,0x6E,0x54,0x39,0x59,0x63,0x48, - 0x58,0x48,0x62,0x5A,0x55,0x66,0x7A,0x30,0x4E,0x68,0x2B,0x37,0x33,0x20,0x4B, - 0x4F,0x57,0x35,0x48,0x54,0x39,0x79,0x44,0x4C,0x36,0x2B,0x56,0x6D,0x6C,0x4A, - 0x42,0x58,0x78,0x6E,0x37,0x36,0x75,0x67,0x4D,0x38,0x39,0x38,0x69,0x33,0x34, - 0x63,0x31,0x46,0x4F,0x42,0x74,0x62,0x67,0x4E,0x34,0x36,0x69,0x31,0x6A,0x62, - 0x4A,0x65,0x45,0x41,0x44,0x77,0x6A,0x78,0x5A,0x48,0x72,0x49,0x50,0x4D,0x74, - 0x62,0x48,0x44,0x2B,0x73,0x76,0x58,0x76,0x30,0x72,0x39,0x20,0x71,0x39,0x65, - 0x66,0x4D,0x30,0x56,0x6E,0x42,0x74,0x31,0x76,0x72,0x68,0x44,0x6F,0x77,0x4F, - 0x36,0x72,0x2B,0x66,0x37,0x4D,0x5A,0x64,0x4B,0x66,0x2B,0x74,0x72,0x44,0x6F, - 0x65,0x78,0x70,0x35,0x65,0x69,0x65,0x6C,0x78,0x63,0x45,0x67,0x6A,0x48,0x63, - 0x70,0x32,0x67,0x74,0x6D,0x41,0x6D,0x66,0x74,0x37,0x5A,0x52,0x31,0x73,0x6E, - 0x76,0x41,0x64,0x70,0x38,0x4C,0x66,0x67,0x33,0x20,0x4C,0x53,0x6A,0x4C,0x48, - 0x47,0x51,0x6B,0x50,0x6D,0x6E,0x62,0x71,0x61,0x75,0x50,0x36,0x39,0x53,0x63, - 0x6D,0x66,0x5A,0x31,0x59,0x50,0x37,0x73,0x66,0x53,0x57,0x64,0x37,0x71,0x32, - 0x5A,0x51,0x66,0x63,0x37,0x39,0x73,0x78,0x5A,0x75,0x48,0x67,0x35,0x76,0x36, - 0x65,0x72,0x36,0x6C,0x57,0x62,0x6F,0x4B,0x48,0x75,0x52,0x4B,0x59,0x62,0x38, - 0x4C,0x64,0x72,0x35,0x36,0x42,0x72,0x20,0x38,0x4B,0x4E,0x30,0x32,0x2B,0x34, - 0x74,0x4C,0x38,0x41,0x33,0x36,0x37,0x35,0x34,0x67,0x61,0x66,0x37,0x6A,0x6B, - 0x37,0x65,0x77,0x51,0x32,0x6E,0x66,0x56,0x6E,0x6E,0x7A,0x4B,0x55,0x79,0x67, - 0x54,0x75,0x55,0x37,0x63,0x58,0x34,0x68,0x72,0x32,0x4E,0x72,0x6F,0x55,0x2B, - 0x41,0x78,0x6A,0x4B,0x52,0x76,0x78,0x45,0x64,0x4E,0x51,0x32,0x59,0x6E,0x31, - 0x54,0x6C,0x6A,0x6B,0x76,0x20,0x36,0x31,0x2F,0x38,0x54,0x50,0x42,0x31,0x5A, - 0x33,0x31,0x7A,0x70,0x75,0x75,0x5A,0x76,0x31,0x59,0x39,0x48,0x58,0x79,0x35, - 0x30,0x6E,0x36,0x66,0x59,0x4C,0x73,0x34,0x4E,0x74,0x54,0x58,0x2F,0x69,0x43, - 0x64,0x34,0x6D,0x65,0x4F,0x5A,0x51,0x5A,0x66,0x74,0x33,0x31,0x32,0x39,0x78, - 0x2F,0x77,0x6E,0x38,0x36,0x6D,0x6D,0x63,0x50,0x70,0x76,0x6E,0x75,0x65,0x50, - 0x50,0x61,0x67,0x20,0x2F,0x69,0x68,0x66,0x39,0x48,0x5A,0x30,0x2F,0x57,0x6F, - 0x37,0x75,0x36,0x6A,0x4B,0x74,0x70,0x76,0x6E,0x36,0x37,0x4C,0x62,0x36,0x47, - 0x72,0x30,0x41,0x41,0x44,0x73,0x73,0x77,0x34,0x76,0x48,0x50,0x30,0x69,0x6E, - 0x56,0x75,0x50,0x7A,0x64,0x54,0x2F,0x65,0x75,0x56,0x58,0x74,0x68,0x73,0x39, - 0x44,0x63,0x47,0x6C,0x71,0x36,0x39,0x6E,0x54,0x51,0x65,0x54,0x30,0x66,0x73, - 0x7A,0x20,0x70,0x2B,0x54,0x39,0x32,0x54,0x33,0x30,0x77,0x59,0x4E,0x66,0x66, - 0x75,0x5A,0x4A,0x47,0x67,0x4A,0x39,0x62,0x4B,0x61,0x45,0x48,0x46,0x4C,0x34, - 0x7A,0x4C,0x46,0x38,0x50,0x35,0x31,0x32,0x4C,0x52,0x74,0x4A,0x34,0x35,0x6C, - 0x38,0x7A,0x31,0x2F,0x6F,0x66,0x75,0x52,0x54,0x67,0x41,0x46,0x71,0x47,0x38, - 0x35,0x37,0x57,0x53,0x57,0x4B,0x75,0x33,0x32,0x73,0x5A,0x52,0x4C,0x54,0x20, - 0x35,0x56,0x38,0x36,0x58,0x6F,0x56,0x74,0x6A,0x39,0x66,0x44,0x72,0x57,0x46, - 0x76,0x7A,0x73,0x63,0x39,0x33,0x65,0x39,0x50,0x62,0x62,0x2B,0x45,0x72,0x36, - 0x7A,0x66,0x44,0x34,0x48,0x4A,0x58,0x74,0x44,0x31,0x66,0x4D,0x6F,0x2F,0x72, - 0x37,0x66,0x41,0x52,0x47,0x51,0x6F,0x33,0x62,0x58,0x39,0x39,0x73,0x57,0x63, - 0x70,0x2B,0x68,0x2B,0x67,0x64,0x42,0x74,0x2F,0x45,0x4E,0x4A,0x20,0x47,0x48, - 0x77,0x44,0x48,0x2B,0x62,0x73,0x6C,0x2B,0x2B,0x42,0x69,0x43,0x30,0x44,0x34, - 0x4A,0x6D,0x47,0x71,0x32,0x41,0x5A,0x67,0x42,0x77,0x41,0x44,0x4C,0x37,0x31, - 0x59,0x64,0x68,0x78,0x6B,0x55,0x51,0x4C,0x71,0x68,0x2B,0x2F,0x38,0x6E,0x6B, - 0x45,0x30,0x2F,0x50,0x79,0x58,0x4F,0x64,0x6D,0x6E,0x54,0x30,0x2B,0x38,0x76, - 0x39,0x78,0x31,0x72,0x6A,0x70,0x66,0x67,0x38,0x44,0x20,0x5A,0x4E,0x59,0x4C, - 0x57,0x44,0x72,0x45,0x48,0x4A,0x61,0x46,0x63,0x54,0x2F,0x68,0x64,0x6B,0x73, - 0x33,0x73,0x69,0x72,0x70,0x46,0x4E,0x44,0x52,0x38,0x64,0x5A,0x4B,0x48,0x46, - 0x6C,0x46,0x35,0x75,0x68,0x4D,0x66,0x44,0x78,0x4B,0x6D,0x63,0x6E,0x4D,0x70, - 0x69,0x58,0x39,0x50,0x65,0x61,0x38,0x30,0x72,0x6D,0x35,0x55,0x49,0x4D,0x6D, - 0x42,0x53,0x43,0x32,0x31,0x72,0x54,0x39,0x20,0x72,0x53,0x5A,0x6C,0x70,0x67, - 0x6F,0x31,0x39,0x6F,0x4C,0x59,0x54,0x53,0x6B,0x37,0x37,0x4A,0x67,0x56,0x62, - 0x62,0x70,0x51,0x4F,0x55,0x63,0x4B,0x67,0x43,0x65,0x5A,0x4C,0x4C,0x63,0x4F, - 0x7A,0x48,0x51,0x51,0x78,0x4E,0x70,0x6E,0x4B,0x64,0x57,0x64,0x67,0x44,0x63, - 0x41,0x4C,0x4B,0x2F,0x45,0x36,0x55,0x5A,0x4D,0x43,0x6B,0x42,0x4B,0x32,0x55, - 0x6C,0x33,0x45,0x6F,0x52,0x75,0x20,0x2B,0x47,0x4B,0x4A,0x46,0x41,0x43,0x52, - 0x6D,0x35,0x38,0x43,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43, - 0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67, - 0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71, - 0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69, - 0x51,0x75,0x71,0x52,0x20,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67, + 0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x6E,0x69,0x6C,0x2C,0x20,0x75, + 0x72,0x6C,0x20,0x3D,0x20,0x63,0x2E,0x75,0x72,0x6C,0x20,0x7D,0x20,0x65,0x6E, + 0x64,0x20,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,0x20,0x63,0x2E,0x63,0x6F,0x6E,0x73, + 0x6F,0x6C,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20, + 0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x70,0x61,0x69,0x72, + 0x73,0x28,0x63,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x29,0x20,0x64,0x6F, + 0x20,0x69,0x66,0x20,0x76,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x71,0x75, + 0x69,0x72,0x65,0x28,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x22,0x20,0x2E,0x2E,0x20, + 0x6B,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x20,0x74,0x68,0x65,0x6E,0x20, + 0x6C,0x6F,0x76,0x65,0x2E,0x63,0x72,0x65,0x61,0x74,0x65,0x68,0x61,0x6E,0x64, + 0x6C,0x65,0x72,0x73,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x63, + 0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x6D, + 0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, + 0x20,0x74,0x68,0x65,0x6E,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67, + 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x68,0x65,0x63,0x6B,0x4D,0x6F, + 0x64,0x65,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64, + 0x74,0x68,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x68,0x65, + 0x69,0x67,0x68,0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E, + 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x29,0x20,0x6F,0x72,0x20, + 0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64,0x74,0x68, + 0x20,0x3D,0x3D,0x20,0x30,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x73,0x63,0x72, + 0x65,0x65,0x6E,0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x3D,0x20,0x30, + 0x29,0x20,0x74,0x68,0x65,0x6E,0x20,0x61,0x73,0x73,0x65,0x72,0x74,0x28,0x6C, + 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65, + 0x74,0x4D,0x6F,0x64,0x65,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E, + 0x77,0x69,0x64,0x74,0x68,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E, + 0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65, + 0x65,0x6E,0x2E,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x2C,0x20, + 0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x76,0x73,0x79,0x6E,0x63,0x2C, + 0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x66,0x73,0x61,0x61,0x29, + 0x2C,0x20,0x22,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65, + 0x74,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x22,0x29, + 0x20,0x65,0x6C,0x73,0x65,0x20,0x65,0x72,0x72,0x6F,0x72,0x28,0x22,0x43,0x6F, + 0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x73,0x63,0x72, + 0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x22,0x29,0x20,0x65,0x6E,0x64,0x20, + 0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73, + 0x65,0x74,0x43,0x61,0x70,0x74,0x69,0x6F,0x6E,0x28,0x63,0x2E,0x74,0x69,0x74, + 0x6C,0x65,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65, + 0x2E,0x66,0x69,0x6C,0x65,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x61,0x6E,0x64, + 0x20,0x63,0x2E,0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20,0x74,0x68,0x65, + 0x6E,0x20,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,0x29,0x20,0x65,0x6E,0x64, + 0x20,0x69,0x66,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,0x6D,0x61,0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29,0x20,0x74, + 0x68,0x65,0x6E,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x6D,0x61, + 0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66, + 0x20,0x6E,0x6F,0x5F,0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65,0x20,0x74, + 0x68,0x65,0x6E,0x20,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,0x20, + 0x65,0x6E,0x64,0x20,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,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x5F,0x6F,0x70,0x65,0x6E,0x43,0x6F,0x6E,0x73,0x6F,0x6C, + 0x65,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E, + 0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x75,0x6E,0x28, + 0x29,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, + 0x64,0x74,0x20,0x3D,0x20,0x30,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72, + 0x75,0x65,0x20,0x64,0x6F,0x20,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,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,0x20,0x65,0x6E,0x64,0x20,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,0x69,0x66,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68,0x65,0x6E, + 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E, + 0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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,0x20,0x65,0x6E,0x64, + 0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x20, + 0x74,0x68,0x65,0x6E,0x20,0x66,0x6F,0x72,0x20,0x65,0x2C,0x61,0x2C,0x62,0x2C, + 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,0x20,0x69,0x66,0x20,0x65, + 0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x20,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,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64, + 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x68,0x61,0x6E,0x64,0x6C, + 0x65,0x72,0x73,0x5B,0x65,0x5D,0x28,0x61,0x2C,0x62,0x2C,0x63,0x29,0x20,0x65, + 0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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,0x31,0x29, + 0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, + 0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73, + 0x65,0x6E,0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x65, + 0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x6E,0x6F,0x67,0x61,0x6D,0x65,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34, + 0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x43,0x37,0x6D,0x6C,0x44,0x51,0x31, + 0x42,0x4A,0x51,0x30,0x4D,0x67,0x55,0x48,0x4A,0x76,0x5A,0x6D,0x6C,0x73,0x5A, + 0x51,0x41,0x41,0x20,0x65,0x41,0x47,0x46,0x56,0x4D,0x39,0x72,0x45,0x30,0x45, + 0x55,0x2F,0x6A,0x5A,0x75,0x71,0x64,0x41,0x69,0x43,0x46,0x70,0x72,0x44,0x72, + 0x4A,0x34,0x6B,0x43,0x4A,0x4A,0x57,0x61,0x74,0x6F,0x52,0x64,0x51,0x32,0x2F, + 0x52,0x46,0x69,0x61,0x77,0x7A,0x62,0x48,0x37,0x5A,0x46,0x6B,0x47,0x51,0x7A, + 0x53,0x64,0x5A,0x75,0x4E,0x75,0x76,0x75,0x4A,0x72,0x57,0x6C,0x69,0x4F,0x54, + 0x69,0x20,0x30,0x53,0x72,0x65,0x52,0x65,0x32,0x68,0x42,0x2F,0x2B,0x41,0x48, + 0x6E,0x72,0x77,0x5A,0x43,0x39,0x4B,0x68,0x56,0x70,0x46,0x4B,0x4E,0x36,0x72, + 0x4B,0x47,0x4B,0x68,0x46,0x79,0x33,0x78,0x7A,0x57,0x35,0x4D,0x74,0x71,0x58, + 0x71,0x77,0x4D,0x35,0x2B,0x38,0x39,0x34,0x33,0x37,0x33,0x31,0x76,0x64,0x74, + 0x38,0x41,0x44,0x58,0x4C,0x53,0x4E,0x50,0x57,0x41,0x42,0x4F,0x51,0x4E,0x20, + 0x78,0x31,0x4B,0x69,0x45,0x57,0x6C,0x73,0x66,0x45,0x4A,0x71,0x2F,0x49,0x67, + 0x41,0x6A,0x71,0x49,0x4A,0x51,0x54,0x51,0x6C,0x56,0x64,0x76,0x73,0x54,0x69, + 0x51,0x47,0x51,0x59,0x4E,0x7A,0x2B,0x58,0x76,0x6E,0x32,0x48,0x6F,0x50,0x67, + 0x56,0x74,0x57,0x77,0x33,0x76,0x37,0x64,0x37,0x4A,0x33,0x72,0x5A,0x72,0x53, + 0x74,0x70,0x6F,0x48,0x68,0x50,0x31,0x41,0x34,0x45,0x65,0x61,0x20,0x32,0x53, + 0x71,0x77,0x37,0x78,0x64,0x78,0x43,0x6C,0x6B,0x53,0x41,0x6F,0x67,0x38,0x33, + 0x36,0x45,0x70,0x78,0x33,0x51,0x49,0x33,0x2B,0x50,0x59,0x38,0x75,0x79,0x50, + 0x4F,0x55,0x35,0x35,0x65,0x4D,0x47,0x31,0x44,0x79,0x73,0x39,0x78,0x46,0x6B, + 0x69,0x66,0x45,0x41,0x31,0x4C,0x63,0x35,0x2F,0x54,0x62,0x68,0x54,0x7A,0x53, + 0x58,0x54,0x51,0x49,0x4E,0x49,0x4F,0x4A,0x54,0x31,0x20,0x63,0x56,0x49,0x2B, + 0x6E,0x4E,0x65,0x4C,0x6C,0x4E,0x63,0x64,0x42,0x32,0x6C,0x75,0x5A,0x73,0x62, + 0x49,0x45,0x4C,0x31,0x50,0x6B,0x4B,0x61,0x37,0x7A,0x4F,0x36,0x72,0x59,0x71, + 0x47,0x63,0x54,0x76,0x59,0x4F,0x6B,0x4C,0x32,0x64,0x39,0x48,0x35,0x4F,0x73, + 0x39,0x34,0x2B,0x77,0x69,0x48,0x43,0x43,0x78,0x6D,0x74,0x50,0x30,0x61,0x34, + 0x6A,0x5A,0x37,0x31,0x6A,0x4E,0x55,0x2F,0x20,0x34,0x6D,0x48,0x68,0x70,0x4F, + 0x62,0x45,0x68,0x6A,0x30,0x63,0x47,0x44,0x58,0x30,0x2B,0x47,0x41,0x56,0x74, + 0x78,0x71,0x70,0x2B,0x44,0x58,0x43,0x46,0x46,0x38,0x51,0x54,0x53,0x65,0x69, + 0x56,0x48,0x48,0x5A,0x4C,0x67,0x33,0x78,0x6D,0x4B,0x37,0x39,0x56,0x76,0x4A, + 0x4B,0x67,0x6E,0x43,0x51,0x4F,0x4D,0x70,0x6B,0x59,0x59,0x42,0x7A,0x57,0x6B, + 0x68,0x50,0x31,0x30,0x78,0x75,0x20,0x2B,0x4C,0x71,0x48,0x42,0x58,0x30,0x6D, + 0x31,0x78,0x4F,0x76,0x34,0x6E,0x64,0x57,0x55,0x65,0x46,0x35,0x6A,0x78,0x4E, + 0x6E,0x33,0x74,0x54,0x64,0x37,0x30,0x58,0x61,0x41,0x71,0x38,0x77,0x44,0x68, + 0x30,0x4D,0x47,0x67,0x79,0x61,0x44,0x55,0x68,0x51,0x45,0x45,0x55,0x45,0x59, + 0x5A,0x69,0x77,0x55,0x45,0x43,0x47,0x50,0x42,0x6F,0x78,0x4E,0x4C,0x4A,0x79, + 0x50,0x79,0x4F,0x72,0x20,0x42,0x68,0x75,0x54,0x65,0x7A,0x4A,0x31,0x4A,0x47, + 0x71,0x37,0x64,0x47,0x4A,0x45,0x73,0x55,0x46,0x37,0x4E,0x74,0x77,0x39,0x74, + 0x31,0x47,0x6B,0x33,0x54,0x7A,0x2B,0x4B,0x43,0x4A,0x78,0x6C,0x45,0x4F,0x31, + 0x43,0x4A,0x4C,0x38,0x51,0x66,0x34,0x71,0x72,0x38,0x6C,0x50,0x35,0x58,0x6E, + 0x35,0x79,0x31,0x79,0x77,0x32,0x46,0x62,0x33,0x6C,0x4B,0x32,0x62,0x6D,0x72, + 0x72,0x79,0x20,0x34,0x44,0x76,0x46,0x35,0x5A,0x6D,0x35,0x47,0x68,0x37,0x58, + 0x30,0x38,0x6A,0x6A,0x63,0x30,0x31,0x65,0x66,0x4A,0x58,0x55,0x64,0x70,0x4E, + 0x58,0x52,0x35,0x61,0x73,0x65,0x58,0x71,0x38,0x6D,0x75,0x77,0x61,0x50,0x2B, + 0x78,0x58,0x6C,0x7A,0x48,0x6D,0x67,0x6A,0x57,0x50,0x78,0x48,0x4F,0x77,0x2B, + 0x2F,0x45,0x74,0x58,0x35,0x58,0x4D,0x6C,0x79,0x6D,0x4D,0x46,0x4D,0x58,0x6A, + 0x20,0x56,0x66,0x50,0x71,0x53,0x34,0x52,0x31,0x57,0x6A,0x45,0x33,0x33,0x35, + 0x39,0x73,0x66,0x7A,0x73,0x39,0x34,0x69,0x37,0x50,0x4C,0x72,0x58,0x57,0x63, + 0x36,0x32,0x4A,0x69,0x7A,0x64,0x57,0x6D,0x35,0x64,0x6E,0x2F,0x57,0x70,0x49, + 0x2B,0x2B,0x36,0x71,0x76,0x4A,0x50,0x6D,0x56,0x66,0x6C,0x50,0x58,0x76,0x58, + 0x78,0x2F,0x47,0x66,0x4E,0x78,0x47,0x50,0x69,0x4B,0x54,0x45,0x6D,0x20,0x64, + 0x6F,0x72,0x6E,0x49,0x59,0x6D,0x58,0x78,0x53,0x37,0x78,0x6B,0x74,0x68,0x4C, + 0x71,0x77,0x76,0x69,0x59,0x47,0x33,0x48,0x43,0x4A,0x32,0x56,0x68,0x69,0x6E, + 0x53,0x62,0x5A,0x48,0x36,0x4A,0x4E,0x56,0x67,0x59,0x4A,0x71,0x38,0x39,0x53, + 0x39,0x64,0x50,0x31,0x74,0x34,0x76,0x55,0x5A,0x2F,0x44,0x50,0x56,0x52,0x6C, + 0x42,0x6E,0x4D,0x30,0x6C,0x53,0x4A,0x39,0x33,0x2F,0x43,0x20,0x4B,0x6D,0x51, + 0x30,0x6E,0x62,0x6B,0x4F,0x62,0x2F,0x71,0x50,0x32,0x38,0x66,0x38,0x46,0x2B, + 0x54,0x33,0x69,0x75,0x65,0x66,0x4B,0x41,0x49,0x76,0x62,0x4F,0x44,0x49,0x6D, + 0x62,0x70,0x74,0x55,0x33,0x48,0x76,0x45,0x4B,0x46,0x6C,0x70,0x57,0x35,0x7A, + 0x72,0x67,0x49,0x58,0x76,0x39,0x46,0x39,0x38,0x4C,0x5A,0x75,0x61,0x36,0x4E, + 0x2B,0x4F,0x50,0x77,0x45,0x57,0x44,0x79,0x72,0x20,0x46,0x71,0x31,0x53,0x4E, + 0x5A,0x38,0x67,0x76,0x41,0x45,0x63,0x64,0x6F,0x64,0x36,0x48,0x75,0x67,0x70, + 0x6D,0x4E,0x4F,0x57,0x6C,0x73,0x30,0x35,0x55,0x6F,0x63,0x73,0x6E,0x35,0x4F, + 0x36,0x36,0x63,0x70,0x69,0x55,0x73,0x78,0x51,0x32,0x30,0x4E,0x53,0x55,0x74, + 0x63,0x6C,0x31,0x32,0x56,0x4C,0x46,0x72,0x4F,0x5A,0x56,0x57,0x4C,0x70,0x64, + 0x74,0x69,0x5A,0x30,0x78,0x31,0x75,0x20,0x48,0x4B,0x45,0x35,0x51,0x76,0x66, + 0x45,0x70,0x30,0x70,0x6C,0x6B,0x2F,0x71,0x76,0x38,0x52,0x47,0x77,0x2F,0x62, + 0x42,0x53,0x2B,0x66,0x6D,0x73,0x55,0x74,0x6C,0x2B,0x54,0x68,0x72,0x57,0x67, + 0x5A,0x66,0x36,0x62,0x38,0x43,0x38,0x2F,0x55,0x58,0x41,0x65,0x49,0x75,0x4A, + 0x41,0x41,0x41,0x41,0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73, + 0x54,0x41,0x41,0x41,0x4C,0x20,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x41, + 0x41,0x41,0x4B,0x45,0x45,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x62, + 0x61,0x32,0x77,0x55,0x31,0x78,0x58,0x48,0x7A,0x2B,0x79,0x75,0x71,0x59,0x33, + 0x42,0x59,0x4F,0x4D,0x51,0x61,0x48,0x69,0x6B,0x78,0x6A,0x7A,0x69,0x4E,0x70, + 0x41,0x55,0x4D,0x49,0x4B,0x6B,0x77,0x71,0x56,0x53,0x68,0x49,0x54,0x55,0x79, + 0x6C,0x58,0x56,0x20,0x56,0x71,0x6F,0x71,0x52,0x61,0x71,0x45,0x43,0x46,0x43, + 0x70,0x4C,0x53,0x4A,0x53,0x50,0x79,0x56,0x52,0x50,0x30,0x51,0x69,0x55,0x6C, + 0x73,0x56,0x62,0x45,0x64,0x52,0x50,0x31,0x53,0x4B,0x2B,0x69,0x47,0x4B,0x57, + 0x74,0x52,0x55,0x53,0x47,0x33,0x56,0x68,0x78,0x49,0x6C,0x63,0x62,0x7A,0x47, + 0x45,0x46,0x4A,0x6B,0x31,0x6D,0x76,0x41,0x42,0x76,0x78,0x65,0x76,0x4C,0x62, + 0x58,0x20,0x33,0x76,0x55,0x2B,0x35,0x2F,0x62,0x63,0x54,0x55,0x31,0x32,0x5A, + 0x32,0x62,0x78,0x47,0x74,0x74,0x6E,0x7A,0x39,0x72,0x6E,0x66,0x74,0x6D,0x39, + 0x64,0x2B,0x37,0x4D,0x4F,0x66,0x64,0x2F,0x66,0x6E,0x76,0x75,0x7A,0x4A,0x32, + 0x37,0x68,0x6C,0x49,0x4B,0x70,0x43,0x78,0x66,0x42,0x56,0x7A,0x4C,0x64,0x2B, + 0x67,0x79,0x63,0x71,0x32,0x41,0x41,0x4C,0x44,0x4D,0x4F,0x52,0x41,0x41,0x20, + 0x42,0x49,0x42,0x6C,0x72,0x73,0x41,0x79,0x48,0x37,0x35,0x6B,0x41,0x41,0x46, + 0x67,0x6D,0x53,0x75,0x77,0x7A,0x49,0x63,0x76,0x47,0x55,0x41,0x41,0x57,0x4F, + 0x59,0x4B,0x4C,0x50,0x50,0x68,0x65,0x35,0x62,0x79,0x2B,0x4E,0x73,0x37,0x6D, + 0x7A,0x65,0x59,0x62,0x6E,0x67,0x65,0x46,0x4F,0x77,0x46,0x51,0x32,0x30,0x48, + 0x4D,0x4A,0x37,0x45,0x38,0x64,0x59,0x41,0x71,0x45,0x72,0x38,0x20,0x7A,0x43, + 0x77,0x39,0x65,0x43,0x79,0x49,0x37,0x64,0x63,0x4D,0x4D,0x47,0x34,0x72,0x55, + 0x33,0x6E,0x4E,0x31,0x66,0x45,0x50,0x44,0x32,0x37,0x36,0x2B,0x58,0x52,0x6D, + 0x70,0x36,0x58,0x34,0x33,0x56,0x68,0x4B,0x4B,0x34,0x47,0x74,0x66,0x62,0x38, + 0x70,0x63,0x30,0x2B,0x56,0x4E,0x49,0x4C,0x68,0x4F,0x71,0x49,0x4D,0x4F,0x41, + 0x78,0x4B,0x31,0x63,0x34,0x76,0x61,0x45,0x59,0x48,0x20,0x43,0x76,0x51,0x2B, + 0x77,0x6E,0x4F,0x70,0x66,0x75,0x66,0x70,0x66,0x38,0x2F,0x76,0x57,0x6A,0x7A, + 0x50,0x58,0x68,0x49,0x41,0x65,0x50,0x31,0x4E,0x6A,0x57,0x44,0x43,0x6A,0x7A, + 0x48,0x6F,0x6A,0x59,0x73,0x6C,0x4D,0x32,0x61,0x47,0x43,0x57,0x57,0x6F,0x64, + 0x38,0x42,0x30,0x76,0x58,0x56,0x67,0x31,0x30,0x73,0x64,0x69,0x32,0x57,0x48, + 0x2B,0x72,0x70,0x46,0x44,0x59,0x43,0x33,0x20,0x75,0x2B,0x57,0x59,0x53,0x70, + 0x6E,0x6E,0x77,0x49,0x41,0x36,0x59,0x75,0x48,0x65,0x4D,0x31,0x50,0x47,0x6D, + 0x59,0x4E,0x31,0x4A,0x32,0x38,0x53,0x32,0x31,0x31,0x77,0x63,0x30,0x55,0x4A, + 0x51,0x4B,0x76,0x2F,0x66,0x4C,0x31,0x62,0x75,0x56,0x37,0x48,0x31,0x31,0x68, + 0x48,0x46,0x6C,0x79,0x52,0x75,0x56,0x33,0x77,0x37,0x52,0x56,0x75,0x38,0x38, + 0x79,0x7A,0x74,0x54,0x38,0x4E,0x20,0x7A,0x4F,0x30,0x30,0x50,0x72,0x32,0x4C, + 0x43,0x6F,0x42,0x57,0x2F,0x35,0x74,0x50,0x75,0x4D,0x33,0x55,0x2B,0x58,0x78, + 0x54,0x66,0x53,0x49,0x56,0x68,0x39,0x42,0x30,0x45,0x4D,0x4C,0x78,0x45,0x45, + 0x53,0x54,0x59,0x59,0x67,0x6C,0x6F,0x68,0x42,0x4C,0x52,0x69,0x46,0x70,0x4A, + 0x72,0x49,0x69,0x38,0x43,0x56,0x50,0x47,0x58,0x68,0x63,0x48,0x6C,0x69,0x35, + 0x59,0x6A,0x57,0x55,0x20,0x65,0x6B,0x71,0x68,0x76,0x48,0x51,0x74,0x72,0x43, + 0x6D,0x74,0x41,0x73,0x50,0x49,0x37,0x79,0x6E,0x5A,0x41,0x47,0x68,0x4A,0x6C, + 0x63,0x66,0x50,0x46,0x4F,0x4E,0x4E,0x59,0x39,0x45,0x41,0x34,0x4F,0x31,0x71, + 0x4F,0x61,0x48,0x41,0x62,0x4D,0x6D,0x4B,0x6E,0x45,0x4E,0x6C,0x4F,0x68,0x47, + 0x47,0x2B,0x31,0x4D,0x44,0x45,0x49,0x79,0x4D,0x77,0x48,0x51,0x38,0x37,0x4E, + 0x41,0x6A,0x20,0x76,0x79,0x59,0x64,0x2F,0x41,0x6F,0x45,0x6F,0x57,0x72,0x6C, + 0x65,0x6C,0x68,0x58,0x76,0x68,0x45,0x38,0x37,0x70,0x4A,0x5A,0x54,0x6A,0x53, + 0x36,0x58,0x59,0x5A,0x36,0x61,0x66,0x2B,0x4F,0x55,0x2F,0x2B,0x61,0x70,0x53, + 0x4F,0x72,0x77,0x2B,0x77,0x42,0x2B,0x4C,0x54,0x33,0x74,0x32,0x74,0x6A,0x30, + 0x5A,0x49,0x57,0x6E,0x4F,0x64,0x2F,0x2B,0x44,0x44,0x6C,0x67,0x70,0x46,0x68, + 0x20,0x36,0x42,0x2F,0x76,0x67,0x58,0x41,0x73,0x39,0x4C,0x42,0x75,0x6A,0x33, + 0x51,0x4D,0x62,0x77,0x43,0x68,0x73,0x72,0x77,0x61,0x4E,0x6C,0x64,0x75,0x68, + 0x37,0x4B,0x53,0x56,0x62,0x4E,0x64,0x34,0x34,0x30,0x44,0x4F,0x30,0x2B,0x39, + 0x50,0x46,0x73,0x6E,0x4C,0x73,0x64,0x5A,0x41,0x2B,0x44,0x74,0x75,0x72,0x41, + 0x50,0x38,0x2F,0x41,0x66,0x63,0x4D,0x2F,0x4B,0x56,0x33,0x4D,0x4A,0x20,0x4E, + 0x68,0x55,0x64,0x68,0x7A,0x76,0x42,0x4C,0x70,0x69,0x4D,0x54,0x65,0x54,0x71, + 0x73,0x6D,0x44,0x74,0x47,0x6F,0x54,0x71,0x56,0x52,0x73,0x52,0x68,0x46,0x70, + 0x59,0x67,0x56,0x4E,0x46,0x72,0x6F,0x4C,0x39,0x50,0x6F,0x34,0x4D,0x42,0x67, + 0x34,0x33,0x4E,0x4C,0x79,0x53,0x7A,0x4E,0x57,0x48,0x53,0x7A,0x74,0x62,0x41, + 0x44,0x37,0x78,0x58,0x57,0x67,0x77,0x4D,0x50,0x67,0x6F,0x20,0x31,0x46,0x59, + 0x6E,0x73,0x58,0x53,0x71,0x76,0x78,0x76,0x30,0x77,0x31,0x69,0x45,0x2F,0x76, + 0x37,0x4C,0x5A,0x62,0x68,0x68,0x51,0x38,0x56,0x6D,0x65,0x47,0x4A,0x4E,0x44, + 0x62,0x6A,0x64,0x4F,0x64,0x62,0x53,0x46,0x4C,0x52,0x35,0x56,0x45,0x6E,0x6A, + 0x33,0x71,0x65,0x4F,0x44,0x7A,0x72,0x35,0x7A,0x36,0x57,0x4E,0x4A,0x51,0x44, + 0x74,0x2F,0x71,0x5A,0x76,0x6D,0x51,0x72,0x65,0x20,0x51,0x5A,0x48,0x57,0x4F, + 0x51,0x6E,0x56,0x50,0x33,0x34,0x4C,0x2B,0x73,0x5A,0x75,0x34,0x77,0x4A,0x66, + 0x59,0x62,0x65,0x7A,0x6C,0x62,0x68,0x4B,0x59,0x4E,0x76,0x36,0x70,0x32,0x46, + 0x74,0x57,0x62,0x57,0x54,0x6D,0x35,0x69,0x38,0x6A,0x4B,0x74,0x4A,0x74,0x2B, + 0x76,0x6F,0x6F,0x57,0x30,0x6E,0x52,0x68,0x77,0x37,0x4D,0x47,0x6A,0x4D,0x37, + 0x7A,0x61,0x58,0x30,0x46,0x47,0x64,0x20,0x39,0x70,0x55,0x79,0x33,0x6B,0x61, + 0x54,0x74,0x75,0x41,0x6E,0x55,0x77,0x6D,0x34,0x4D,0x64,0x51,0x42,0x39,0x38, + 0x5A,0x75,0x46,0x54,0x7A,0x34,0x57,0x70,0x49,0x45,0x50,0x6B,0x33,0x34,0x68, + 0x71,0x36,0x67,0x50,0x39,0x31,0x59,0x73,0x38,0x4F,0x49,0x71,0x36,0x7A,0x50, + 0x75,0x68,0x4F,0x70,0x39,0x33,0x52,0x66,0x72,0x6F,0x56,0x56,0x42,0x76,0x6A, + 0x34,0x31,0x70,0x76,0x72,0x20,0x33,0x63,0x6E,0x55,0x2B,0x79,0x6A,0x57,0x4C, + 0x71,0x74,0x67,0x73,0x65,0x51,0x30,0x42,0x76,0x38,0x79,0x52,0x42,0x4D,0x38, + 0x6C,0x2B,0x65,0x72,0x79,0x68,0x2B,0x44,0x37,0x59,0x2F,0x74,0x79,0x66,0x48, + 0x6F,0x61,0x44,0x51,0x66,0x32,0x48,0x6E,0x79,0x6C,0x48,0x56,0x4D,0x48,0x4F, + 0x71,0x73,0x4D,0x6F,0x41,0x6E,0x61,0x56,0x35,0x30,0x43,0x76,0x35,0x30,0x59, + 0x67,0x71,0x75,0x20,0x39,0x37,0x65,0x78,0x44,0x62,0x34,0x4F,0x5A,0x44,0x41, + 0x63,0x67,0x42,0x75,0x44,0x6C,0x79,0x47,0x6C,0x55,0x67,0x35,0x78,0x56,0x53, + 0x66,0x62,0x2F,0x45,0x30,0x43,0x67,0x49,0x4D,0x79,0x44,0x35,0x72,0x61,0x75, + 0x70,0x72,0x4F,0x34,0x5A,0x78,0x2B,0x36,0x45,0x48,0x44,0x2F,0x37,0x39,0x45, + 0x45,0x78,0x48,0x6F,0x48,0x47,0x6A,0x48,0x64,0x42,0x75,0x33,0x48,0x6D,0x4A, + 0x58,0x20,0x44,0x38,0x58,0x47,0x6F,0x57,0x76,0x34,0x43,0x72,0x36,0x44,0x4D, + 0x75,0x32,0x2B,0x4B,0x62,0x6A,0x51,0x37,0x6D,0x75,0x32,0x6A,0x63,0x2F,0x65, + 0x6B,0x62,0x61,0x46,0x52,0x51,0x62,0x34,0x70,0x4C,0x76,0x35,0x4B,0x52,0x7A, + 0x32,0x57,0x65,0x76,0x51,0x39,0x55,0x71,0x65,0x62,0x37,0x67,0x6A,0x50,0x64, + 0x64,0x61,0x6A,0x33,0x47,0x74,0x68,0x36,0x62,0x48,0x34,0x47,0x62,0x67,0x20, + 0x76,0x34,0x37,0x75,0x6D,0x51,0x62,0x4D,0x75,0x70,0x44,0x6C,0x65,0x4F,0x49, + 0x69,0x4E,0x72,0x49,0x41,0x77,0x47,0x58,0x43,0x37,0x2B,0x31,0x6A,0x56,0x4E, + 0x41,0x64,0x75,0x4D,0x59,0x36,0x37,0x64,0x74,0x39,0x2F,0x72,0x78,0x6C,0x4E, + 0x49,0x79,0x4C,0x55,0x6D,0x4E,0x4F,0x37,0x34,0x6E,0x55,0x62,0x71,0x2B,0x2F, + 0x2B,0x58,0x79,0x75,0x38,0x77,0x72,0x52,0x58,0x6E,0x41,0x41,0x20,0x63,0x71, + 0x58,0x2B,0x65,0x79,0x69,0x67,0x2F,0x6A,0x55,0x56,0x61,0x2B,0x6E,0x44,0x56, + 0x63,0x6C,0x51,0x31,0x4F,0x34,0x2F,0x50,0x68,0x6D,0x63,0x31,0x68,0x74,0x56, + 0x75,0x49,0x79,0x72,0x6F,0x41,0x43,0x38,0x43,0x2B,0x2B,0x36,0x63,0x64,0x58, + 0x73,0x75,0x46,0x57,0x4D,0x53,0x52,0x52,0x75,0x59,0x4C,0x7A,0x58,0x32,0x6C, + 0x78,0x55,0x64,0x62,0x31,0x47,0x6F,0x61,0x63,0x43,0x20,0x70,0x35,0x74,0x43, + 0x33,0x4B,0x58,0x45,0x4A,0x67,0x73,0x55,0x46,0x49,0x43,0x74,0x76,0x68,0x46, + 0x39,0x34,0x37,0x63,0x6D,0x4F,0x37,0x49,0x4B,0x65,0x6B,0x5A,0x76,0x73,0x48, + 0x6A,0x4F,0x7A,0x2F,0x5A,0x72,0x37,0x72,0x55,0x34,0x76,0x6E,0x6E,0x73,0x78, + 0x7A,0x55,0x4C,0x65,0x31,0x48,0x66,0x61,0x2F,0x56,0x64,0x65,0x4E,0x72,0x65, + 0x54,0x74,0x39,0x53,0x55,0x41,0x44,0x77,0x20,0x6F,0x66,0x6B,0x6E,0x31,0x69, + 0x45,0x50,0x68,0x2B,0x35,0x42,0x4A,0x44,0x35,0x6C,0x62,0x53,0x37,0x61,0x2B, + 0x6D,0x44,0x6F,0x4C,0x74,0x37,0x48,0x52,0x47,0x7A,0x2B,0x75,0x38,0x46,0x34, + 0x7A,0x64,0x5A,0x59,0x67,0x49,0x61,0x43,0x41,0x64,0x44,0x6D,0x61,0x7A,0x70, + 0x75,0x2F,0x66,0x58,0x72,0x78,0x36,0x66,0x2B,0x69,0x5A,0x34,0x43,0x79,0x4C, + 0x42,0x34,0x4A,0x76,0x57,0x59,0x20,0x50,0x6C,0x38,0x70,0x7A,0x4C,0x61,0x68, + 0x39,0x7A,0x52,0x30,0x64,0x50,0x35,0x75,0x53,0x33,0x59,0x72,0x66,0x61,0x31, + 0x67,0x41,0x42,0x67,0x47,0x76,0x47,0x67,0x64,0x37,0x73,0x68,0x6B,0x48,0x38, + 0x53,0x54,0x4D,0x57,0x74,0x7A,0x30,0x64,0x65,0x44,0x59,0x64,0x79,0x62,0x67, + 0x43,0x2B,0x76,0x72,0x43,0x58,0x70,0x39,0x76,0x7A,0x43,0x32,0x6B,0x5A,0x64, + 0x7A,0x2F,0x45,0x71,0x20,0x61,0x33,0x48,0x64,0x61,0x4F,0x31,0x73,0x72,0x6E, + 0x57,0x35,0x34,0x61,0x44,0x56,0x79,0x73,0x44,0x45,0x48,0x57,0x74,0x54,0x56, + 0x6E,0x33,0x6E,0x78,0x75,0x64,0x67,0x30,0x37,0x71,0x76,0x34,0x55,0x61,0x4E, + 0x44,0x54,0x41,0x53,0x75,0x67,0x6B,0x39,0x67,0x58,0x59,0x59,0x47,0x50,0x4E, + 0x6E,0x39,0x58,0x6E,0x55,0x79,0x75,0x71,0x79,0x4B,0x74,0x69,0x31,0x38,0x54, + 0x42,0x73,0x20,0x71,0x74,0x71,0x4E,0x64,0x2B,0x39,0x44,0x30,0x44,0x64,0x36, + 0x48,0x61,0x39,0x2F,0x46,0x59,0x47,0x30,0x70,0x2B,0x2B,0x35,0x32,0x74,0x41, + 0x33,0x68,0x49,0x4F,0x68,0x58,0x71,0x68,0x5A,0x5A,0x33,0x32,0x72,0x72,0x62, + 0x36,0x4E,0x31,0x2F,0x72,0x5A,0x58,0x4B,0x2B,0x33,0x6B,0x50,0x30,0x4C,0x38, + 0x69,0x37,0x41,0x32,0x39,0x56,0x30,0x46,0x6C,0x2B,0x64,0x6E,0x4D,0x73,0x63, + 0x20,0x53,0x43,0x67,0x61,0x68,0x45,0x35,0x63,0x53,0x6E,0x55,0x71,0x4B,0x7A, + 0x77,0x72,0x34,0x62,0x76,0x31,0x72,0x38,0x48,0x6A,0x46,0x54,0x74,0x73,0x68, + 0x2B,0x2F,0x65,0x76,0x77,0x4B,0x58,0x50,0x6E,0x31,0x6A,0x58,0x6F,0x48,0x61, + 0x58,0x39,0x4D,0x49,0x68,0x33,0x61,0x38,0x61,0x4C,0x74,0x32,0x4E,0x42,0x47, + 0x43,0x76,0x33,0x2F,0x32,0x61,0x2B,0x68,0x46,0x45,0x4F,0x5A,0x62,0x20,0x33, + 0x50,0x67,0x4B,0x65,0x65,0x2F,0x57,0x42,0x74,0x43,0x76,0x6B,0x6A,0x4F,0x4C, + 0x71,0x64,0x54,0x75,0x67,0x37,0x74,0x4F,0x4F,0x36,0x38,0x63,0x5A,0x58,0x5A, + 0x63,0x70,0x4F,0x38,0x46,0x6D,0x51,0x4C,0x77,0x62,0x64,0x39,0x68,0x36,0x33, + 0x67,0x43,0x6B,0x77,0x50,0x57,0x70,0x6E,0x54,0x39,0x59,0x63,0x48,0x58,0x48, + 0x62,0x5A,0x55,0x66,0x7A,0x30,0x4E,0x68,0x2B,0x37,0x33,0x20,0x4B,0x4F,0x57, + 0x35,0x48,0x54,0x39,0x79,0x44,0x4C,0x36,0x2B,0x56,0x6D,0x6C,0x4A,0x42,0x58, + 0x78,0x6E,0x37,0x36,0x75,0x67,0x4D,0x38,0x39,0x38,0x69,0x33,0x34,0x63,0x31, + 0x46,0x4F,0x42,0x74,0x62,0x67,0x4E,0x34,0x36,0x69,0x31,0x6A,0x62,0x4A,0x65, + 0x45,0x41,0x44,0x77,0x6A,0x78,0x5A,0x48,0x72,0x49,0x50,0x4D,0x74,0x62,0x48, + 0x44,0x2B,0x73,0x76,0x58,0x76,0x30,0x72,0x39,0x20,0x71,0x39,0x65,0x66,0x4D, + 0x30,0x56,0x6E,0x42,0x74,0x31,0x76,0x72,0x68,0x44,0x6F,0x77,0x4F,0x36,0x72, + 0x2B,0x66,0x37,0x4D,0x5A,0x64,0x4B,0x66,0x2B,0x74,0x72,0x44,0x6F,0x65,0x78, + 0x70,0x35,0x65,0x69,0x65,0x6C,0x78,0x63,0x45,0x67,0x6A,0x48,0x63,0x70,0x32, + 0x67,0x74,0x6D,0x41,0x6D,0x66,0x74,0x37,0x5A,0x52,0x31,0x73,0x6E,0x76,0x41, + 0x64,0x70,0x38,0x4C,0x66,0x67,0x33,0x20,0x4C,0x53,0x6A,0x4C,0x48,0x47,0x51, + 0x6B,0x50,0x6D,0x6E,0x62,0x71,0x61,0x75,0x50,0x36,0x39,0x53,0x63,0x6D,0x66, + 0x5A,0x31,0x59,0x50,0x37,0x73,0x66,0x53,0x57,0x64,0x37,0x71,0x32,0x5A,0x51, + 0x66,0x63,0x37,0x39,0x73,0x78,0x5A,0x75,0x48,0x67,0x35,0x76,0x36,0x65,0x72, + 0x36,0x6C,0x57,0x62,0x6F,0x4B,0x48,0x75,0x52,0x4B,0x59,0x62,0x38,0x4C,0x64, + 0x72,0x35,0x36,0x42,0x72,0x20,0x38,0x4B,0x4E,0x30,0x32,0x2B,0x34,0x74,0x4C, + 0x38,0x41,0x33,0x36,0x37,0x35,0x34,0x67,0x61,0x66,0x37,0x6A,0x6B,0x37,0x65, + 0x77,0x51,0x32,0x6E,0x66,0x56,0x6E,0x6E,0x7A,0x4B,0x55,0x79,0x67,0x54,0x75, + 0x55,0x37,0x63,0x58,0x34,0x68,0x72,0x32,0x4E,0x72,0x6F,0x55,0x2B,0x41,0x78, + 0x6A,0x4B,0x52,0x76,0x78,0x45,0x64,0x4E,0x51,0x32,0x59,0x6E,0x31,0x54,0x6C, + 0x6A,0x6B,0x76,0x20,0x36,0x31,0x2F,0x38,0x54,0x50,0x42,0x31,0x5A,0x33,0x31, + 0x7A,0x70,0x75,0x75,0x5A,0x76,0x31,0x59,0x39,0x48,0x58,0x79,0x35,0x30,0x6E, + 0x36,0x66,0x59,0x4C,0x73,0x34,0x4E,0x74,0x54,0x58,0x2F,0x69,0x43,0x64,0x34, + 0x6D,0x65,0x4F,0x5A,0x51,0x5A,0x66,0x74,0x33,0x31,0x32,0x39,0x78,0x2F,0x77, + 0x6E,0x38,0x36,0x6D,0x6D,0x63,0x50,0x70,0x76,0x6E,0x75,0x65,0x50,0x50,0x61, + 0x67,0x20,0x2F,0x69,0x68,0x66,0x39,0x48,0x5A,0x30,0x2F,0x57,0x6F,0x37,0x75, + 0x36,0x6A,0x4B,0x74,0x70,0x76,0x6E,0x36,0x37,0x4C,0x62,0x36,0x47,0x72,0x30, + 0x41,0x41,0x44,0x73,0x73,0x77,0x34,0x76,0x48,0x50,0x30,0x69,0x6E,0x56,0x75, + 0x50,0x7A,0x64,0x54,0x2F,0x65,0x75,0x56,0x58,0x74,0x68,0x73,0x39,0x44,0x63, + 0x47,0x6C,0x71,0x36,0x39,0x6E,0x54,0x51,0x65,0x54,0x30,0x66,0x73,0x7A,0x20, + 0x70,0x2B,0x54,0x39,0x32,0x54,0x33,0x30,0x77,0x59,0x4E,0x66,0x66,0x75,0x5A, + 0x4A,0x47,0x67,0x4A,0x39,0x62,0x4B,0x61,0x45,0x48,0x46,0x4C,0x34,0x7A,0x4C, + 0x46,0x38,0x50,0x35,0x31,0x32,0x4C,0x52,0x74,0x4A,0x34,0x35,0x6C,0x38,0x7A, + 0x31,0x2F,0x6F,0x66,0x75,0x52,0x54,0x67,0x41,0x46,0x71,0x47,0x38,0x35,0x37, + 0x57,0x53,0x57,0x4B,0x75,0x33,0x32,0x73,0x5A,0x52,0x4C,0x54,0x20,0x35,0x56, + 0x38,0x36,0x58,0x6F,0x56,0x74,0x6A,0x39,0x66,0x44,0x72,0x57,0x46,0x76,0x7A, + 0x73,0x63,0x39,0x33,0x65,0x39,0x50,0x62,0x62,0x2B,0x45,0x72,0x36,0x7A,0x66, + 0x44,0x34,0x48,0x4A,0x58,0x74,0x44,0x31,0x66,0x4D,0x6F,0x2F,0x72,0x37,0x66, + 0x41,0x52,0x47,0x51,0x6F,0x33,0x62,0x58,0x39,0x39,0x73,0x57,0x63,0x70,0x2B, + 0x68,0x2B,0x67,0x64,0x42,0x74,0x2F,0x45,0x4E,0x4A,0x20,0x47,0x48,0x77,0x44, + 0x48,0x2B,0x62,0x73,0x6C,0x2B,0x2B,0x42,0x69,0x43,0x30,0x44,0x34,0x4A,0x6D, + 0x47,0x71,0x32,0x41,0x5A,0x67,0x42,0x77,0x41,0x44,0x4C,0x37,0x31,0x59,0x64, + 0x68,0x78,0x6B,0x55,0x51,0x4C,0x71,0x68,0x2B,0x2F,0x38,0x6E,0x6B,0x45,0x30, + 0x2F,0x50,0x79,0x58,0x4F,0x64,0x6D,0x6E,0x54,0x30,0x2B,0x38,0x76,0x39,0x78, + 0x31,0x72,0x6A,0x70,0x66,0x67,0x38,0x44,0x20,0x5A,0x4E,0x59,0x4C,0x57,0x44, + 0x72,0x45,0x48,0x4A,0x61,0x46,0x63,0x54,0x2F,0x68,0x64,0x6B,0x73,0x33,0x73, + 0x69,0x72,0x70,0x46,0x4E,0x44,0x52,0x38,0x64,0x5A,0x4B,0x48,0x46,0x6C,0x46, + 0x35,0x75,0x68,0x4D,0x66,0x44,0x78,0x4B,0x6D,0x63,0x6E,0x4D,0x70,0x69,0x58, + 0x39,0x50,0x65,0x61,0x38,0x30,0x72,0x6D,0x35,0x55,0x49,0x4D,0x6D,0x42,0x53, + 0x43,0x32,0x31,0x72,0x54,0x39,0x20,0x72,0x53,0x5A,0x6C,0x70,0x67,0x6F,0x31, + 0x39,0x6F,0x4C,0x59,0x54,0x53,0x6B,0x37,0x37,0x4A,0x67,0x56,0x62,0x62,0x70, + 0x51,0x4F,0x55,0x63,0x4B,0x67,0x43,0x65,0x5A,0x4C,0x4C,0x63,0x4F,0x7A,0x48, + 0x51,0x51,0x78,0x4E,0x70,0x6E,0x4B,0x64,0x57,0x64,0x67,0x44,0x63,0x41,0x4C, + 0x4B,0x2F,0x45,0x36,0x55,0x5A,0x4D,0x43,0x6B,0x42,0x4B,0x32,0x55,0x6C,0x33, + 0x45,0x6F,0x52,0x75,0x20,0x2B,0x47,0x4B,0x4A,0x46,0x41,0x43,0x52,0x6D,0x35, + 0x38,0x43,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79, + 0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41, + 0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63, + 0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75, + 0x71,0x52,0x20,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F, + 0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44, + 0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79, + 0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F, + 0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71, + 0x20,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41, + 0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48, + 0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A, + 0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78, + 0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x20,0x41, + 0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50, + 0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C, + 0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B, + 0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41, + 0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x20,0x6D,0x4A,0x42, + 0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79, + 0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38, + 0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A, + 0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39, + 0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x20,0x4A,0x41,0x43,0x51,0x79, + 0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41, + 0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63, + 0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75, + 0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D, + 0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x20,0x79,0x73,0x33,0x50,0x6D,0x41,0x44, + 0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79, + 0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F, + 0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71, + 0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43, + 0x51,0x79,0x73,0x33,0x50,0x20,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48, + 0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A, + 0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78, + 0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67, 0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D, - 0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A, - 0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E, - 0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45, - 0x41,0x71,0x20,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36, + 0x41,0x44,0x41,0x20,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C, + 0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B, + 0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41, + 0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36, 0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61, - 0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49, - 0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41, - 0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A, - 0x20,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73, - 0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70, - 0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43, - 0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71, - 0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x20,0x6D, - 0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41, - 0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59, - 0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49, - 0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E, - 0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x20,0x4A,0x41,0x43, - 0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67, - 0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71, - 0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69, - 0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43, - 0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x20,0x79,0x73,0x33,0x50,0x6D, - 0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A, - 0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E, - 0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45, - 0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A, - 0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x20,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61, - 0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49, - 0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41, - 0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A, - 0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33, - 0x50,0x6D,0x41,0x44,0x41,0x20,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70, - 0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43, - 0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71, - 0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A, - 0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C, - 0x79,0x61,0x6B,0x20,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59, - 0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49, - 0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E, - 0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51, - 0x79,0x73,0x33,0x50,0x32,0x50,0x38,0x41,0x43,0x2F,0x6B,0x64,0x31,0x2F,0x36, - 0x61,0x20,0x4B,0x5A,0x63,0x41,0x41,0x41,0x41,0x41,0x53,0x55,0x56,0x4F,0x52, - 0x4B,0x35,0x43,0x59,0x49,0x49,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C, - 0x20,0x6C,0x6F,0x76,0x65,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20, + 0x6B,0x20,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38, + 0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A, + 0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39, + 0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73, + 0x33,0x50,0x32,0x50,0x38,0x41,0x43,0x2F,0x6B,0x64,0x31,0x2F,0x36,0x61,0x20, + 0x4B,0x5A,0x63,0x41,0x41,0x41,0x41,0x41,0x53,0x55,0x56,0x4F,0x52,0x4B,0x35, + 0x43,0x59,0x49,0x49,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6C, + 0x6F,0x76,0x65,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B, + 0x20,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,0x42,0x41,0x43,0x41,0x59,0x41,0x41,0x41,0x44,0x31,0x58,0x61,0x6D,0x2B, + 0x41,0x41,0x41,0x41,0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73, + 0x54,0x41,0x41,0x41,0x4C,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x20,0x41, + 0x41,0x41,0x4C,0x79,0x30,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x63, + 0x6A,0x31,0x58,0x63,0x4F,0x68,0x50,0x46,0x58,0x39,0x37,0x35,0x43,0x6E,0x41, + 0x71,0x69,0x4B,0x6B,0x67,0x70,0x6F,0x4B,0x59,0x43,0x6C,0x67,0x71,0x77,0x46, + 0x54,0x41,0x70,0x67,0x4B,0x57,0x43,0x69,0x41,0x56,0x73,0x46,0x54,0x41,0x70, + 0x67,0x4A,0x4D,0x42,0x66,0x47,0x72,0x41,0x4B,0x55,0x43,0x20,0x33,0x45,0x47, + 0x2B,0x33,0x30,0x33,0x73,0x39,0x35,0x54,0x42,0x33,0x6A,0x39,0x67,0x37,0x32, + 0x36,0x51,0x37,0x6A,0x6B,0x33,0x6D,0x68,0x6C,0x4A,0x4D,0x2F,0x4A,0x49,0x6D, + 0x76,0x58,0x75,0x79,0x65,0x48,0x64,0x6A,0x78,0x38,0x2F,0x2F,0x6F,0x71,0x49, + 0x47,0x59,0x67,0x5A,0x43,0x44,0x4D,0x44,0x66,0x34,0x66,0x35,0x32,0x50,0x47, + 0x70,0x59,0x77,0x5A,0x69,0x42,0x70,0x53,0x42,0x20,0x57,0x41,0x44,0x69,0x4F, + 0x59,0x67,0x5A,0x43,0x44,0x67,0x44,0x73,0x51,0x41,0x45,0x76,0x50,0x6E,0x78, + 0x30,0x57,0x4D,0x47,0x59,0x67,0x47,0x49,0x5A,0x79,0x42,0x6D,0x49,0x4F,0x41, + 0x4D,0x78,0x41,0x49,0x51,0x38,0x4F,0x62,0x48,0x52,0x34,0x38,0x5A,0x69,0x41, + 0x55,0x67,0x6E,0x6F,0x47,0x59,0x67,0x59,0x41,0x7A,0x38,0x4C,0x2B,0x41,0x6E, + 0x2F,0x31,0x50,0x65,0x2F,0x53,0x4D,0x20,0x42,0x65,0x66,0x51,0x77,0x52,0x4C, + 0x57,0x4D,0x4F,0x4B,0x76,0x76,0x35,0x51,0x58,0x4D,0x54,0x58,0x4A,0x63,0x4F, + 0x68,0x69,0x43,0x53,0x4E,0x36,0x4D,0x68,0x41,0x4C,0x51,0x45,0x39,0x69,0x39, + 0x73,0x69,0x63,0x73,0x4A,0x59,0x37,0x6D,0x48,0x74,0x72,0x30,0x75,0x55,0x2F, + 0x67,0x70,0x56,0x6E,0x43,0x30,0x6E,0x4D,0x65,0x64,0x68,0x54,0x4F,0x49,0x48, + 0x4B,0x7A,0x79,0x6F,0x73,0x20,0x47,0x50,0x41,0x56,0x7A,0x6C,0x63,0x4E,0x44, + 0x4B,0x30,0x2F,0x66,0x67,0x58,0x59,0x2F,0x59,0x35,0x66,0x73,0x59,0x51,0x6E, + 0x71,0x50,0x2B,0x52,0x70,0x56,0x61,0x36,0x44,0x2B,0x6D,0x35,0x62,0x30,0x44, + 0x57,0x6F,0x62,0x39,0x76,0x57,0x74,0x50,0x31,0x70,0x74,0x57,0x73,0x65,0x57, + 0x34,0x39,0x65,0x77,0x48,0x58,0x75,0x66,0x77,0x4D,0x2B,0x31,0x6B,0x6F,0x62, + 0x6D,0x67,0x66,0x20,0x59,0x51,0x45,0x6A,0x6D,0x67,0x7A,0x45,0x41,0x72,0x44, + 0x62,0x6F,0x36,0x44,0x4C,0x50,0x59,0x58,0x74,0x51,0x56,0x59,0x72,0x58,0x59, + 0x65,0x31,0x52,0x64,0x45,0x4B,0x70,0x74,0x58,0x59,0x33,0x4E,0x6A,0x2B,0x4A, + 0x46,0x58,0x50,0x2B,0x61,0x4E,0x68,0x73,0x63,0x62,0x43,0x5A,0x34,0x7A,0x35, + 0x42,0x6E,0x50,0x34,0x55,0x71,0x52,0x4D,0x56,0x47,0x37,0x76,0x6F,0x66,0x49, + 0x58,0x20,0x50,0x4E,0x37,0x46,0x2F,0x77,0x71,0x38,0x73,0x7A,0x4F,0x67,0x41, + 0x2F,0x69,0x30,0x4A,0x50,0x6F,0x42,0x66,0x51,0x37,0x71,0x6B,0x76,0x54,0x68, + 0x6B,0x6F,0x35,0x5A,0x58,0x2B,0x65,0x65,0x32,0x78,0x39,0x5A,0x58,0x39,0x71, + 0x73,0x73,0x61,0x5A,0x39,0x33,0x38,0x69,0x32,0x55,0x5A,0x37,0x75,0x59,0x47, + 0x34,0x37,0x47,0x72,0x32,0x69,0x4C,0x65,0x46,0x33,0x4B,0x46,0x6C,0x49,0x20, + 0x47,0x33,0x36,0x69,0x7A,0x57,0x45,0x58,0x46,0x50,0x4D,0x49,0x74,0x6E,0x4F, + 0x36,0x78,0x72,0x78,0x35,0x57,0x2F,0x77,0x4E,0x59,0x48,0x64,0x62,0x6E,0x4B, + 0x30,0x49,0x6E,0x64,0x4C,0x76,0x6F,0x41,0x35,0x71,0x41,0x72,0x74,0x51,0x64, + 0x68,0x6E,0x2F,0x41,0x4A,0x75,0x65,0x50,0x56,0x31,0x6A,0x6E,0x58,0x70,0x75, + 0x66,0x56,0x70,0x72,0x76,0x4D,0x55,0x63,0x77,0x79,0x56,0x30,0x20,0x63,0x42, + 0x6C,0x53,0x4F,0x67,0x74,0x34,0x44,0x76,0x30,0x38,0x74,0x72,0x36,0x44,0x4C, + 0x67,0x4A,0x2F,0x6B,0x35,0x53,0x49,0x33,0x57,0x53,0x67,0x58,0x6A,0x50,0x73, + 0x6C,0x35,0x35,0x78,0x46,0x66,0x61,0x79,0x70,0x32,0x2F,0x66,0x7A,0x62,0x6C, + 0x5A,0x34,0x4D,0x4C,0x6F,0x72,0x58,0x71,0x44,0x6B,0x4C,0x56,0x4B,0x30,0x2B, + 0x71,0x35,0x44,0x2B,0x45,0x5A,0x64,0x48,0x41,0x56,0x20,0x48,0x41,0x4E,0x6D, + 0x38,0x41,0x44,0x61,0x4F,0x41,0x6B,0x32,0x78,0x51,0x67,0x57,0x73,0x51,0x44, + 0x73,0x62,0x75,0x74,0x31,0x6B,0x4D,0x55,0x75,0x4F,0x49,0x78,0x6C,0x30,0x7A, + 0x47,0x6A,0x31,0x53,0x64,0x64,0x33,0x65,0x68,0x71,0x53,0x71,0x68,0x50,0x72, + 0x6B,0x32,0x51,0x4D,0x7A,0x6A,0x64,0x5A,0x4D,0x4B,0x49,0x59,0x30,0x2B,0x4E, + 0x62,0x2F,0x31,0x43,0x62,0x7A,0x48,0x46,0x20,0x4D,0x44,0x46,0x47,0x35,0x55, + 0x76,0x50,0x72,0x58,0x5A,0x54,0x31,0x45,0x77,0x34,0x67,0x58,0x4D,0x7A,0x4D, + 0x55,0x4F,0x66,0x47,0x56,0x73,0x77,0x61,0x76,0x77,0x4E,0x59,0x4C,0x64,0x62, + 0x72,0x63,0x4F,0x6E,0x37,0x37,0x65,0x70,0x74,0x77,0x79,0x48,0x72,0x49,0x50, + 0x61,0x64,0x63,0x68,0x54,0x37,0x41,0x35,0x75,0x69,0x6D,0x39,0x4D,0x55,0x4B, + 0x77,0x61,0x36,0x74,0x50,0x54,0x20,0x77,0x56,0x30,0x68,0x49,0x66,0x43,0x54, + 0x43,0x66,0x34,0x65,0x58,0x57,0x74,0x72,0x6F,0x54,0x47,0x50,0x55,0x47,0x32, + 0x4C,0x43,0x6B,0x47,0x58,0x33,0x78,0x2F,0x58,0x39,0x6D,0x33,0x61,0x36,0x6C, + 0x4F,0x2F,0x38,0x43,0x62,0x4A,0x70,0x39,0x59,0x51,0x48,0x47,0x49,0x42,0x32, + 0x49,0x38,0x74,0x6E,0x37,0x43,0x4D,0x44,0x44,0x71,0x34,0x67,0x44,0x71,0x51, + 0x51,0x79,0x48,0x48,0x20,0x30,0x62,0x33,0x6E,0x72,0x45,0x54,0x57,0x52,0x64, + 0x6F,0x56,0x43,0x67,0x4C,0x72,0x41,0x72,0x62,0x51,0x38,0x36,0x72,0x67,0x2B, + 0x65,0x69,0x36,0x6F,0x41,0x63,0x4D,0x47,0x43,0x6F,0x76,0x43,0x62,0x34,0x65, + 0x6F,0x64,0x6F,0x57,0x79,0x6B,0x6E,0x5A,0x4B,0x71,0x47,0x30,0x38,0x55,0x66, + 0x41,0x2F,0x64,0x68,0x70,0x58,0x51,0x4A,0x52,0x53,0x4F,0x45,0x45,0x66,0x6D, + 0x70,0x6B,0x20,0x48,0x64,0x49,0x4D,0x43,0x75,0x58,0x50,0x66,0x33,0x2B,0x39, + 0x48,0x54,0x77,0x30,0x65,0x74,0x33,0x59,0x2B,0x68,0x72,0x62,0x6E,0x7A,0x4E, + 0x77,0x41,0x68,0x64,0x39,0x45,0x30,0x61,0x32,0x48,0x78,0x76,0x2F,0x65,0x67, + 0x34,0x66,0x43,0x59,0x72,0x57,0x35,0x2B,0x4D,0x7A,0x53,0x75,0x30,0x62,0x58, + 0x69,0x6E,0x4C,0x31,0x78,0x78,0x4F,0x50,0x54,0x38,0x35,0x63,0x75,0x6E,0x70, + 0x20,0x51,0x59,0x6A,0x78,0x44,0x57,0x42,0x2F,0x74,0x72,0x6C,0x67,0x4B,0x65, + 0x63,0x77,0x32,0x33,0x42,0x4A,0x63,0x38,0x62,0x66,0x77,0x68,0x4C,0x32,0x34, + 0x59,0x36,0x4F,0x69,0x64,0x65,0x70,0x43,0x33,0x41,0x41,0x31,0x57,0x34,0x62, + 0x50,0x30,0x78,0x41,0x72,0x63,0x4E,0x35,0x74,0x67,0x4A,0x5A,0x62,0x77,0x41, + 0x74,0x48,0x49,0x4C,0x47,0x44,0x49,0x30,0x70,0x44,0x71,0x38,0x38,0x20,0x70, + 0x35,0x66,0x49,0x4D,0x30,0x38,0x50,0x51,0x6F,0x77,0x2F,0x41,0x75,0x35,0x2B, + 0x6D,0x33,0x55,0x78,0x39,0x54,0x71,0x71,0x51,0x35,0x2B,0x39,0x59,0x44,0x6B, + 0x46,0x63,0x2B,0x36,0x68,0x4C,0x6E,0x6B,0x4B,0x75,0x32,0x41,0x2F,0x51,0x52, + 0x4D,0x47,0x58,0x58,0x51,0x4E,0x48,0x4E,0x6D,0x6D,0x5A,0x2F,0x56,0x52,0x6F, + 0x54,0x6A,0x66,0x67,0x48,0x78,0x73,0x39,0x43,0x39,0x47,0x20,0x48,0x30,0x70, + 0x56,0x44,0x6F,0x4A,0x48,0x4C,0x41,0x43,0x37,0x4F,0x77,0x49,0x36,0x67,0x4C, + 0x71,0x30,0x79,0x79,0x37,0x75,0x4A,0x71,0x76,0x54,0x35,0x66,0x6F,0x47,0x69, + 0x34,0x35,0x4A,0x44,0x70,0x75,0x39,0x53,0x46,0x4E,0x73,0x4B,0x64,0x77,0x6D, + 0x37,0x4F,0x55,0x75,0x4F,0x34,0x4C,0x72,0x4F,0x58,0x77,0x73,0x66,0x47,0x56, + 0x41,0x2B,0x65,0x4F,0x41,0x76,0x76,0x35,0x59,0x20,0x56,0x2F,0x45,0x72,0x77, + 0x47,0x36,0x32,0x4C,0x69,0x47,0x73,0x50,0x72,0x57,0x7A,0x6E,0x76,0x41,0x36, + 0x39,0x41,0x2B,0x77,0x67,0x69,0x58,0x30,0x6B,0x61,0x4E,0x6F,0x33,0x6D,0x6E, + 0x54,0x30,0x6A,0x7A,0x44,0x47,0x5A,0x62,0x35,0x4D,0x2B,0x75,0x76,0x4E,0x34, + 0x33,0x55,0x73,0x35,0x66,0x49,0x52,0x35,0x34,0x2B,0x74,0x76,0x68,0x45,0x67, + 0x4D,0x51,0x4C,0x63,0x6F,0x69,0x73,0x20,0x5A,0x32,0x79,0x68,0x35,0x31,0x49, + 0x52,0x61,0x36,0x45,0x2B,0x6A,0x52,0x6B,0x61,0x4E,0x6F,0x37,0x38,0x4B,0x77, + 0x2B,0x6C,0x68,0x4B,0x43,0x67,0x2F,0x77,0x6F,0x63,0x47,0x42,0x4F,0x65,0x64, + 0x77,0x70,0x6E,0x4D,0x4E,0x33,0x42,0x73,0x79,0x76,0x2B,0x4E,0x32,0x6A,0x78, + 0x68,0x45,0x46,0x72,0x55,0x76,0x2B,0x36,0x65,0x36,0x4C,0x31,0x33,0x38,0x45, + 0x75,0x46,0x42,0x69,0x74,0x20,0x6E,0x37,0x78,0x6A,0x59,0x4E,0x63,0x34,0x4F, + 0x32,0x38,0x49,0x33,0x63,0x5A,0x2B,0x58,0x47,0x4E,0x39,0x4E,0x78,0x31,0x6A, + 0x68,0x6C,0x69,0x4C,0x7A,0x58,0x2F,0x58,0x57,0x6F,0x61,0x49,0x73,0x2F,0x63, + 0x2B,0x51,0x76,0x77,0x4B,0x63,0x45,0x57,0x46,0x46,0x2F,0x55,0x64,0x32,0x50, + 0x2B,0x30,0x32,0x56,0x62,0x68,0x37,0x2F,0x72,0x6B,0x4C,0x77,0x6D,0x75,0x54, + 0x37,0x6F,0x5A,0x20,0x72,0x4F,0x47,0x36,0x63,0x41,0x77,0x38,0x61,0x57,0x6A, + 0x6E,0x33,0x57,0x44,0x50,0x6F,0x59,0x38,0x53,0x5A,0x65,0x45,0x62,0x6B,0x4A, + 0x57,0x4C,0x78,0x4E,0x6A,0x47,0x55,0x49,0x2B,0x4E,0x30,0x39,0x4C,0x6F,0x55, + 0x6E,0x4E,0x6A,0x2B,0x32,0x37,0x30,0x49,0x56,0x54,0x6C,0x4A,0x54,0x4F,0x4F, + 0x62,0x6F,0x30,0x65,0x6A,0x42,0x70,0x69,0x41,0x5A,0x68,0x34,0x75,0x37,0x75, + 0x4E,0x20,0x67,0x2B,0x2B,0x46,0x2B,0x33,0x6E,0x42,0x37,0x65,0x47,0x62,0x4D, + 0x30,0x43,0x76,0x6E,0x77,0x36,0x2B,0x46,0x41,0x73,0x6D,0x79,0x6B,0x64,0x74, + 0x48,0x4F,0x69,0x77,0x32,0x32,0x66,0x38,0x62,0x4D,0x61,0x70,0x2F,0x38,0x4C, + 0x4D,0x47,0x30,0x4F,0x64,0x47,0x4B,0x64,0x66,0x6A,0x54,0x36,0x32,0x71,0x75, + 0x64,0x55,0x50,0x67,0x6F,0x54,0x71,0x45,0x4B,0x66,0x47,0x56,0x73,0x77,0x20, + 0x61,0x6D,0x67,0x46,0x51,0x49,0x64,0x41,0x62,0x4F,0x46,0x61,0x59,0x51,0x74, + 0x74,0x53,0x67,0x78,0x37,0x30,0x65,0x62,0x59,0x7A,0x75,0x41,0x51,0x30,0x45, + 0x46,0x57,0x45,0x66,0x43,0x52,0x6F,0x6B,0x78,0x39,0x41,0x37,0x4B,0x44,0x58, + 0x34,0x78,0x4E,0x59,0x7A,0x4A,0x6A,0x47,0x31,0x4B,0x56,0x37,0x39,0x52,0x7A, + 0x57,0x43,0x4D,0x76,0x50,0x48,0x31,0x73,0x55,0x66,0x48,0x76,0x20,0x59,0x57, + 0x45,0x43,0x61,0x52,0x31,0x36,0x67,0x77,0x6F,0x57,0x6F,0x52,0x55,0x41,0x48, + 0x51,0x51,0x66,0x7A,0x6C,0x64,0x47,0x6C,0x75,0x33,0x6C,0x56,0x32,0x78,0x39, + 0x47,0x67,0x2B,0x4A,0x43,0x6D,0x65,0x58,0x78,0x75,0x45,0x35,0x65,0x6D,0x4A, + 0x73,0x4D,0x33,0x53,0x4E,0x39,0x61,0x46,0x50,0x78,0x37,0x46,0x77,0x61,0x68, + 0x77,0x76,0x6A,0x4E,0x36,0x71,0x64,0x53,0x73,0x4D,0x20,0x31,0x4B,0x62,0x34, + 0x30,0x58,0x50,0x70,0x71,0x31,0x34,0x47,0x66,0x53,0x69,0x57,0x43,0x71,0x62, + 0x7A,0x6A,0x61,0x48,0x4A,0x6F,0x52,0x57,0x41,0x31,0x47,0x7A,0x77,0x67,0x39, + 0x48,0x48,0x55,0x68,0x4D,0x63,0x46,0x38,0x62,0x35,0x47,0x66,0x72,0x51,0x42, + 0x31,0x34,0x68,0x5A,0x74,0x44,0x42,0x46,0x6C,0x32,0x78,0x31,0x57,0x65,0x4C, + 0x54,0x34,0x5A,0x74,0x32,0x6B,0x34,0x61,0x20,0x75,0x4A,0x30,0x59,0x66,0x31, + 0x2B,0x4E,0x33,0x71,0x70,0x56,0x4B,0x7A,0x54,0x74,0x42,0x36,0x4F,0x76,0x71, + 0x2B,0x70,0x5A,0x64,0x50,0x45,0x66,0x59,0x51,0x45,0x74,0x46,0x45,0x65,0x58, + 0x33,0x38,0x61,0x7A,0x34,0x39,0x36,0x38,0x48,0x6E,0x6F,0x42,0x32,0x4E,0x59, + 0x47,0x46,0x79,0x61,0x51,0x44,0x6C,0x35,0x70,0x62,0x45,0x4F,0x71,0x6C,0x38, + 0x62,0x5A,0x71,0x64,0x47,0x6C,0x20,0x6C,0x6E,0x41,0x4F,0x66,0x56,0x79,0x67, + 0x70,0x4C,0x35,0x68,0x41,0x48,0x6C,0x69,0x66,0x4E,0x62,0x6F,0x69,0x78,0x36, + 0x2F,0x7A,0x74,0x68,0x7A,0x6F,0x36,0x39,0x53,0x4D,0x77,0x62,0x6F,0x30,0x31, + 0x34,0x73,0x59,0x42,0x65,0x75,0x4D,0x63,0x62,0x4C,0x33,0x32,0x51,0x6D,0x74, + 0x41,0x4A,0x67,0x44,0x30,0x52,0x70,0x44,0x53,0x50,0x70,0x6E,0x34,0x7A,0x66, + 0x57,0x36,0x4D,0x50,0x20,0x72,0x64,0x6F,0x4C,0x70,0x6F,0x75,0x52,0x64,0x67, + 0x54,0x52,0x57,0x30,0x44,0x74,0x32,0x52,0x50,0x6B,0x4B,0x30,0x38,0x66,0x51, + 0x6A,0x77,0x32,0x54,0x75,0x7A,0x61,0x2F,0x47,0x36,0x48,0x49,0x72,0x5A,0x49, + 0x45,0x62,0x54,0x32,0x64,0x58,0x48,0x48,0x77,0x4C,0x37,0x78,0x46,0x58,0x32, + 0x36,0x2B,0x50,0x61,0x5A,0x31,0x2F,0x58,0x39,0x4A,0x73,0x65,0x46,0x56,0x67, + 0x41,0x2B,0x20,0x37,0x6D,0x67,0x58,0x63,0x78,0x4E,0x33,0x32,0x53,0x55,0x77, + 0x51,0x31,0x2B,0x6B,0x31,0x73,0x79,0x79,0x4D,0x62,0x49,0x4F,0x54,0x78,0x70, + 0x6E,0x76,0x77,0x70,0x4D,0x73,0x49,0x6C,0x44,0x49,0x4D,0x47,0x4A,0x39,0x64, + 0x58,0x33,0x2B,0x74,0x2F,0x47,0x4B,0x31,0x75,0x68,0x61,0x63,0x2B,0x4E,0x76, + 0x71,0x6E,0x71,0x6D,0x48,0x41,0x47,0x44,0x32,0x45,0x4A,0x49,0x37,0x77,0x4D, + 0x20,0x68,0x46,0x59,0x41,0x64,0x43,0x43,0x33,0x44,0x63,0x58,0x30,0x34,0x39, + 0x62,0x6F,0x62,0x67,0x75,0x4C,0x65,0x44,0x41,0x78,0x4D,0x71,0x4F,0x33,0x36, + 0x68,0x79,0x68,0x62,0x4A,0x57,0x6D,0x76,0x61,0x48,0x31,0x31,0x32,0x79,0x36, + 0x31,0x31,0x59,0x6E,0x78,0x6F,0x39,0x44,0x58,0x36,0x79,0x59,0x66,0x57,0x76, + 0x36,0x43,0x2F,0x54,0x55,0x32,0x50,0x72,0x55,0x53,0x36,0x39,0x44,0x20,0x63, + 0x59,0x37,0x67,0x41,0x5A,0x7A,0x44,0x69,0x49,0x34,0x4D,0x68,0x46,0x59,0x41, + 0x4F,0x6C,0x49,0x77,0x75,0x69,0x6B,0x7A,0x45,0x53,0x71,0x6A,0x6A,0x36,0x58, + 0x61,0x4F,0x4D,0x76,0x65,0x66,0x73,0x35,0x59,0x52,0x4F,0x30,0x74,0x4A,0x45, + 0x46,0x57,0x45,0x58,0x67,0x74,0x54,0x6F,0x32,0x44,0x68,0x64,0x47,0x37,0x31, + 0x42,0x4B,0x6A,0x4D,0x78,0x31,0x58,0x52,0x75,0x39,0x54,0x20,0x35,0x33,0x53, + 0x38,0x61,0x33,0x68,0x43,0x57,0x38,0x4B,0x49,0x4A,0x52,0x6D,0x49,0x42,0x57, + 0x42,0x4A,0x63,0x74,0x35,0x59,0x6C,0x79,0x35,0x31,0x48,0x78,0x77,0x64,0x6C, + 0x36,0x5A,0x7A,0x67,0x69,0x36,0x2B,0x46,0x43,0x6B,0x54,0x63,0x7A,0x50,0x35, + 0x69,0x39,0x48,0x37,0x31,0x4D,0x2B,0x6D,0x51,0x2B,0x73,0x6F,0x6A,0x47,0x30, + 0x49,0x4E,0x63,0x57,0x4A,0x69,0x6F,0x73,0x34,0x20,0x68,0x51,0x6B,0x4D,0x43, + 0x71,0x45,0x56,0x67,0x49,0x63,0x39,0x32,0x4E,0x31,0x71,0x53,0x32,0x73,0x6F, + 0x4E,0x34,0x78,0x7A,0x7A,0x58,0x67,0x37,0x52,0x32,0x38,0x42,0x4B,0x58,0x77, + 0x4A,0x7A,0x73,0x32,0x6B,0x45,0x74,0x30,0x5A,0x57,0x35,0x2B,0x36,0x6F,0x4B, + 0x4D,0x30,0x6E,0x56,0x70,0x4C,0x5A,0x6D,0x79,0x76,0x55,0x65,0x56,0x4C,0x61, + 0x31,0x52,0x52,0x2B,0x67,0x6F,0x56,0x20,0x55,0x34,0x55,0x67,0x67,0x63,0x45, + 0x67,0x74,0x41,0x4A,0x67,0x4E,0x33,0x62,0x49,0x41,0x32,0x56,0x39,0x39,0x2B, + 0x6E,0x62,0x69,0x70,0x6E,0x32,0x4C,0x57,0x43,0x4A,0x2F,0x59,0x79,0x2B,0x32, + 0x75,0x76,0x58,0x5A,0x58,0x6A,0x4A,0x56,0x77,0x48,0x4E,0x4B,0x7A,0x77,0x2F, + 0x45,0x6D,0x2B,0x4E,0x76,0x6B,0x71,0x31,0x61,0x39,0x48,0x34,0x65,0x7A,0x68, + 0x5A,0x4E,0x58,0x48,0x4E,0x20,0x66,0x6C,0x33,0x2B,0x53,0x33,0x67,0x48,0x74, + 0x64,0x35,0x57,0x6E,0x79,0x49,0x48,0x67,0x39,0x41,0x4B,0x51,0x47,0x31,0x32, + 0x56,0x68,0x73,0x2F,0x4E,0x74,0x7A,0x59,0x41,0x58,0x72,0x38,0x70,0x7A,0x33, + 0x32,0x5A,0x57,0x5A,0x48,0x70,0x79,0x36,0x46,0x6A,0x78,0x78,0x6C,0x35,0x68, + 0x76,0x57,0x6B,0x43,0x65,0x4D,0x38,0x58,0x50,0x72,0x30,0x4F,0x64,0x77,0x45, + 0x7A,0x67,0x47,0x20,0x6E,0x35,0x67,0x4A,0x38,0x71,0x6B,0x4C,0x4F,0x34,0x4F, + 0x2B,0x66,0x39,0x53,0x4E,0x6F,0x66,0x6B,0x31,0x72,0x4F,0x41,0x6E,0x2B,0x42, + 0x30,0x36,0x2B,0x41,0x45,0x47,0x67,0x39,0x41,0x4B,0x67,0x44,0x62,0x62,0x68, + 0x7A,0x5A,0x2B,0x62,0x44,0x67,0x54,0x49,0x44,0x66,0x36,0x57,0x47,0x70,0x71, + 0x48,0x4E,0x74,0x6E,0x4E,0x39,0x33,0x2F,0x71,0x74,0x64,0x49,0x35,0x62,0x2F, + 0x61,0x20,0x4C,0x2B,0x47,0x43,0x4A,0x6A,0x4F,0x32,0x5A,0x61,0x72,0x47,0x2B, + 0x37,0x6A,0x31,0x6C,0x51,0x33,0x6B,0x6B,0x72,0x46,0x6E,0x48,0x65,0x50,0x6C, + 0x2F,0x78,0x48,0x4F,0x34,0x4B,0x70,0x31,0x35,0x59,0x77,0x70,0x34,0x41,0x32, + 0x38,0x68,0x31,0x4E,0x6F,0x6F,0x61,0x4C,0x33,0x73,0x54,0x45,0x6D,0x74,0x76, + 0x4D,0x74,0x36,0x36,0x48,0x39,0x51,0x52,0x42,0x74,0x37,0x70,0x4F,0x33,0x20, + 0x6F,0x54,0x58,0x79,0x65,0x30,0x38,0x66,0x53,0x39,0x54,0x42,0x79,0x7A,0x33, + 0x6E,0x52,0x38,0x69,0x6C,0x70,0x34,0x38,0x68,0x36,0x73,0x41,0x58,0x6E,0x75, + 0x50,0x50,0x79,0x4E,0x65,0x65,0x76,0x6B,0x78,0x55,0x6E,0x68,0x36,0x68,0x32, + 0x68,0x59,0x4F,0x34,0x52,0x41,0x71,0x5A,0x38,0x74,0x51,0x30,0x4B,0x6E,0x59, + 0x4C,0x54,0x54,0x2B,0x41,0x4B,0x36,0x61,0x31,0x34,0x37,0x76,0x20,0x61,0x67, + 0x75,0x4D,0x56,0x39,0x42,0x66,0x6A,0x78,0x31,0x58,0x59,0x66,0x42,0x6A,0x5A, + 0x45,0x76,0x47,0x61,0x7A,0x30,0x35,0x46,0x4F,0x54,0x7A,0x47,0x6B,0x36,0x67, + 0x35,0x70,0x51,0x4E,0x61,0x64,0x34,0x2B,0x51,0x6E,0x73,0x44,0x71,0x4E,0x6C, + 0x53,0x35,0x32,0x31,0x72,0x67,0x71,0x78,0x4E,0x48,0x78,0x75,0x56,0x43,0x58, + 0x42,0x71,0x39,0x44,0x48,0x55,0x69,0x58,0x46,0x71,0x20,0x31,0x32,0x43,0x36, + 0x66,0x31,0x4E,0x72,0x4E,0x50,0x76,0x36,0x6E,0x57,0x4B,0x37,0x2F,0x32,0x33, + 0x55,0x63,0x79,0x58,0x42,0x64,0x47,0x48,0x4D,0x43,0x33,0x54,0x35,0x65,0x77, + 0x33,0x6D,0x54,0x46,0x62,0x52,0x72,0x4A,0x59,0x34,0x79,0x65,0x6A,0x4C,0x50, + 0x53,0x5A,0x4C,0x78,0x71,0x70,0x72,0x44,0x6C,0x50,0x34,0x41,0x63,0x36,0x67, + 0x35,0x73,0x74,0x2F,0x43,0x63,0x50,0x42,0x20,0x53,0x48,0x39,0x78,0x5A,0x5A, + 0x2F,0x2F,0x45,0x6F,0x72,0x2B,0x79,0x6F,0x79,0x50,0x4B,0x35,0x53,0x78,0x31, + 0x35,0x76,0x35,0x41,0x5A,0x48,0x31,0x31,0x33,0x38,0x32,0x2B,0x63,0x73,0x2F, + 0x6D,0x36,0x35,0x76,0x30,0x68,0x46,0x76,0x55,0x78,0x38,0x61,0x50,0x7A,0x4E, + 0x2B,0x70,0x4E,0x37,0x41,0x50,0x6C,0x39,0x64,0x34,0x39,0x4D,0x6C,0x34,0x2F, + 0x76,0x38,0x4C,0x4C,0x4D,0x58,0x20,0x2B,0x48,0x75,0x45,0x4C,0x38,0x55,0x4E, + 0x45,0x35,0x66,0x35,0x44,0x36,0x6F,0x76,0x74,0x4B,0x38,0x41,0x71,0x75,0x77, + 0x54,0x71,0x42,0x2B,0x53,0x57,0x6A,0x67,0x45,0x76,0x52,0x4B,0x4F,0x6A,0x55, + 0x63,0x43,0x70,0x46,0x36,0x51,0x53,0x2B,0x53,0x5A,0x70,0x77,0x38,0x70,0x36, + 0x70,0x4D,0x36,0x39,0x78,0x7A,0x4F,0x6B,0x63,0x38,0x38,0x66,0x52,0x50,0x52, + 0x2B,0x74,0x4C,0x63,0x20,0x42,0x5A,0x53,0x2F,0x57,0x6B,0x71,0x44,0x6E,0x46, + 0x5A,0x6A,0x66,0x56,0x79,0x6A,0x36,0x4B,0x76,0x48,0x47,0x4E,0x41,0x2B,0x48, + 0x73,0x4F,0x73,0x59,0x56,0x63,0x4D,0x72,0x61,0x39,0x71,0x2B,0x49,0x38,0x6E, + 0x64,0x34,0x30,0x4E,0x30,0x68,0x5A,0x69,0x41,0x64,0x42,0x47,0x36,0x33,0x65, + 0x41,0x78,0x4E,0x74,0x78,0x48,0x65,0x61,0x35,0x70,0x34,0x38,0x68,0x54,0x6E, + 0x47,0x71,0x20,0x37,0x37,0x45,0x2B,0x39,0x4A,0x31,0x61,0x42,0x33,0x52,0x49, + 0x44,0x42,0x31,0x48,0x65,0x64,0x4C,0x46,0x7A,0x73,0x77,0x69,0x74,0x57,0x35, + 0x64,0x37,0x68,0x4A,0x4F,0x34,0x41,0x33,0x55,0x32,0x42,0x59,0x31,0x77,0x67, + 0x46,0x55,0x75,0x79,0x33,0x6B,0x54,0x61,0x43,0x4B,0x64,0x70,0x74,0x78,0x74, + 0x2F,0x56,0x38,0x67,0x38,0x63,0x4A,0x74,0x51,0x44,0x4D,0x79,0x4F,0x53,0x46, + 0x20,0x6C,0x30,0x32,0x48,0x72,0x4D,0x4D,0x36,0x4A,0x68,0x4B,0x63,0x50,0x30, + 0x4B,0x31,0x4C,0x58,0x52,0x51,0x6A,0x2B,0x42,0x51,0x68,0x7A,0x58,0x44,0x6C, + 0x79,0x36,0x72,0x48,0x32,0x4F,0x42,0x66,0x67,0x4A,0x66,0x41,0x2F,0x6D,0x7A, + 0x61,0x31,0x2F,0x6C,0x54,0x7A,0x45,0x56,0x4F,0x32,0x4B,0x50,0x4D,0x78,0x44, + 0x61,0x6A,0x34,0x44,0x74,0x56,0x73,0x78,0x62,0x6F,0x57,0x6C,0x54,0x20,0x32, + 0x6C,0x6B,0x6A,0x6A,0x39,0x58,0x55,0x4F,0x4E,0x61,0x62,0x68,0x6F,0x38,0x4D, + 0x78,0x56,0x35,0x59,0x76,0x33,0x38,0x54,0x75,0x63,0x75,0x58,0x59,0x75,0x70, + 0x54,0x2B,0x72,0x57,0x51,0x6E,0x30,0x4E,0x59,0x72,0x65,0x6E,0x6F,0x6D,0x6E, + 0x47,0x4C,0x4E,0x63,0x66,0x47,0x59,0x54,0x76,0x4D,0x51,0x4B,0x67,0x46,0x77, + 0x4A,0x48,0x7A,0x53,0x35,0x50,0x33,0x43,0x2F,0x54,0x4D,0x20,0x32,0x49,0x5A, + 0x57,0x64,0x53,0x6E,0x73,0x78,0x56,0x42,0x4D,0x46,0x59,0x45,0x55,0x76,0x68, + 0x52,0x54,0x4A,0x6E,0x59,0x56,0x45,0x6C,0x31,0x2B,0x39,0x31,0x4B,0x6E,0x5A, + 0x70,0x37,0x38,0x36,0x47,0x33,0x6C,0x32,0x74,0x69,0x74,0x71,0x72,0x77,0x4F, + 0x55,0x58,0x53,0x73,0x33,0x36,0x69,0x50,0x6B,0x49,0x46,0x51,0x76,0x77,0x49, + 0x6F,0x6C,0x51,0x6E,0x38,0x42,0x6C,0x50,0x59,0x20,0x6F,0x6B,0x59,0x34,0x67, + 0x47,0x72,0x48,0x67,0x75,0x4C,0x71,0x73,0x6D,0x59,0x6D,0x67,0x47,0x4C,0x71, + 0x38,0x6C,0x77,0x62,0x2B,0x7A,0x49,0x31,0x70,0x31,0x4F,0x46,0x53,0x36,0x32, + 0x46,0x2F,0x49,0x78,0x31,0x45,0x62,0x58,0x32,0x63,0x36,0x68,0x57,0x72,0x4F, + 0x45,0x43,0x33,0x73,0x49,0x53,0x52,0x76,0x77,0x68,0x47,0x51,0x69,0x35,0x41, + 0x47,0x69,0x4C,0x63,0x71,0x6A,0x4C,0x20,0x36,0x4B,0x4E,0x43,0x4F,0x59,0x48, + 0x4F,0x4E,0x77,0x34,0x73,0x4A,0x2F,0x6A,0x72,0x4B,0x67,0x49,0x4B,0x6F,0x38, + 0x73,0x30,0x68,0x31,0x2B,0x68,0x31,0x69,0x4B,0x39,0x52,0x59,0x6F,0x67,0x48, + 0x73,0x4E,0x4A,0x49,0x39,0x4D,0x38,0x67,0x77,0x72,0x4A,0x37,0x4A,0x6B,0x31, + 0x47,0x6D,0x49,0x47,0x54,0x41,0x5A,0x43,0x4C,0x77,0x42,0x4B,0x78,0x77,0x7A, + 0x71,0x55,0x39,0x53,0x48,0x20,0x4C,0x70,0x32,0x4B,0x51,0x4F,0x6B,0x62,0x42, + 0x35,0x59,0x54,0x2F,0x4E,0x31,0x41,0x58,0x65,0x53,0x68,0x6F,0x48,0x57,0x66, + 0x77,0x63,0x56,0x51,0x44,0x71,0x4F,0x66,0x74,0x35,0x32,0x42,0x55,0x48,0x38, + 0x44,0x38,0x48,0x64,0x31,0x68,0x6A,0x4C,0x33,0x44,0x63,0x69,0x36,0x6E,0x50, + 0x71,0x45,0x31,0x67,0x57,0x56,0x2F,0x46,0x4A,0x6B,0x54,0x4D,0x78,0x68,0x6C, + 0x34,0x38,0x61,0x20,0x75,0x34,0x71,0x4D,0x4C,0x71,0x7A,0x6B,0x31,0x32,0x4B, + 0x4F,0x67,0x77,0x4F,0x34,0x65,0x4B,0x32,0x6A,0x4F,0x44,0x2B,0x63,0x44,0x4D, + 0x51,0x33,0x67,0x50,0x2F,0x32,0x57,0x70,0x65,0x39,0x2B,0x45,0x2F,0x39,0x54, + 0x5A,0x71,0x6A,0x36,0x5A,0x56,0x38,0x6E,0x63,0x75,0x56,0x4D,0x57,0x34,0x43, + 0x39,0x5A,0x6F,0x75,0x57,0x61,0x6A,0x67,0x34,0x55,0x2B,0x70,0x2B,0x35,0x38, + 0x45,0x20,0x38,0x78,0x53,0x65,0x77,0x68,0x53,0x75,0x69,0x35,0x71,0x42,0x43, + 0x33,0x67,0x4A,0x48,0x59,0x79,0x49,0x47,0x64,0x67,0x6F,0x41,0x37,0x45,0x41, + 0x2F,0x4A,0x34,0x75,0x58,0x63,0x4B,0x72,0x33,0x30,0x33,0x50,0x74,0x42,0x4B, + 0x4C,0x4C,0x74,0x34,0x2F,0x58,0x73,0x39,0x48,0x35,0x41,0x54,0x6D,0x6E,0x73, + 0x32,0x4B,0x4B,0x67,0x43,0x56,0x4E,0x58,0x62,0x6F,0x47,0x62,0x59,0x4A,0x20, + 0x2F,0x41,0x54,0x54,0x68,0x6A,0x51,0x2F,0x34,0x66,0x68,0x58,0x6C,0x4A,0x38, + 0x48,0x75,0x49,0x41,0x52,0x4D,0x51,0x4D,0x76,0x7A,0x6B,0x41,0x73,0x41,0x4D, + 0x39,0x54,0x70,0x77,0x75,0x6F,0x74,0x77,0x47,0x31,0x51,0x36,0x48,0x47,0x30, + 0x51,0x46,0x55,0x47,0x78,0x45,0x7A,0x73,0x44,0x63,0x5A,0x69,0x4C,0x38,0x42, + 0x50,0x4E,0x2B,0x4B,0x43,0x70,0x4D,0x2B,0x72,0x63,0x2B,0x67,0x20,0x67,0x36, + 0x2F,0x46,0x48,0x41,0x64,0x48,0x4D,0x46,0x37,0x2B,0x31,0x32,0x59,0x79,0x7A, + 0x68,0x38,0x38,0x41,0x2F,0x45,0x4E,0x59,0x48,0x56,0x4B,0x4D,0x34,0x62,0x6F, + 0x75,0x33,0x6B,0x4F,0x4A,0x61,0x2B,0x43,0x43,0x6B,0x67,0x4A,0x39,0x59,0x71, + 0x75,0x4E,0x6C,0x35,0x38,0x6B,0x68,0x43,0x78,0x6E,0x78,0x6D,0x49,0x42,0x57, + 0x44,0x7A,0x66,0x56,0x45,0x52,0x53,0x44,0x71,0x6D,0x20,0x36,0x61,0x4A,0x58, + 0x48,0x66,0x5A,0x6F,0x69,0x68,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41,0x72,0x43, + 0x33,0x57,0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x62,0x69,0x62,0x77, + 0x44,0x6A,0x35,0x7A,0x68,0x47,0x69,0x42,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41, + 0x72,0x43,0x33,0x57,0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x5A,0x69, + 0x41,0x52,0x67,0x2F,0x78,0x7A,0x46,0x43,0x20,0x7A,0x4D,0x44,0x65,0x5A,0x69, + 0x41,0x57,0x67,0x4C,0x33,0x64,0x6D,0x72,0x69,0x77,0x6D,0x49,0x48,0x78,0x4D, + 0x78,0x41,0x4C,0x77,0x50,0x67,0x35,0x6A,0x68,0x46,0x69,0x42,0x76,0x59,0x32, + 0x41,0x37,0x45,0x41,0x37,0x4F,0x33,0x57,0x78,0x49,0x58,0x46,0x44,0x49,0x79, + 0x66,0x67,0x56,0x67,0x41,0x78,0x73,0x39,0x78,0x6A,0x42,0x41,0x7A,0x73,0x4C, + 0x63,0x5A,0x2B,0x44,0x2F,0x67,0x20,0x6B,0x56,0x6D,0x37,0x6B,0x69,0x4A,0x4A, + 0x36,0x67,0x41,0x41,0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A, + 0x67,0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x70, + 0x6C,0x61,0x6E,0x65,0x74,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20, 0x5B,0x5B,0x20,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,0x42,0x41,0x43,0x41,0x59,0x41,0x41,0x41,0x44,0x31,0x58,0x61, - 0x6D,0x2B,0x41,0x41,0x41,0x41,0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41, - 0x41,0x73,0x54,0x41,0x41,0x41,0x4C,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59, - 0x20,0x41,0x41,0x41,0x4C,0x79,0x30,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65, - 0x32,0x63,0x6A,0x31,0x58,0x63,0x4F,0x68,0x50,0x46,0x58,0x39,0x37,0x35,0x43, - 0x6E,0x41,0x71,0x69,0x4B,0x6B,0x67,0x70,0x6F,0x4B,0x59,0x43,0x6C,0x67,0x71, - 0x77,0x46,0x54,0x41,0x70,0x67,0x4B,0x57,0x43,0x69,0x41,0x56,0x73,0x46,0x54, - 0x41,0x70,0x67,0x4A,0x4D,0x42,0x66,0x47,0x72,0x41,0x4B,0x55,0x43,0x20,0x33, - 0x45,0x47,0x2B,0x33,0x30,0x33,0x73,0x39,0x35,0x54,0x42,0x33,0x6A,0x39,0x67, - 0x37,0x32,0x36,0x51,0x37,0x6A,0x6B,0x33,0x6D,0x68,0x6C,0x4A,0x4D,0x2F,0x4A, - 0x49,0x6D,0x76,0x58,0x75,0x79,0x65,0x48,0x64,0x6A,0x78,0x38,0x2F,0x2F,0x6F, - 0x71,0x49,0x47,0x59,0x67,0x5A,0x43,0x44,0x4D,0x44,0x66,0x34,0x66,0x35,0x32, - 0x50,0x47,0x70,0x59,0x77,0x5A,0x69,0x42,0x70,0x53,0x42,0x20,0x57,0x41,0x44, - 0x69,0x4F,0x59,0x67,0x5A,0x43,0x44,0x67,0x44,0x73,0x51,0x41,0x45,0x76,0x50, - 0x6E,0x78,0x30,0x57,0x4D,0x47,0x59,0x67,0x47,0x49,0x5A,0x79,0x42,0x6D,0x49, - 0x4F,0x41,0x4D,0x78,0x41,0x49,0x51,0x38,0x4F,0x62,0x48,0x52,0x34,0x38,0x5A, - 0x69,0x41,0x55,0x67,0x6E,0x6F,0x47,0x59,0x67,0x59,0x41,0x7A,0x38,0x4C,0x2B, - 0x41,0x6E,0x2F,0x31,0x50,0x65,0x2F,0x53,0x4D,0x20,0x42,0x65,0x66,0x51,0x77, - 0x52,0x4C,0x57,0x4D,0x4F,0x4B,0x76,0x76,0x35,0x51,0x58,0x4D,0x54,0x58,0x4A, - 0x63,0x4F,0x68,0x69,0x43,0x53,0x4E,0x36,0x4D,0x68,0x41,0x4C,0x51,0x45,0x39, - 0x69,0x39,0x73,0x69,0x63,0x73,0x4A,0x59,0x37,0x6D,0x48,0x74,0x72,0x30,0x75, - 0x55,0x2F,0x67,0x70,0x56,0x6E,0x43,0x30,0x6E,0x4D,0x65,0x64,0x68,0x54,0x4F, - 0x49,0x48,0x4B,0x7A,0x79,0x6F,0x73,0x20,0x47,0x50,0x41,0x56,0x7A,0x6C,0x63, - 0x4E,0x44,0x4B,0x30,0x2F,0x66,0x67,0x58,0x59,0x2F,0x59,0x35,0x66,0x73,0x59, - 0x51,0x6E,0x71,0x50,0x2B,0x52,0x70,0x56,0x61,0x36,0x44,0x2B,0x6D,0x35,0x62, - 0x30,0x44,0x57,0x6F,0x62,0x39,0x76,0x57,0x74,0x50,0x31,0x70,0x74,0x57,0x73, - 0x65,0x57,0x34,0x39,0x65,0x77,0x48,0x58,0x75,0x66,0x77,0x4D,0x2B,0x31,0x6B, - 0x6F,0x62,0x6D,0x67,0x66,0x20,0x59,0x51,0x45,0x6A,0x6D,0x67,0x7A,0x45,0x41, - 0x72,0x44,0x62,0x6F,0x36,0x44,0x4C,0x50,0x59,0x58,0x74,0x51,0x56,0x59,0x72, - 0x58,0x59,0x65,0x31,0x52,0x64,0x45,0x4B,0x70,0x74,0x58,0x59,0x33,0x4E,0x6A, - 0x2B,0x4A,0x46,0x58,0x50,0x2B,0x61,0x4E,0x68,0x73,0x63,0x62,0x43,0x5A,0x34, - 0x7A,0x35,0x42,0x6E,0x50,0x34,0x55,0x71,0x52,0x4D,0x56,0x47,0x37,0x76,0x6F, - 0x66,0x49,0x58,0x20,0x50,0x4E,0x37,0x46,0x2F,0x77,0x71,0x38,0x73,0x7A,0x4F, - 0x67,0x41,0x2F,0x69,0x30,0x4A,0x50,0x6F,0x42,0x66,0x51,0x37,0x71,0x6B,0x76, - 0x54,0x68,0x6B,0x6F,0x35,0x5A,0x58,0x2B,0x65,0x65,0x32,0x78,0x39,0x5A,0x58, - 0x39,0x71,0x73,0x73,0x61,0x5A,0x39,0x33,0x38,0x69,0x32,0x55,0x5A,0x37,0x75, - 0x59,0x47,0x34,0x37,0x47,0x72,0x32,0x69,0x4C,0x65,0x46,0x33,0x4B,0x46,0x6C, - 0x49,0x20,0x47,0x33,0x36,0x69,0x7A,0x57,0x45,0x58,0x46,0x50,0x4D,0x49,0x74, - 0x6E,0x4F,0x36,0x78,0x72,0x78,0x35,0x57,0x2F,0x77,0x4E,0x59,0x48,0x64,0x62, - 0x6E,0x4B,0x30,0x49,0x6E,0x64,0x4C,0x76,0x6F,0x41,0x35,0x71,0x41,0x72,0x74, - 0x51,0x64,0x68,0x6E,0x2F,0x41,0x4A,0x75,0x65,0x50,0x56,0x31,0x6A,0x6E,0x58, - 0x70,0x75,0x66,0x56,0x70,0x72,0x76,0x4D,0x55,0x63,0x77,0x79,0x56,0x30,0x20, - 0x63,0x42,0x6C,0x53,0x4F,0x67,0x74,0x34,0x44,0x76,0x30,0x38,0x74,0x72,0x36, - 0x44,0x4C,0x67,0x4A,0x2F,0x6B,0x35,0x53,0x49,0x33,0x57,0x53,0x67,0x58,0x6A, - 0x50,0x73,0x6C,0x35,0x35,0x78,0x46,0x66,0x61,0x79,0x70,0x32,0x2F,0x66,0x7A, - 0x62,0x6C,0x5A,0x34,0x4D,0x4C,0x6F,0x72,0x58,0x71,0x44,0x6B,0x4C,0x56,0x4B, - 0x30,0x2B,0x71,0x35,0x44,0x2B,0x45,0x5A,0x64,0x48,0x41,0x56,0x20,0x48,0x41, - 0x4E,0x6D,0x38,0x41,0x44,0x61,0x4F,0x41,0x6B,0x32,0x78,0x51,0x67,0x57,0x73, - 0x51,0x44,0x73,0x62,0x75,0x74,0x31,0x6B,0x4D,0x55,0x75,0x4F,0x49,0x78,0x6C, - 0x30,0x7A,0x47,0x6A,0x31,0x53,0x64,0x64,0x33,0x65,0x68,0x71,0x53,0x71,0x68, - 0x50,0x72,0x6B,0x32,0x51,0x4D,0x7A,0x6A,0x64,0x5A,0x4D,0x4B,0x49,0x59,0x30, - 0x2B,0x4E,0x62,0x2F,0x31,0x43,0x62,0x7A,0x48,0x46,0x20,0x4D,0x44,0x46,0x47, - 0x35,0x55,0x76,0x50,0x72,0x58,0x5A,0x54,0x31,0x45,0x77,0x34,0x67,0x58,0x4D, - 0x7A,0x4D,0x55,0x4F,0x66,0x47,0x56,0x73,0x77,0x61,0x76,0x77,0x4E,0x59,0x4C, - 0x64,0x62,0x72,0x63,0x4F,0x6E,0x37,0x37,0x65,0x70,0x74,0x77,0x79,0x48,0x72, - 0x49,0x50,0x61,0x64,0x63,0x68,0x54,0x37,0x41,0x35,0x75,0x69,0x6D,0x39,0x4D, - 0x55,0x4B,0x77,0x61,0x36,0x74,0x50,0x54,0x20,0x77,0x56,0x30,0x68,0x49,0x66, - 0x43,0x54,0x43,0x66,0x34,0x65,0x58,0x57,0x74,0x72,0x6F,0x54,0x47,0x50,0x55, - 0x47,0x32,0x4C,0x43,0x6B,0x47,0x58,0x33,0x78,0x2F,0x58,0x39,0x6D,0x33,0x61, - 0x36,0x6C,0x4F,0x2F,0x38,0x43,0x62,0x4A,0x70,0x39,0x59,0x51,0x48,0x47,0x49, - 0x42,0x32,0x49,0x38,0x74,0x6E,0x37,0x43,0x4D,0x44,0x44,0x71,0x34,0x67,0x44, - 0x71,0x51,0x51,0x79,0x48,0x48,0x20,0x30,0x62,0x33,0x6E,0x72,0x45,0x54,0x57, - 0x52,0x64,0x6F,0x56,0x43,0x67,0x4C,0x72,0x41,0x72,0x62,0x51,0x38,0x36,0x72, - 0x67,0x2B,0x65,0x69,0x36,0x6F,0x41,0x63,0x4D,0x47,0x43,0x6F,0x76,0x43,0x62, - 0x34,0x65,0x6F,0x64,0x6F,0x57,0x79,0x6B,0x6E,0x5A,0x4B,0x71,0x47,0x30,0x38, - 0x55,0x66,0x41,0x2F,0x64,0x68,0x70,0x58,0x51,0x4A,0x52,0x53,0x4F,0x45,0x45, - 0x66,0x6D,0x70,0x6B,0x20,0x48,0x64,0x49,0x4D,0x43,0x75,0x58,0x50,0x66,0x33, - 0x2B,0x39,0x48,0x54,0x77,0x30,0x65,0x74,0x33,0x59,0x2B,0x68,0x72,0x62,0x6E, - 0x7A,0x4E,0x77,0x41,0x68,0x64,0x39,0x45,0x30,0x61,0x32,0x48,0x78,0x76,0x2F, - 0x65,0x67,0x34,0x66,0x43,0x59,0x72,0x57,0x35,0x2B,0x4D,0x7A,0x53,0x75,0x30, - 0x62,0x58,0x69,0x6E,0x4C,0x31,0x78,0x78,0x4F,0x50,0x54,0x38,0x35,0x63,0x75, - 0x6E,0x70,0x20,0x51,0x59,0x6A,0x78,0x44,0x57,0x42,0x2F,0x74,0x72,0x6C,0x67, - 0x4B,0x65,0x63,0x77,0x32,0x33,0x42,0x4A,0x63,0x38,0x62,0x66,0x77,0x68,0x4C, - 0x32,0x34,0x59,0x36,0x4F,0x69,0x64,0x65,0x70,0x43,0x33,0x41,0x41,0x31,0x57, - 0x34,0x62,0x50,0x30,0x78,0x41,0x72,0x63,0x4E,0x35,0x74,0x67,0x4A,0x5A,0x62, - 0x77,0x41,0x74,0x48,0x49,0x4C,0x47,0x44,0x49,0x30,0x70,0x44,0x71,0x38,0x38, - 0x20,0x70,0x35,0x66,0x49,0x4D,0x30,0x38,0x50,0x51,0x6F,0x77,0x2F,0x41,0x75, - 0x35,0x2B,0x6D,0x33,0x55,0x78,0x39,0x54,0x71,0x71,0x51,0x35,0x2B,0x39,0x59, - 0x44,0x6B,0x46,0x63,0x2B,0x36,0x68,0x4C,0x6E,0x6B,0x4B,0x75,0x32,0x41,0x2F, - 0x51,0x52,0x4D,0x47,0x58,0x58,0x51,0x4E,0x48,0x4E,0x6D,0x6D,0x5A,0x2F,0x56, - 0x52,0x6F,0x54,0x6A,0x66,0x67,0x48,0x78,0x73,0x39,0x43,0x39,0x47,0x20,0x48, - 0x30,0x70,0x56,0x44,0x6F,0x4A,0x48,0x4C,0x41,0x43,0x37,0x4F,0x77,0x49,0x36, - 0x67,0x4C,0x71,0x30,0x79,0x79,0x37,0x75,0x4A,0x71,0x76,0x54,0x35,0x66,0x6F, - 0x47,0x69,0x34,0x35,0x4A,0x44,0x70,0x75,0x39,0x53,0x46,0x4E,0x73,0x4B,0x64, - 0x77,0x6D,0x37,0x4F,0x55,0x75,0x4F,0x34,0x4C,0x72,0x4F,0x58,0x77,0x73,0x66, - 0x47,0x56,0x41,0x2B,0x65,0x4F,0x41,0x76,0x76,0x35,0x59,0x20,0x56,0x2F,0x45, - 0x72,0x77,0x47,0x36,0x32,0x4C,0x69,0x47,0x73,0x50,0x72,0x57,0x7A,0x6E,0x76, - 0x41,0x36,0x39,0x41,0x2B,0x77,0x67,0x69,0x58,0x30,0x6B,0x61,0x4E,0x6F,0x33, - 0x6D,0x6E,0x54,0x30,0x6A,0x7A,0x44,0x47,0x5A,0x62,0x35,0x4D,0x2B,0x75,0x76, - 0x4E,0x34,0x33,0x55,0x73,0x35,0x66,0x49,0x52,0x35,0x34,0x2B,0x74,0x76,0x68, - 0x45,0x67,0x4D,0x51,0x4C,0x63,0x6F,0x69,0x73,0x20,0x5A,0x32,0x79,0x68,0x35, - 0x31,0x49,0x52,0x61,0x36,0x45,0x2B,0x6A,0x52,0x6B,0x61,0x4E,0x6F,0x37,0x38, - 0x4B,0x77,0x2B,0x6C,0x68,0x4B,0x43,0x67,0x2F,0x77,0x6F,0x63,0x47,0x42,0x4F, - 0x65,0x64,0x77,0x70,0x6E,0x4D,0x4E,0x33,0x42,0x73,0x79,0x76,0x2B,0x4E,0x32, - 0x6A,0x78,0x68,0x45,0x46,0x72,0x55,0x76,0x2B,0x36,0x65,0x36,0x4C,0x31,0x33, - 0x38,0x45,0x75,0x46,0x42,0x69,0x74,0x20,0x6E,0x37,0x78,0x6A,0x59,0x4E,0x63, - 0x34,0x4F,0x32,0x38,0x49,0x33,0x63,0x5A,0x2B,0x58,0x47,0x4E,0x39,0x4E,0x78, - 0x31,0x6A,0x68,0x6C,0x69,0x4C,0x7A,0x58,0x2F,0x58,0x57,0x6F,0x61,0x49,0x73, - 0x2F,0x63,0x2B,0x51,0x76,0x77,0x4B,0x63,0x45,0x57,0x46,0x46,0x2F,0x55,0x64, - 0x32,0x50,0x2B,0x30,0x32,0x56,0x62,0x68,0x37,0x2F,0x72,0x6B,0x4C,0x77,0x6D, - 0x75,0x54,0x37,0x6F,0x5A,0x20,0x72,0x4F,0x47,0x36,0x63,0x41,0x77,0x38,0x61, - 0x57,0x6A,0x6E,0x33,0x57,0x44,0x50,0x6F,0x59,0x38,0x53,0x5A,0x65,0x45,0x62, - 0x6B,0x4A,0x57,0x4C,0x78,0x4E,0x6A,0x47,0x55,0x49,0x2B,0x4E,0x30,0x39,0x4C, - 0x6F,0x55,0x6E,0x4E,0x6A,0x2B,0x32,0x37,0x30,0x49,0x56,0x54,0x6C,0x4A,0x54, - 0x4F,0x4F,0x62,0x6F,0x30,0x65,0x6A,0x42,0x70,0x69,0x41,0x5A,0x68,0x34,0x75, - 0x37,0x75,0x4E,0x20,0x67,0x2B,0x2B,0x46,0x2B,0x33,0x6E,0x42,0x37,0x65,0x47, - 0x62,0x4D,0x30,0x43,0x76,0x6E,0x77,0x36,0x2B,0x46,0x41,0x73,0x6D,0x79,0x6B, - 0x64,0x74,0x48,0x4F,0x69,0x77,0x32,0x32,0x66,0x38,0x62,0x4D,0x61,0x70,0x2F, - 0x38,0x4C,0x4D,0x47,0x30,0x4F,0x64,0x47,0x4B,0x64,0x66,0x6A,0x54,0x36,0x32, - 0x71,0x75,0x64,0x55,0x50,0x67,0x6F,0x54,0x71,0x45,0x4B,0x66,0x47,0x56,0x73, - 0x77,0x20,0x61,0x6D,0x67,0x46,0x51,0x49,0x64,0x41,0x62,0x4F,0x46,0x61,0x59, - 0x51,0x74,0x74,0x53,0x67,0x78,0x37,0x30,0x65,0x62,0x59,0x7A,0x75,0x41,0x51, - 0x30,0x45,0x46,0x57,0x45,0x66,0x43,0x52,0x6F,0x6B,0x78,0x39,0x41,0x37,0x4B, - 0x44,0x58,0x34,0x78,0x4E,0x59,0x7A,0x4A,0x6A,0x47,0x31,0x4B,0x56,0x37,0x39, - 0x52,0x7A,0x57,0x43,0x4D,0x76,0x50,0x48,0x31,0x73,0x55,0x66,0x48,0x76,0x20, - 0x59,0x57,0x45,0x43,0x61,0x52,0x31,0x36,0x67,0x77,0x6F,0x57,0x6F,0x52,0x55, - 0x41,0x48,0x51,0x51,0x66,0x7A,0x6C,0x64,0x47,0x6C,0x75,0x33,0x6C,0x56,0x32, - 0x78,0x39,0x47,0x67,0x2B,0x4A,0x43,0x6D,0x65,0x58,0x78,0x75,0x45,0x35,0x65, - 0x6D,0x4A,0x73,0x4D,0x33,0x53,0x4E,0x39,0x61,0x46,0x50,0x78,0x37,0x46,0x77, - 0x61,0x68,0x77,0x76,0x6A,0x4E,0x36,0x71,0x64,0x53,0x73,0x4D,0x20,0x31,0x4B, - 0x62,0x34,0x30,0x58,0x50,0x70,0x71,0x31,0x34,0x47,0x66,0x53,0x69,0x57,0x43, - 0x71,0x62,0x7A,0x6A,0x61,0x48,0x4A,0x6F,0x52,0x57,0x41,0x31,0x47,0x7A,0x77, - 0x67,0x39,0x48,0x48,0x55,0x68,0x4D,0x63,0x46,0x38,0x62,0x35,0x47,0x66,0x72, - 0x51,0x42,0x31,0x34,0x68,0x5A,0x74,0x44,0x42,0x46,0x6C,0x32,0x78,0x31,0x57, - 0x65,0x4C,0x54,0x34,0x5A,0x74,0x32,0x6B,0x34,0x61,0x20,0x75,0x4A,0x30,0x59, - 0x66,0x31,0x2B,0x4E,0x33,0x71,0x70,0x56,0x4B,0x7A,0x54,0x74,0x42,0x36,0x4F, - 0x76,0x71,0x2B,0x70,0x5A,0x64,0x50,0x45,0x66,0x59,0x51,0x45,0x74,0x46,0x45, - 0x65,0x58,0x33,0x38,0x61,0x7A,0x34,0x39,0x36,0x38,0x48,0x6E,0x6F,0x42,0x32, - 0x4E,0x59,0x47,0x46,0x79,0x61,0x51,0x44,0x6C,0x35,0x70,0x62,0x45,0x4F,0x71, - 0x6C,0x38,0x62,0x5A,0x71,0x64,0x47,0x6C,0x20,0x6C,0x6E,0x41,0x4F,0x66,0x56, - 0x79,0x67,0x70,0x4C,0x35,0x68,0x41,0x48,0x6C,0x69,0x66,0x4E,0x62,0x6F,0x69, - 0x78,0x36,0x2F,0x7A,0x74,0x68,0x7A,0x6F,0x36,0x39,0x53,0x4D,0x77,0x62,0x6F, - 0x30,0x31,0x34,0x73,0x59,0x42,0x65,0x75,0x4D,0x63,0x62,0x4C,0x33,0x32,0x51, - 0x6D,0x74,0x41,0x4A,0x67,0x44,0x30,0x52,0x70,0x44,0x53,0x50,0x70,0x6E,0x34, - 0x7A,0x66,0x57,0x36,0x4D,0x50,0x20,0x72,0x64,0x6F,0x4C,0x70,0x6F,0x75,0x52, - 0x64,0x67,0x54,0x52,0x57,0x30,0x44,0x74,0x32,0x52,0x50,0x6B,0x4B,0x30,0x38, - 0x66,0x51,0x6A,0x77,0x32,0x54,0x75,0x7A,0x61,0x2F,0x47,0x36,0x48,0x49,0x72, - 0x5A,0x49,0x45,0x62,0x54,0x32,0x64,0x58,0x48,0x48,0x77,0x4C,0x37,0x78,0x46, - 0x58,0x32,0x36,0x2B,0x50,0x61,0x5A,0x31,0x2F,0x58,0x39,0x4A,0x73,0x65,0x46, - 0x56,0x67,0x41,0x2B,0x20,0x37,0x6D,0x67,0x58,0x63,0x78,0x4E,0x33,0x32,0x53, - 0x55,0x77,0x51,0x31,0x2B,0x6B,0x31,0x73,0x79,0x79,0x4D,0x62,0x49,0x4F,0x54, - 0x78,0x70,0x6E,0x76,0x77,0x70,0x4D,0x73,0x49,0x6C,0x44,0x49,0x4D,0x47,0x4A, - 0x39,0x64,0x58,0x33,0x2B,0x74,0x2F,0x47,0x4B,0x31,0x75,0x68,0x61,0x63,0x2B, - 0x4E,0x76,0x71,0x6E,0x71,0x6D,0x48,0x41,0x47,0x44,0x32,0x45,0x4A,0x49,0x37, - 0x77,0x4D,0x20,0x68,0x46,0x59,0x41,0x64,0x43,0x43,0x33,0x44,0x63,0x58,0x30, - 0x34,0x39,0x62,0x6F,0x62,0x67,0x75,0x4C,0x65,0x44,0x41,0x78,0x4D,0x71,0x4F, - 0x33,0x36,0x68,0x79,0x68,0x62,0x4A,0x57,0x6D,0x76,0x61,0x48,0x31,0x31,0x32, - 0x79,0x36,0x31,0x31,0x59,0x6E,0x78,0x6F,0x39,0x44,0x58,0x36,0x79,0x59,0x66, - 0x57,0x76,0x36,0x43,0x2F,0x54,0x55,0x32,0x50,0x72,0x55,0x53,0x36,0x39,0x44, - 0x20,0x63,0x59,0x37,0x67,0x41,0x5A,0x7A,0x44,0x69,0x49,0x34,0x4D,0x68,0x46, - 0x59,0x41,0x4F,0x6C,0x49,0x77,0x75,0x69,0x6B,0x7A,0x45,0x53,0x71,0x6A,0x6A, - 0x36,0x58,0x61,0x4F,0x4D,0x76,0x65,0x66,0x73,0x35,0x59,0x52,0x4F,0x30,0x74, - 0x4A,0x45,0x46,0x57,0x45,0x58,0x67,0x74,0x54,0x6F,0x32,0x44,0x68,0x64,0x47, - 0x37,0x31,0x42,0x4B,0x6A,0x4D,0x78,0x31,0x58,0x52,0x75,0x39,0x54,0x20,0x35, - 0x33,0x53,0x38,0x61,0x33,0x68,0x43,0x57,0x38,0x4B,0x49,0x4A,0x52,0x6D,0x49, - 0x42,0x57,0x42,0x4A,0x63,0x74,0x35,0x59,0x6C,0x79,0x35,0x31,0x48,0x78,0x77, - 0x64,0x6C,0x36,0x5A,0x7A,0x67,0x69,0x36,0x2B,0x46,0x43,0x6B,0x54,0x63,0x7A, - 0x50,0x35,0x69,0x39,0x48,0x37,0x31,0x4D,0x2B,0x6D,0x51,0x2B,0x73,0x6F,0x6A, - 0x47,0x30,0x49,0x4E,0x63,0x57,0x4A,0x69,0x6F,0x73,0x34,0x20,0x68,0x51,0x6B, - 0x4D,0x43,0x71,0x45,0x56,0x67,0x49,0x63,0x39,0x32,0x4E,0x31,0x71,0x53,0x32, - 0x73,0x6F,0x4E,0x34,0x78,0x7A,0x7A,0x58,0x67,0x37,0x52,0x32,0x38,0x42,0x4B, - 0x58,0x77,0x4A,0x7A,0x73,0x32,0x6B,0x45,0x74,0x30,0x5A,0x57,0x35,0x2B,0x36, - 0x6F,0x4B,0x4D,0x30,0x6E,0x56,0x70,0x4C,0x5A,0x6D,0x79,0x76,0x55,0x65,0x56, - 0x4C,0x61,0x31,0x52,0x52,0x2B,0x67,0x6F,0x56,0x20,0x55,0x34,0x55,0x67,0x67, - 0x63,0x45,0x67,0x74,0x41,0x4A,0x67,0x4E,0x33,0x62,0x49,0x41,0x32,0x56,0x39, - 0x39,0x2B,0x6E,0x62,0x69,0x70,0x6E,0x32,0x4C,0x57,0x43,0x4A,0x2F,0x59,0x79, - 0x2B,0x32,0x75,0x76,0x58,0x5A,0x58,0x6A,0x4A,0x56,0x77,0x48,0x4E,0x4B,0x7A, - 0x77,0x2F,0x45,0x6D,0x2B,0x4E,0x76,0x6B,0x71,0x31,0x61,0x39,0x48,0x34,0x65, - 0x7A,0x68,0x5A,0x4E,0x58,0x48,0x4E,0x20,0x66,0x6C,0x33,0x2B,0x53,0x33,0x67, - 0x48,0x74,0x64,0x35,0x57,0x6E,0x79,0x49,0x48,0x67,0x39,0x41,0x4B,0x51,0x47, - 0x31,0x32,0x56,0x68,0x73,0x2F,0x4E,0x74,0x7A,0x59,0x41,0x58,0x72,0x38,0x70, - 0x7A,0x33,0x32,0x5A,0x57,0x5A,0x48,0x70,0x79,0x36,0x46,0x6A,0x78,0x78,0x6C, - 0x35,0x68,0x76,0x57,0x6B,0x43,0x65,0x4D,0x38,0x58,0x50,0x72,0x30,0x4F,0x64, - 0x77,0x45,0x7A,0x67,0x47,0x20,0x6E,0x35,0x67,0x4A,0x38,0x71,0x6B,0x4C,0x4F, - 0x34,0x4F,0x2B,0x66,0x39,0x53,0x4E,0x6F,0x66,0x6B,0x31,0x72,0x4F,0x41,0x6E, - 0x2B,0x42,0x30,0x36,0x2B,0x41,0x45,0x47,0x67,0x39,0x41,0x4B,0x67,0x44,0x62, - 0x62,0x68,0x7A,0x5A,0x2B,0x62,0x44,0x67,0x54,0x49,0x44,0x66,0x36,0x57,0x47, - 0x70,0x71,0x48,0x4E,0x74,0x6E,0x4E,0x39,0x33,0x2F,0x71,0x74,0x64,0x49,0x35, - 0x62,0x2F,0x61,0x20,0x4C,0x2B,0x47,0x43,0x4A,0x6A,0x4F,0x32,0x5A,0x61,0x72, - 0x47,0x2B,0x37,0x6A,0x31,0x6C,0x51,0x33,0x6B,0x6B,0x72,0x46,0x6E,0x48,0x65, - 0x50,0x6C,0x2F,0x78,0x48,0x4F,0x34,0x4B,0x70,0x31,0x35,0x59,0x77,0x70,0x34, - 0x41,0x32,0x38,0x68,0x31,0x4E,0x6F,0x6F,0x61,0x4C,0x33,0x73,0x54,0x45,0x6D, - 0x74,0x76,0x4D,0x74,0x36,0x36,0x48,0x39,0x51,0x52,0x42,0x74,0x37,0x70,0x4F, - 0x33,0x20,0x6F,0x54,0x58,0x79,0x65,0x30,0x38,0x66,0x53,0x39,0x54,0x42,0x79, - 0x7A,0x33,0x6E,0x52,0x38,0x69,0x6C,0x70,0x34,0x38,0x68,0x36,0x73,0x41,0x58, - 0x6E,0x75,0x50,0x50,0x79,0x4E,0x65,0x65,0x76,0x6B,0x78,0x55,0x6E,0x68,0x36, - 0x68,0x32,0x68,0x59,0x4F,0x34,0x52,0x41,0x71,0x5A,0x38,0x74,0x51,0x30,0x4B, - 0x6E,0x59,0x4C,0x54,0x54,0x2B,0x41,0x4B,0x36,0x61,0x31,0x34,0x37,0x76,0x20, - 0x61,0x67,0x75,0x4D,0x56,0x39,0x42,0x66,0x6A,0x78,0x31,0x58,0x59,0x66,0x42, - 0x6A,0x5A,0x45,0x76,0x47,0x61,0x7A,0x30,0x35,0x46,0x4F,0x54,0x7A,0x47,0x6B, - 0x36,0x67,0x35,0x70,0x51,0x4E,0x61,0x64,0x34,0x2B,0x51,0x6E,0x73,0x44,0x71, - 0x4E,0x6C,0x53,0x35,0x32,0x31,0x72,0x67,0x71,0x78,0x4E,0x48,0x78,0x75,0x56, - 0x43,0x58,0x42,0x71,0x39,0x44,0x48,0x55,0x69,0x58,0x46,0x71,0x20,0x31,0x32, - 0x43,0x36,0x66,0x31,0x4E,0x72,0x4E,0x50,0x76,0x36,0x6E,0x57,0x4B,0x37,0x2F, - 0x32,0x33,0x55,0x63,0x79,0x58,0x42,0x64,0x47,0x48,0x4D,0x43,0x33,0x54,0x35, - 0x65,0x77,0x33,0x6D,0x54,0x46,0x62,0x52,0x72,0x4A,0x59,0x34,0x79,0x65,0x6A, - 0x4C,0x50,0x53,0x5A,0x4C,0x78,0x71,0x70,0x72,0x44,0x6C,0x50,0x34,0x41,0x63, - 0x36,0x67,0x35,0x73,0x74,0x2F,0x43,0x63,0x50,0x42,0x20,0x53,0x48,0x39,0x78, - 0x5A,0x5A,0x2F,0x2F,0x45,0x6F,0x72,0x2B,0x79,0x6F,0x79,0x50,0x4B,0x35,0x53, - 0x78,0x31,0x35,0x76,0x35,0x41,0x5A,0x48,0x31,0x31,0x33,0x38,0x32,0x2B,0x63, - 0x73,0x2F,0x6D,0x36,0x35,0x76,0x30,0x68,0x46,0x76,0x55,0x78,0x38,0x61,0x50, - 0x7A,0x4E,0x2B,0x70,0x4E,0x37,0x41,0x50,0x6C,0x39,0x64,0x34,0x39,0x4D,0x6C, - 0x34,0x2F,0x76,0x38,0x4C,0x4C,0x4D,0x58,0x20,0x2B,0x48,0x75,0x45,0x4C,0x38, - 0x55,0x4E,0x45,0x35,0x66,0x35,0x44,0x36,0x6F,0x76,0x74,0x4B,0x38,0x41,0x71, - 0x75,0x77,0x54,0x71,0x42,0x2B,0x53,0x57,0x6A,0x67,0x45,0x76,0x52,0x4B,0x4F, - 0x6A,0x55,0x63,0x43,0x70,0x46,0x36,0x51,0x53,0x2B,0x53,0x5A,0x70,0x77,0x38, - 0x70,0x36,0x70,0x4D,0x36,0x39,0x78,0x7A,0x4F,0x6B,0x63,0x38,0x38,0x66,0x52, - 0x50,0x52,0x2B,0x74,0x4C,0x63,0x20,0x42,0x5A,0x53,0x2F,0x57,0x6B,0x71,0x44, - 0x6E,0x46,0x5A,0x6A,0x66,0x56,0x79,0x6A,0x36,0x4B,0x76,0x48,0x47,0x4E,0x41, - 0x2B,0x48,0x73,0x4F,0x73,0x59,0x56,0x63,0x4D,0x72,0x61,0x39,0x71,0x2B,0x49, - 0x38,0x6E,0x64,0x34,0x30,0x4E,0x30,0x68,0x5A,0x69,0x41,0x64,0x42,0x47,0x36, - 0x33,0x65,0x41,0x78,0x4E,0x74,0x78,0x48,0x65,0x61,0x35,0x70,0x34,0x38,0x68, - 0x54,0x6E,0x47,0x71,0x20,0x37,0x37,0x45,0x2B,0x39,0x4A,0x31,0x61,0x42,0x33, - 0x52,0x49,0x44,0x42,0x31,0x48,0x65,0x64,0x4C,0x46,0x7A,0x73,0x77,0x69,0x74, - 0x57,0x35,0x64,0x37,0x68,0x4A,0x4F,0x34,0x41,0x33,0x55,0x32,0x42,0x59,0x31, - 0x77,0x67,0x46,0x55,0x75,0x79,0x33,0x6B,0x54,0x61,0x43,0x4B,0x64,0x70,0x74, - 0x78,0x74,0x2F,0x56,0x38,0x67,0x38,0x63,0x4A,0x74,0x51,0x44,0x4D,0x79,0x4F, - 0x53,0x46,0x20,0x6C,0x30,0x32,0x48,0x72,0x4D,0x4D,0x36,0x4A,0x68,0x4B,0x63, - 0x50,0x30,0x4B,0x31,0x4C,0x58,0x52,0x51,0x6A,0x2B,0x42,0x51,0x68,0x7A,0x58, - 0x44,0x6C,0x79,0x36,0x72,0x48,0x32,0x4F,0x42,0x66,0x67,0x4A,0x66,0x41,0x2F, - 0x6D,0x7A,0x61,0x31,0x2F,0x6C,0x54,0x7A,0x45,0x56,0x4F,0x32,0x4B,0x50,0x4D, - 0x78,0x44,0x61,0x6A,0x34,0x44,0x74,0x56,0x73,0x78,0x62,0x6F,0x57,0x6C,0x54, - 0x20,0x32,0x6C,0x6B,0x6A,0x6A,0x39,0x58,0x55,0x4F,0x4E,0x61,0x62,0x68,0x6F, - 0x38,0x4D,0x78,0x56,0x35,0x59,0x76,0x33,0x38,0x54,0x75,0x63,0x75,0x58,0x59, - 0x75,0x70,0x54,0x2B,0x72,0x57,0x51,0x6E,0x30,0x4E,0x59,0x72,0x65,0x6E,0x6F, - 0x6D,0x6E,0x47,0x4C,0x4E,0x63,0x66,0x47,0x59,0x54,0x76,0x4D,0x51,0x4B,0x67, - 0x46,0x77,0x4A,0x48,0x7A,0x53,0x35,0x50,0x33,0x43,0x2F,0x54,0x4D,0x20,0x32, - 0x49,0x5A,0x57,0x64,0x53,0x6E,0x73,0x78,0x56,0x42,0x4D,0x46,0x59,0x45,0x55, - 0x76,0x68,0x52,0x54,0x4A,0x6E,0x59,0x56,0x45,0x6C,0x31,0x2B,0x39,0x31,0x4B, - 0x6E,0x5A,0x70,0x37,0x38,0x36,0x47,0x33,0x6C,0x32,0x74,0x69,0x74,0x71,0x72, - 0x77,0x4F,0x55,0x58,0x53,0x73,0x33,0x36,0x69,0x50,0x6B,0x49,0x46,0x51,0x76, - 0x77,0x49,0x6F,0x6C,0x51,0x6E,0x38,0x42,0x6C,0x50,0x59,0x20,0x6F,0x6B,0x59, - 0x34,0x67,0x47,0x72,0x48,0x67,0x75,0x4C,0x71,0x73,0x6D,0x59,0x6D,0x67,0x47, - 0x4C,0x71,0x38,0x6C,0x77,0x62,0x2B,0x7A,0x49,0x31,0x70,0x31,0x4F,0x46,0x53, - 0x36,0x32,0x46,0x2F,0x49,0x78,0x31,0x45,0x62,0x58,0x32,0x63,0x36,0x68,0x57, - 0x72,0x4F,0x45,0x43,0x33,0x73,0x49,0x53,0x52,0x76,0x77,0x68,0x47,0x51,0x69, - 0x35,0x41,0x47,0x69,0x4C,0x63,0x71,0x6A,0x4C,0x20,0x36,0x4B,0x4E,0x43,0x4F, - 0x59,0x48,0x4F,0x4E,0x77,0x34,0x73,0x4A,0x2F,0x6A,0x72,0x4B,0x67,0x49,0x4B, - 0x6F,0x38,0x73,0x30,0x68,0x31,0x2B,0x68,0x31,0x69,0x4B,0x39,0x52,0x59,0x6F, - 0x67,0x48,0x73,0x4E,0x4A,0x49,0x39,0x4D,0x38,0x67,0x77,0x72,0x4A,0x37,0x4A, - 0x6B,0x31,0x47,0x6D,0x49,0x47,0x54,0x41,0x5A,0x43,0x4C,0x77,0x42,0x4B,0x78, - 0x77,0x7A,0x71,0x55,0x39,0x53,0x48,0x20,0x4C,0x70,0x32,0x4B,0x51,0x4F,0x6B, - 0x62,0x42,0x35,0x59,0x54,0x2F,0x4E,0x31,0x41,0x58,0x65,0x53,0x68,0x6F,0x48, - 0x57,0x66,0x77,0x63,0x56,0x51,0x44,0x71,0x4F,0x66,0x74,0x35,0x32,0x42,0x55, - 0x48,0x38,0x44,0x38,0x48,0x64,0x31,0x68,0x6A,0x4C,0x33,0x44,0x63,0x69,0x36, - 0x6E,0x50,0x71,0x45,0x31,0x67,0x57,0x56,0x2F,0x46,0x4A,0x6B,0x54,0x4D,0x78, - 0x68,0x6C,0x34,0x38,0x61,0x20,0x75,0x34,0x71,0x4D,0x4C,0x71,0x7A,0x6B,0x31, - 0x32,0x4B,0x4F,0x67,0x77,0x4F,0x34,0x65,0x4B,0x32,0x6A,0x4F,0x44,0x2B,0x63, - 0x44,0x4D,0x51,0x33,0x67,0x50,0x2F,0x32,0x57,0x70,0x65,0x39,0x2B,0x45,0x2F, - 0x39,0x54,0x5A,0x71,0x6A,0x36,0x5A,0x56,0x38,0x6E,0x63,0x75,0x56,0x4D,0x57, - 0x34,0x43,0x39,0x5A,0x6F,0x75,0x57,0x61,0x6A,0x67,0x34,0x55,0x2B,0x70,0x2B, - 0x35,0x38,0x45,0x20,0x38,0x78,0x53,0x65,0x77,0x68,0x53,0x75,0x69,0x35,0x71, - 0x42,0x43,0x33,0x67,0x4A,0x48,0x59,0x79,0x49,0x47,0x64,0x67,0x6F,0x41,0x37, - 0x45,0x41,0x2F,0x4A,0x34,0x75,0x58,0x63,0x4B,0x72,0x33,0x30,0x33,0x50,0x74, - 0x42,0x4B,0x4C,0x4C,0x74,0x34,0x2F,0x58,0x73,0x39,0x48,0x35,0x41,0x54,0x6D, - 0x6E,0x73,0x32,0x4B,0x4B,0x67,0x43,0x56,0x4E,0x58,0x62,0x6F,0x47,0x62,0x59, - 0x4A,0x20,0x2F,0x41,0x54,0x54,0x68,0x6A,0x51,0x2F,0x34,0x66,0x68,0x58,0x6C, - 0x4A,0x38,0x48,0x75,0x49,0x41,0x52,0x4D,0x51,0x4D,0x76,0x7A,0x6B,0x41,0x73, - 0x41,0x4D,0x39,0x54,0x70,0x77,0x75,0x6F,0x74,0x77,0x47,0x31,0x51,0x36,0x48, - 0x47,0x30,0x51,0x46,0x55,0x47,0x78,0x45,0x7A,0x73,0x44,0x63,0x5A,0x69,0x4C, - 0x38,0x42,0x50,0x4E,0x2B,0x4B,0x43,0x70,0x4D,0x2B,0x72,0x63,0x2B,0x67,0x20, - 0x67,0x36,0x2F,0x46,0x48,0x41,0x64,0x48,0x4D,0x46,0x37,0x2B,0x31,0x32,0x59, - 0x79,0x7A,0x68,0x38,0x38,0x41,0x2F,0x45,0x4E,0x59,0x48,0x56,0x4B,0x4D,0x34, - 0x62,0x6F,0x75,0x33,0x6B,0x4F,0x4A,0x61,0x2B,0x43,0x43,0x6B,0x67,0x4A,0x39, - 0x59,0x71,0x75,0x4E,0x6C,0x35,0x38,0x6B,0x68,0x43,0x78,0x6E,0x78,0x6D,0x49, - 0x42,0x57,0x44,0x7A,0x66,0x56,0x45,0x52,0x53,0x44,0x71,0x6D,0x20,0x36,0x61, - 0x4A,0x58,0x48,0x66,0x5A,0x6F,0x69,0x68,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41, - 0x72,0x43,0x33,0x57,0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x62,0x69, - 0x62,0x77,0x44,0x6A,0x35,0x7A,0x68,0x47,0x69,0x42,0x6E,0x59,0x32,0x77,0x7A, - 0x45,0x41,0x72,0x43,0x33,0x57,0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67, - 0x5A,0x69,0x41,0x52,0x67,0x2F,0x78,0x7A,0x46,0x43,0x20,0x7A,0x4D,0x44,0x65, - 0x5A,0x69,0x41,0x57,0x67,0x4C,0x33,0x64,0x6D,0x72,0x69,0x77,0x6D,0x49,0x48, - 0x78,0x4D,0x78,0x41,0x4C,0x77,0x50,0x67,0x35,0x6A,0x68,0x46,0x69,0x42,0x76, - 0x59,0x32,0x41,0x37,0x45,0x41,0x37,0x4F,0x33,0x57,0x78,0x49,0x58,0x46,0x44, - 0x49,0x79,0x66,0x67,0x56,0x67,0x41,0x78,0x73,0x39,0x78,0x6A,0x42,0x41,0x7A, - 0x73,0x4C,0x63,0x5A,0x2B,0x44,0x2F,0x67,0x20,0x6B,0x56,0x6D,0x37,0x6B,0x69, - 0x4A,0x4A,0x36,0x67,0x41,0x41,0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72, - 0x6B,0x4A,0x67,0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C, - 0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20, - 0x3D,0x20,0x5B,0x5B,0x20,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,0x64,0x35,0x6B,0x6C,0x45,0x51,0x56,0x52, - 0x34,0x6E,0x4F,0x32,0x64,0x66,0x5A,0x42,0x63,0x31,0x58,0x6E,0x6D,0x66,0x37, - 0x64,0x37,0x20,0x50,0x71,0x55,0x5A,0x7A,0x57,0x6A,0x30,0x4D,0x66,0x70,0x41, - 0x51,0x69,0x4E,0x45,0x4A,0x41,0x47,0x79,0x51,0x4D,0x45,0x73,0x77,0x6F,0x41, - 0x4D,0x43,0x56,0x35,0x69,0x78,0x53,0x6E,0x6A,0x73,0x47,0x56,0x58,0x4A,0x62, - 0x76,0x72,0x4C,0x55,0x78,0x43,0x63,0x4A,0x6D,0x74,0x70,0x4C,0x4C,0x6C,0x53, - 0x72,0x41,0x68,0x41,0x64,0x74,0x4A,0x4F,0x61,0x6D,0x34,0x6A,0x41,0x74,0x77, - 0x20,0x58,0x48,0x61,0x74,0x64,0x31,0x31,0x4F,0x78,0x52,0x56,0x32,0x6C,0x58, - 0x56,0x46,0x57,0x44,0x5A,0x6C,0x73,0x41,0x4F,0x78,0x4D,0x49,0x73,0x52,0x57, - 0x42,0x69,0x51,0x73,0x4E,0x43,0x33,0x72,0x4E,0x46,0x49,0x6F,0x35,0x6E,0x52, - 0x6A,0x4F,0x61,0x7A,0x37,0x38,0x30,0x66,0x70,0x78,0x76,0x64,0x61,0x63,0x31, - 0x6F,0x7A,0x72,0x6C,0x39,0x75,0x2F,0x74,0x32,0x33,0x2B,0x64,0x58,0x20,0x64, - 0x59,0x76,0x70,0x34,0x66,0x53,0x64,0x6F,0x2B,0x37,0x7A,0x50,0x50,0x63,0x39, - 0x35,0x37,0x7A,0x6E,0x48,0x43,0x38,0x49,0x41,0x6F,0x51,0x51,0x36,0x53,0x52, - 0x54,0x37,0x51,0x6F,0x49,0x49,0x61,0x71,0x48,0x44,0x45,0x43,0x49,0x46,0x43, - 0x4D,0x44,0x45,0x43,0x4C,0x46,0x79,0x41,0x43,0x45,0x53,0x44,0x45,0x79,0x41, - 0x43,0x46,0x53,0x6A,0x41,0x78,0x41,0x69,0x42,0x51,0x6A,0x20,0x41,0x78,0x41, - 0x69,0x78,0x63,0x67,0x41,0x68,0x45,0x67,0x78,0x44,0x61,0x58,0x65,0x34,0x49, - 0x6C,0x58,0x78,0x75,0x4F,0x6F,0x68,0x78,0x41,0x69,0x41,0x76,0x64,0x76,0x61, - 0x53,0x37,0x70,0x2F,0x59,0x6F,0x41,0x68,0x45,0x67,0x78,0x4A,0x55,0x63,0x41, - 0x6F,0x71,0x62,0x78,0x5A,0x76,0x6D,0x39,0x38,0x73,0x4E,0x54,0x67,0x67,0x79, - 0x67,0x2F,0x70,0x67,0x48,0x58,0x41,0x56,0x73,0x20,0x41,0x6A,0x72,0x79,0x50, - 0x77,0x4F,0x73,0x42,0x70,0x61,0x45,0x79,0x71,0x30,0x48,0x35,0x73,0x39,0x79, - 0x6A,0x78,0x46,0x67,0x58,0x2B,0x68,0x31,0x48,0x33,0x41,0x6B,0x2F,0x2F,0x4D, - 0x62,0x77,0x43,0x43,0x77,0x4E,0x2F,0x2F,0x7A,0x2B,0x56,0x68,0x71,0x4C,0x61, - 0x71,0x43,0x44,0x4B,0x41,0x32,0x38,0x59,0x42,0x31,0x6F,0x57,0x73,0x54,0x52, - 0x75,0x67,0x39,0x77,0x49,0x6F,0x59,0x20,0x37,0x6A,0x38,0x66,0x32,0x47,0x4A, - 0x5A,0x39,0x67,0x52,0x77,0x45,0x47,0x4D,0x47,0x65,0x34,0x46,0x66,0x68,0x69, - 0x35,0x46,0x45,0x67,0x6C,0x48,0x42,0x6C,0x41,0x62,0x58,0x41,0x6C,0x73,0x42, - 0x57,0x34,0x47,0x62,0x67,0x41,0x32,0x56,0x37,0x63,0x36,0x30,0x31,0x69,0x52, - 0x76,0x39,0x34,0x33,0x77,0x2F,0x39,0x37,0x44,0x58,0x67,0x4A,0x65,0x41,0x48, - 0x59,0x44,0x62,0x78,0x64,0x20,0x77,0x58,0x6F,0x4A,0x43,0x32,0x51,0x41,0x79, - 0x65,0x51,0x47,0x34,0x42,0x61,0x4D,0x34,0x47,0x38,0x47,0x46,0x6C,0x65,0x33, - 0x4F,0x70,0x48,0x5A,0x6E,0x4C,0x2F,0x75,0x7A,0x62,0x38,0x2B,0x6A,0x54,0x47, - 0x43,0x46,0x34,0x44,0x6E,0x38,0x7A,0x2B,0x4C,0x4B,0x69,0x49,0x44,0x53,0x41, - 0x61,0x62,0x67,0x4F,0x33,0x41,0x48,0x52,0x6A,0x42,0x4E,0x31,0x57,0x33,0x4F, - 0x6D,0x56,0x6A,0x20,0x4D,0x66,0x43,0x68,0x2F,0x41,0x57,0x51,0x77,0x35,0x6A, - 0x42,0x4C,0x6D,0x41,0x6E,0x70,0x67,0x73,0x68,0x4B,0x6F,0x67,0x4D,0x6F,0x44, - 0x70,0x30,0x59,0x63,0x52,0x2B,0x4F,0x33,0x41,0x58,0x30,0x77,0x66,0x6E,0x30, - 0x6B,0x51,0x57,0x32,0x4A,0x61,0x2F,0x2F,0x67,0x6F,0x7A,0x32,0x4C,0x67,0x44, - 0x65,0x42,0x5A,0x34,0x42,0x75,0x69,0x76,0x58,0x74,0x58,0x53,0x67,0x51,0x79, - 0x67,0x20,0x73,0x6E,0x77,0x55,0x75,0x44,0x74,0x2F,0x69,0x59,0x74,0x5A,0x41, - 0x76,0x78,0x42,0x2F,0x67,0x4A,0x34,0x4B,0x6E,0x2F,0x4A,0x44,0x4D,0x71,0x45, - 0x44,0x4B,0x44,0x38,0x33,0x41,0x6E,0x63,0x67,0x33,0x6E,0x53,0x5A,0x36,0x74, - 0x63,0x6C,0x31,0x6F,0x6A,0x62,0x4A,0x5A,0x50,0x41,0x64,0x2F,0x41,0x64,0x42, - 0x64,0x45,0x54,0x4D,0x67,0x41,0x79,0x6B,0x4D,0x50,0x38,0x48,0x47,0x4D,0x20, - 0x38,0x46,0x64,0x57,0x74,0x79,0x70,0x31,0x51,0x38,0x45,0x4D,0x6A,0x6D,0x4F, - 0x4D,0x34,0x4A,0x75,0x59,0x36,0x55,0x64,0x52,0x41,0x6C,0x55,0x33,0x67,0x47, - 0x2B,0x38,0x31,0x56,0x6A,0x74,0x4B,0x70,0x54,0x45,0x50,0x52,0x73,0x6D,0x77, - 0x79,0x38,0x2F,0x43,0x4E,0x79,0x50,0x47,0x64,0x41,0x54,0x35,0x57,0x45,0x6C, - 0x38,0x46,0x44,0x2B,0x32,0x67,0x6B,0x38,0x41,0x54,0x78,0x64,0x20,0x2B,0x4A, - 0x2B,0x31,0x31,0x70,0x36,0x4B,0x32,0x6B,0x2F,0x46,0x71,0x62,0x6F,0x42,0x31, - 0x43,0x49,0x7A,0x66,0x47,0x6E,0x33,0x59,0x59,0x53,0x2F,0x71,0x66,0x4B,0x31, - 0x6D,0x55,0x34,0x75,0x67,0x4C,0x50,0x6A,0x48,0x6D,0x66,0x48,0x50,0x53,0x5A, - 0x38,0x47,0x42,0x67,0x33,0x32,0x62,0x37,0x44,0x6B,0x78,0x35,0x6A,0x75,0x51, - 0x76,0x6C,0x42,0x69,0x63,0x38,0x4A,0x76,0x32,0x5A,0x20,0x37,0x39,0x47,0x59, - 0x67,0x59,0x36,0x6D,0x43,0x7A,0x6B,0x38,0x4C,0x56,0x6C,0x6F,0x61,0x7A,0x53, - 0x76,0x4F,0x35,0x73,0x44,0x6D,0x6A,0x4B,0x77,0x73,0x44,0x6C,0x67,0x59,0x58, - 0x4E,0x41,0x64,0x72,0x5A,0x6B,0x34,0x73,0x71,0x77,0x50,0x58,0x2F,0x74,0x78, - 0x52,0x6A,0x42,0x56,0x38,0x50,0x66,0x54,0x61,0x32,0x5A,0x51,0x54,0x57,0x51, - 0x41,0x54,0x68,0x51,0x4A,0x50,0x77,0x75,0x20,0x34,0x4A,0x4D,0x59,0x34,0x53, - 0x2B,0x72,0x64,0x46,0x32,0x47,0x4A,0x6A,0x79,0x47,0x4A,0x73,0x31,0x2F,0x43, - 0x34,0x49,0x2F,0x4E,0x77,0x6E,0x6E,0x70,0x30,0x70,0x58,0x35,0x4B,0x51,0x50, - 0x70,0x38,0x65,0x4B,0x37,0x7A,0x50,0x7A,0x66,0x65,0x63,0x31,0x42,0x4C,0x51, - 0x33,0x58,0x6A,0x43,0x45,0x42,0x55,0x30,0x42,0x43,0x78,0x70,0x68,0x51,0x56, - 0x4E,0x46,0x6B,0x77,0x41,0x33,0x20,0x41,0x55,0x38,0x43,0x44,0x32,0x4F,0x4D, - 0x34,0x48,0x47,0x67,0x76,0x2F,0x42,0x39,0x79,0x51,0x68,0x6D,0x52,0x77,0x5A, - 0x67,0x53,0x55,0x6A,0x38,0x6A,0x63,0x43,0x44,0x6D,0x4D,0x5A,0x57,0x45,0x59, - 0x59,0x6D,0x50,0x45,0x36,0x4E,0x65,0x76,0x53,0x4F,0x65,0x76,0x53,0x4E,0x65, - 0x5A,0x79,0x35,0x53,0x4A,0x7A,0x56,0x34,0x2F,0x79,0x55,0x78,0x2F,0x6B,0x70, - 0x36,0x42,0x32,0x39,0x20,0x75,0x45,0x36,0x4C,0x57,0x67,0x4B,0x57,0x74,0x41, - 0x52,0x30,0x74,0x77,0x59,0x73,0x62,0x51,0x30,0x71,0x59,0x51,0x72,0x4C,0x67, - 0x45,0x66,0x79,0x31,0x31,0x38,0x43,0x6E,0x77,0x63,0x6D,0x37,0x39,0x6B,0x77, - 0x4B,0x52,0x4F,0x59,0x42,0x52,0x6E,0x41,0x48,0x42,0x51,0x39,0x39,0x66,0x38, - 0x63,0x38,0x38,0x51,0x76,0x36,0x38,0x44,0x65,0x38,0x4B,0x54,0x48,0x30,0x52, - 0x47,0x50,0x20,0x34,0x79,0x4D,0x65,0x76,0x65,0x63,0x7A,0x30,0x30,0x4C,0x33, - 0x57,0x75,0x4A,0x4D,0x33,0x71,0x7A,0x65,0x47,0x6A,0x43,0x76,0x57,0x37,0x4B, - 0x77,0x74,0x4E,0x58,0x6E,0x73,0x72,0x61,0x41,0x56,0x66,0x4F,0x44,0x64,0x37, - 0x73,0x56,0x5A,0x65,0x4A,0x68,0x34,0x42,0x4F,0x59,0x69,0x4F,0x41,0x4C,0x69, - 0x67,0x5A,0x6D,0x52,0x67,0x59,0x77,0x43,0x30,0x58,0x43,0x66,0x77,0x41,0x6A, - 0x20,0x2F,0x50,0x58,0x6C,0x2B,0x46,0x73,0x42,0x63,0x48,0x7A,0x45,0x34,0x38, - 0x52,0x49,0x68,0x73,0x50,0x44,0x48,0x6B,0x4D,0x54,0x79,0x58,0x6E,0x43,0x78, - 0x38,0x6C,0x59,0x44,0x6F,0x34,0x4D,0x5A,0x7A,0x67,0x79,0x62,0x46,0x34,0x76, - 0x61,0x41,0x71,0x34,0x76,0x43,0x31,0x67,0x78,0x58,0x79,0x66,0x6C,0x66,0x4F, - 0x44,0x57,0x64,0x63,0x6D,0x6C,0x38,0x42,0x4B,0x54,0x42,0x54,0x77,0x20,0x58, - 0x7A,0x42,0x47,0x38,0x4A,0x69,0x4D,0x59,0x44,0x6F,0x79,0x67,0x43,0x49,0x71, - 0x4F,0x61,0x70,0x2F,0x62,0x4D,0x54,0x6A,0x34,0x4C,0x6B,0x4D,0x68,0x38,0x39, - 0x6C,0x47,0x4B,0x2F,0x52,0x70,0x33,0x77,0x70,0x44,0x45,0x31,0x34,0x37,0x4F, - 0x33,0x33,0x32,0x4E,0x75,0x66,0x6F,0x54,0x6B,0x4C,0x6C,0x37,0x66,0x37,0x39, - 0x4C,0x53,0x58,0x78,0x51,0x7A,0x57,0x41,0x31,0x38,0x47,0x20,0x50,0x6B,0x42, - 0x2B,0x31,0x6B,0x42,0x47,0x59,0x4A,0x41,0x42,0x68,0x41,0x69,0x4A,0x66,0x77, - 0x32,0x6D,0x6E,0x2F,0x2B,0x4A,0x75,0x50,0x2F,0x47,0x71,0x56,0x47,0x50,0x66, - 0x59,0x50,0x70,0x46,0x66,0x31,0x73,0x6A,0x4F,0x64,0x67,0x2F,0x30,0x43,0x47, - 0x2F,0x51,0x4D,0x58,0x7A,0x47,0x42,0x39,0x68,0x38,0x2F,0x53,0x31,0x6C,0x69, - 0x37,0x43,0x59,0x56,0x5A,0x67,0x36,0x39,0x6A,0x20,0x49,0x6F,0x4E,0x44,0x61, - 0x52,0x38,0x66,0x6B,0x41,0x46,0x77,0x30,0x56,0x50,0x2F,0x73,0x35,0x68,0x42, - 0x70,0x4E,0x67,0x59,0x7A,0x38,0x48,0x62,0x67,0x78,0x6E,0x32,0x44,0x57,0x62, - 0x65,0x6E,0x5A,0x59,0x54,0x73,0x78,0x4D,0x32,0x67,0x38,0x37,0x6D,0x67,0x50, - 0x55,0x64,0x50,0x6C,0x64,0x32,0x2B,0x44,0x54,0x48,0x6C,0x30,0x66,0x35,0x69, - 0x66,0x7A,0x31,0x45,0x50,0x42,0x6F,0x20,0x6D,0x71,0x4F,0x42,0x31,0x4F,0x38, - 0x4A,0x47,0x42,0x4C,0x2F,0x65,0x34,0x48,0x76,0x45,0x61,0x50,0x34,0x2B,0x38, - 0x59,0x38,0x66,0x6E,0x51,0x69,0x79,0x7A,0x2F,0x38,0x73,0x70,0x47,0x66,0x6E, - 0x73,0x70,0x4B,0x2F,0x42,0x45,0x59,0x47,0x50,0x66,0x34,0x36,0x53,0x6E,0x7A, - 0x47,0x66,0x37,0x6F,0x52,0x4A,0x61,0x2B,0x65,0x47,0x64,0x41,0x48,0x73,0x46, - 0x38,0x35,0x2B,0x2B,0x46,0x20,0x36,0x69,0x66,0x6C,0x56,0x49,0x50,0x55,0x52, - 0x67,0x42,0x46,0x58,0x2F,0x61,0x6A,0x77,0x47,0x66,0x69,0x75,0x76,0x65,0x52, - 0x34,0x51,0x77,0x2F,0x50,0x35,0x4F,0x5A,0x63,0x57,0x70,0x4D,0x52,0x4D,0x4D, - 0x50,0x34,0x4D,0x42,0x51,0x68,0x67,0x4E,0x44,0x47,0x62,0x70,0x62,0x41,0x39, - 0x36,0x7A,0x79,0x47,0x64,0x31,0x32,0x79,0x79,0x5A,0x54,0x47,0x37,0x63,0x6D, - 0x62,0x38,0x2B,0x20,0x42,0x33,0x77,0x32,0x62,0x64,0x46,0x41,0x4B,0x69,0x4F, - 0x41,0x6B,0x50,0x6A,0x58,0x59,0x35,0x61,0x65,0x6C,0x69,0x7A,0x2B,0x41,0x42, - 0x4F,0x32,0x50,0x76,0x56,0x4F,0x41,0x38,0x38,0x63,0x79,0x30,0x72,0x38,0x5A, - 0x61,0x52,0x33,0x31,0x4F,0x4F,0x5A,0x59,0x31,0x6D,0x65,0x65,0x71,0x65,0x42, - 0x2F,0x51,0x4F,0x5A,0x75,0x50,0x59,0x64,0x2B,0x77,0x79,0x6D,0x4C,0x61,0x79, - 0x48,0x20,0x39,0x45,0x51,0x44,0x71,0x54,0x4F,0x41,0x30,0x42,0x66,0x37,0x2B, - 0x35,0x67,0x74,0x71,0x32,0x34,0x72,0x39,0x5A,0x35,0x76,0x44,0x78,0x72,0x68, - 0x50,0x33,0x38,0x79,0x79,0x32,0x43,0x64,0x54,0x75,0x45,0x6C,0x6B,0x63,0x45, - 0x4A,0x6A,0x2B,0x64,0x50,0x47,0x69,0x4E,0x34,0x65,0x7A,0x43,0x57,0x70,0x6E, - 0x77,0x62,0x70,0x6B,0x33,0x38,0x50,0x71,0x54,0x44,0x42,0x46,0x4C,0x54,0x20, - 0x42,0x53,0x6A,0x36,0x4D,0x70,0x2F,0x45,0x35,0x4F,0x2B,0x58,0x78,0x44,0x74, - 0x44,0x47,0x66,0x61,0x63,0x30,0x63,0x42,0x65,0x74,0x52,0x6D,0x61,0x38,0x50, - 0x6A,0x58,0x58,0x32,0x58,0x35,0x65,0x58,0x2B,0x47,0x36,0x78,0x62,0x35,0x72, - 0x46,0x31,0x51,0x55,0x74,0x65,0x67,0x47,0x66,0x67,0x57,0x5A,0x6F,0x2F,0x44, - 0x50,0x36,0x72,0x33,0x4C,0x6B,0x45,0x71,0x49,0x6F,0x43,0x51,0x20,0x2B,0x44, - 0x64,0x6A,0x48,0x4C,0x34,0x6B,0x38,0x66,0x65,0x4E,0x65,0x58,0x7A,0x33,0x55, - 0x41,0x50,0x50,0x6E,0x64,0x44,0x41,0x58,0x70,0x49,0x59,0x47,0x50,0x64,0x34, - 0x37,0x6B,0x53,0x57,0x37,0x78,0x35,0x71,0x69,0x47,0x4F,0x77,0x38,0x44,0x35, - 0x4D,0x57,0x39,0x6B,0x4D,0x39,0x52,0x73,0x4E,0x31,0x48,0x55,0x45,0x55,0x50, - 0x53,0x6C,0x2F,0x56,0x66,0x67,0x66,0x7A,0x4C,0x37,0x20,0x59,0x52,0x68,0x7A, - 0x4D,0x6A,0x7A,0x70,0x38,0x58,0x4B,0x66,0x47,0x59,0x67,0x53,0x79,0x61,0x56, - 0x67,0x30,0x46,0x63,0x73,0x38,0x4C,0x6C,0x2B,0x69,0x56,0x39,0x4B,0x79,0x76, - 0x46,0x37,0x67,0x44,0x33,0x41,0x66,0x77,0x50,0x2B,0x56,0x7A,0x31,0x47,0x41, - 0x33,0x58,0x62,0x6B,0x6B,0x50,0x69,0x7A,0x77,0x4A,0x66,0x77,0x32,0x77,0x67, - 0x45,0x55,0x6E,0x38,0x66,0x67,0x43,0x76,0x20,0x6E,0x6A,0x48,0x39,0x66,0x49, - 0x6D,0x2F,0x64,0x6A,0x67,0x77,0x5A,0x4C,0x36,0x7A,0x56,0x38,0x39,0x6B,0x38, - 0x4B,0x4F,0x50,0x46,0x48,0x71,0x59,0x74,0x76,0x4D,0x31,0x38,0x6A,0x73,0x36, - 0x31,0x56,0x4D,0x30,0x55,0x4A,0x65,0x74,0x4F,0x66,0x51,0x46,0x58,0x59,0x73, - 0x4A,0x34,0x2B,0x36,0x64,0x76,0x66,0x53,0x6C,0x36,0x52,0x76,0x7A,0x32,0x48, - 0x47,0x6F,0x67,0x5A,0x2F,0x31,0x20,0x5A,0x63,0x6E,0x70,0x6D,0x49,0x75,0x61, - 0x49,0x78,0x66,0x41,0x7A,0x2F,0x71,0x79,0x37,0x43,0x69,0x39,0x57,0x33,0x41, - 0x76,0x70,0x69,0x31,0x64,0x43,0x2F,0x56,0x6A,0x41,0x6E,0x56,0x6E,0x41,0x4B, - 0x45,0x76,0x35,0x73,0x4F,0x59,0x38,0x4F,0x33,0x71,0x4B,0x50,0x65,0x5A,0x39, - 0x4F,0x48,0x46,0x58,0x74,0x4F,0x66,0x56,0x44,0x2B,0x2F,0x39,0x68,0x6B,0x59, - 0x4E,0x39,0x32,0x43,0x20,0x46,0x33,0x75,0x7A,0x73,0x32,0x36,0x45,0x59,0x73, - 0x48,0x56,0x6D,0x44,0x62,0x31,0x59,0x61,0x67,0x50,0x45,0x36,0x67,0x72,0x41, - 0x77,0x68,0x39,0x49,0x51,0x39,0x67,0x74,0x70,0x65,0x4F,0x52,0x4F,0x2B,0x6F, - 0x78,0x34,0x36,0x44,0x44,0x66,0x7A,0x69,0x62,0x46,0x31,0x39,0x50,0x41,0x4C, - 0x34,0x78,0x64,0x6B,0x4D,0x4F,0x77,0x34,0x32,0x6C,0x4A,0x71,0x6E,0x73,0x51, - 0x50,0x54,0x20,0x78,0x6D,0x72,0x65,0x42,0x4F,0x70,0x69,0x45,0x4C,0x44,0x6F, - 0x53,0x33,0x67,0x4D,0x2B,0x46,0x54,0x55,0x65,0x37,0x31,0x32,0x4A,0x73,0x50, - 0x50,0x2B,0x72,0x49,0x36,0x31,0x4B,0x36,0x4F,0x4F,0x54,0x66,0x70,0x73,0x66, - 0x4E,0x77,0x41,0x37,0x2B,0x2B,0x4A,0x4D,0x66,0x6D,0x52,0x5A,0x48,0x44,0x67, - 0x53,0x39,0x6A,0x7A,0x6D,0x56,0x38,0x6F,0x4A,0x59,0x48,0x42,0x32,0x76,0x2B, - 0x20,0x45,0x52,0x63,0x53,0x2F,0x79,0x72,0x67,0x58,0x34,0x67,0x6F,0x2F,0x72, - 0x45,0x63,0x66,0x50,0x39,0x6F,0x41,0x79,0x39,0x4C,0x2F,0x4B,0x6B,0x67,0x41, - 0x46,0x37,0x75,0x79,0x2F,0x4C,0x39,0x6F,0x77,0x32,0x6C,0x62,0x4C,0x6A,0x79, - 0x4B,0x55,0x79,0x62,0x57,0x77,0x57,0x31,0x47,0x51,0x33,0x55,0x74,0x41,0x45, - 0x55,0x4C,0x64,0x2F,0x39,0x4E,0x68,0x48,0x58,0x37,0x52,0x64,0x43,0x20,0x2F, - 0x6D,0x4D,0x6A,0x36,0x75,0x75,0x6E,0x6A,0x57,0x4D,0x6A,0x58,0x71,0x6C,0x64, - 0x67,0x75,0x33,0x41,0x50,0x32,0x4C,0x61,0x59,0x4D,0x32,0x5A,0x51,0x4D,0x30, - 0x61,0x51,0x4F,0x69,0x44,0x76,0x67,0x4C,0x34,0x4A,0x38,0x78,0x68,0x6D,0x73, - 0x37,0x73,0x4F,0x5A,0x31,0x68,0x35,0x2B,0x47,0x47,0x57,0x44,0x62,0x54,0x46, - 0x4C,0x58,0x4A,0x2B,0x53,0x6E,0x54,0x4A,0x64,0x68,0x7A,0x20,0x4F,0x72,0x49, - 0x63,0x62,0x73,0x4B,0x30,0x77,0x53,0x75,0x67,0x74,0x6B,0x79,0x67,0x4A,0x67, - 0x32,0x67,0x53,0x50,0x7A,0x2F,0x41,0x6C,0x7A,0x76,0x65,0x6F,0x2B,0x78,0x48, - 0x4F,0x77,0x36,0x32,0x73,0x41,0x72,0x70,0x78,0x58,0x79,0x43,0x39,0x4D,0x6C, - 0x65,0x4F,0x56,0x30,0x6C,0x6C,0x33,0x52,0x75,0x77,0x54,0x58,0x59,0x39,0x70, - 0x69,0x54,0x5A,0x6C,0x41,0x7A,0x52,0x6C,0x41,0x20,0x6B,0x66,0x68,0x2F,0x41, - 0x47,0x78,0x77,0x76,0x55,0x66,0x66,0x6D,0x4D,0x66,0x2F,0x50,0x64,0x6A,0x49, - 0x63,0x59,0x58,0x38,0x6F,0x6F,0x6A,0x6A,0x49,0x36,0x5A,0x74,0x52,0x4D,0x77, - 0x5A,0x32,0x49,0x42,0x70,0x6B,0x7A,0x56,0x6A,0x41,0x6A,0x56,0x6C,0x41,0x45, - 0x56,0x39,0x2F,0x76,0x38,0x48,0x72,0x48,0x57,0x39,0x78,0x38,0x46,0x7A,0x4A, - 0x75,0x51,0x66,0x6E,0x59,0x71,0x78,0x20,0x59,0x71,0x4B,0x75,0x47,0x4A,0x32, - 0x43,0x6E,0x59,0x63,0x62,0x4F,0x48,0x67,0x75,0x6B,0x6A,0x7A,0x57,0x59,0x74, - 0x72,0x6D,0x47,0x6B,0x69,0x2B,0x43,0x64,0x53,0x4D,0x41,0x52,0x53,0x4A,0x2F, - 0x35,0x2B,0x49,0x6B,0x4F,0x44,0x7A,0x32,0x70,0x6B,0x4D,0x7A,0x78,0x35,0x58, - 0x52,0x70,0x2B,0x59,0x6D,0x31,0x77,0x41,0x7A,0x78,0x37,0x50,0x38,0x74,0x71, - 0x5A,0x53,0x42,0x4B,0x35,0x20,0x47,0x74,0x4E,0x47,0x31,0x30,0x43,0x79,0x54, - 0x61,0x42,0x6D,0x44,0x43,0x44,0x50,0x4B,0x75,0x42,0x2F,0x34,0x39,0x6A,0x6E, - 0x44,0x34,0x44,0x64,0x76,0x56,0x6C,0x65,0x37,0x74,0x50,0x68,0x76,0x4D,0x4B, - 0x4E,0x6C,0x2F,0x75,0x79,0x37,0x4F,0x36,0x4E,0x4E,0x45,0x35,0x30,0x50,0x61, - 0x61,0x74,0x72,0x6F,0x71,0x37,0x54,0x6E,0x46,0x53,0x45,0x77,0x59,0x51,0x63, - 0x74,0x41,0x6E,0x20,0x63,0x52,0x7A,0x74,0x39,0x77,0x50,0x34,0x30,0x59,0x6B, - 0x73,0x62,0x79,0x69,0x72,0x54,0x30,0x54,0x6B,0x6A,0x62,0x4D,0x5A,0x6E,0x6A, - 0x75,0x65,0x6A,0x62,0x4B,0x67,0x36,0x42,0x5A,0x4D,0x6D,0x30,0x31,0x73,0x46, - 0x4A,0x42,0x34,0x56,0x59,0x51,0x2B,0x75,0x4D,0x64,0x77,0x6E,0x4F,0x66,0x50, - 0x42,0x66,0x44,0x44,0x34,0x31,0x6E,0x65,0x30,0x51,0x6F,0x2B,0x55,0x53,0x49, - 0x48,0x20,0x7A,0x32,0x58,0x34,0x59,0x62,0x54,0x75,0x34,0x33,0x5A,0x4D,0x32, - 0x30,0x32,0x6B,0x43,0x53,0x52,0x61,0x47,0x61,0x45,0x50,0x37,0x44,0x34,0x63, - 0x4D,0x2F,0x78,0x79,0x41,0x66,0x7A,0x67,0x61,0x41,0x4E,0x48,0x68,0x68,0x50, - 0x39,0x54,0x78,0x51,0x31,0x78,0x4A,0x48,0x68,0x44,0x44,0x38,0x34,0x32,0x68, - 0x44,0x46,0x42,0x44,0x35,0x46,0x66,0x68,0x4F,0x61,0x70,0x4A,0x6C,0x41,0x20, - 0x59,0x74,0x56,0x52,0x74,0x4B,0x72,0x76,0x53,0x5A,0x66,0x33,0x35,0x67,0x4C, - 0x34,0x33,0x70,0x45,0x47,0x54,0x70,0x7A,0x58,0x4E,0x4A,0x2B,0x49,0x6C,0x78, - 0x50,0x6E,0x50,0x62,0x35,0x33,0x4A,0x4A,0x49,0x4A,0x50,0x45,0x6B,0x43,0x56, - 0x78,0x45,0x6D,0x30,0x67,0x42,0x43,0x48,0x39,0x41,0x57,0x48,0x46,0x66,0x31, - 0x2B,0x51,0x45,0x38,0x63,0x36,0x7A,0x6B,0x31,0x56,0x35,0x43,0x20,0x7A,0x49, - 0x72,0x5A,0x6C,0x62,0x67,0x68,0x79,0x70,0x6A,0x41,0x44,0x6B,0x79,0x62,0x54, - 0x6F,0x77,0x4A,0x4A,0x4E,0x49,0x41,0x38,0x71,0x7A,0x42,0x54,0x4B,0x56,0x59, - 0x34,0x2B,0x66,0x37,0x2F,0x45,0x72,0x77,0x45,0x65,0x58,0x6D,0x2B,0x49,0x6A, - 0x48,0x44,0x36,0x4D,0x4E,0x44,0x4C,0x34,0x37,0x50,0x5A,0x67,0x45,0x45,0x6D, - 0x63,0x41,0x52,0x53,0x50,0x2B,0x31,0x6F,0x6B,0x2B,0x20,0x41,0x66,0x44,0x6A, - 0x58,0x32,0x58,0x56,0x35,0x78,0x63,0x56,0x34,0x38,0x68,0x77,0x68,0x68,0x2F, - 0x2F,0x79,0x6E,0x6D,0x4B,0x63,0x43,0x30,0x4A,0x6D,0x68,0x6C,0x49,0x6C,0x46, - 0x70,0x43,0x48,0x38,0x68,0x6E,0x4D,0x61,0x65,0x31,0x57,0x4C,0x50,0x37,0x70, - 0x45,0x62,0x37,0x52,0x65,0x56,0x35,0x5A,0x79,0x6A,0x44,0x37,0x70,0x50,0x4F, - 0x2B,0x53,0x56,0x33,0x59,0x74,0x70,0x34,0x20,0x31,0x55,0x6D,0x4D,0x59,0x6B, - 0x4C,0x69,0x76,0x77,0x33,0x48,0x38,0x2F,0x6C,0x65,0x4F,0x35,0x50,0x68,0x7A, - 0x59,0x48,0x45,0x2F,0x46,0x4E,0x45,0x79,0x6E,0x68,0x7A,0x49,0x42,0x4D,0x6C, - 0x59,0x2F,0x41,0x52,0x59,0x6A,0x69,0x55,0x70,0x6C,0x53,0x53,0x70,0x70,0x6F, - 0x31,0x6D,0x48,0x58,0x39,0x31,0x68,0x77,0x5A,0x4E,0x6A,0x76,0x34,0x43,0x46, - 0x46,0x4E,0x58,0x75,0x36,0x4C,0x20,0x31,0x50,0x33,0x38,0x4E,0x6C,0x55,0x65, - 0x44,0x30,0x69,0x45,0x41,0x52,0x54,0x31,0x2B,0x35,0x66,0x62,0x76,0x71,0x39, - 0x76,0x7A,0x4F,0x50,0x5A,0x34,0x31,0x72,0x4F,0x4B,0x35,0x4C,0x42,0x73,0x38, - 0x65,0x64,0x54,0x79,0x39,0x65,0x6A,0x75,0x4D,0x55,0x64,0x39,0x78,0x55,0x33, - 0x51,0x43,0x69,0x39,0x76,0x74,0x48,0x70,0x38,0x78,0x30,0x6E,0x78,0x62,0x32, - 0x69,0x4B,0x53,0x51,0x20,0x79,0x30,0x39,0x42,0x4F,0x36,0x34,0x30,0x72,0x65, - 0x70,0x34,0x51,0x4E,0x55,0x4E,0x49,0x4D,0x38,0x31,0x4F,0x50,0x54,0x37,0x7A, - 0x58,0x53,0x66,0x6C,0x76,0x53,0x4B,0x35,0x44,0x45,0x36,0x5A,0x64,0x71,0x6D, - 0x34,0x2F,0x54,0x67,0x49,0x78,0x67,0x4E,0x56,0x4A,0x79,0x6B,0x47,0x4D,0x44, - 0x6A,0x4C,0x6F,0x56,0x66,0x4F,0x71,0x58,0x6A,0x74,0x30,0x56,0x79,0x36,0x52, - 0x33,0x31,0x20,0x2B,0x4F,0x6B,0x70,0x35,0x33,0x45,0x70,0x4A,0x77,0x33,0x45, - 0x52,0x52,0x49,0x4D,0x34,0x41,0x76,0x41,0x72,0x62,0x61,0x46,0x33,0x78,0x37, - 0x4D,0x61,0x4C,0x39,0x2B,0x6B,0x58,0x6A,0x65,0x4F,0x4A,0x74,0x78,0x50,0x62, - 0x4C,0x38,0x56,0x6F,0x77,0x57,0x4B,0x6B,0x71,0x31,0x6C,0x58,0x51,0x6A,0x38, - 0x47,0x65,0x32,0x68,0x51,0x63,0x6E,0x50,0x48,0x62,0x33,0x61,0x73,0x52,0x66, - 0x20,0x31,0x41,0x61,0x37,0x65,0x37,0x4D,0x4D,0x54,0x6A,0x68,0x46,0x71,0x6E, - 0x2B,0x47,0x30,0x55,0x54,0x46,0x71,0x4C,0x59,0x42,0x50,0x47,0x78,0x62,0x73, - 0x4C,0x43,0x75,0x76,0x34,0x52,0x6A,0x6E,0x59,0x53,0x6F,0x4B,0x4A,0x4F,0x2B, - 0x61,0x62,0x4F,0x4F,0x34,0x77,0x48,0x57,0x6D,0x6F,0x69,0x44,0x61,0x68,0x71, - 0x41,0x30,0x36,0x6A,0x2F,0x4B,0x36,0x65,0x7A,0x6E,0x43,0x37,0x39,0x20,0x7A, - 0x48,0x63,0x68,0x4B,0x73,0x72,0x70,0x4D,0x59,0x39,0x58,0x54,0x6A,0x74,0x46, - 0x72,0x52,0x57,0x64,0x46,0x61,0x69,0x57,0x41,0x61,0x7A,0x43,0x59,0x64,0x54, - 0x2F,0x78,0x48,0x6D,0x50,0x6E,0x30,0x66,0x62,0x6D,0x30,0x32,0x49,0x71,0x76, - 0x50,0x7A,0x4D,0x78,0x6E,0x58,0x70,0x65,0x6D,0x50,0x55,0x4B,0x47,0x74,0x78, - 0x4B,0x71,0x6C,0x71,0x67,0x64,0x74,0x43,0x30,0x37,0x36,0x20,0x38,0x4C,0x7A, - 0x37,0x67,0x67,0x73,0x68,0x45,0x6B,0x4F,0x41,0x61,0x63,0x4F,0x4F,0x33,0x56, - 0x64,0x72,0x6A,0x5A,0x52,0x43,0x4E,0x51,0x7A,0x67,0x67,0x38,0x41,0x66,0x32, - 0x68,0x5A,0x2B,0x75,0x53,0x2F,0x4C,0x38,0x4B,0x52,0x43,0x66,0x31,0x48,0x62, - 0x44,0x45,0x39,0x36,0x72,0x70,0x76,0x53,0x2F,0x69,0x46,0x47,0x4B,0x32,0x57, - 0x6C,0x47,0x67,0x5A,0x77,0x76,0x32,0x33,0x42,0x20,0x55,0x36,0x4D,0x65,0x62, - 0x32,0x72,0x4B,0x54,0x39,0x51,0x4A,0x62,0x35,0x37,0x4E,0x63,0x4D,0x6F,0x74, - 0x66,0x38,0x56,0x61,0x4B,0x31,0x47,0x70,0x74,0x4C,0x72,0x2B,0x46,0x4D,0x75, - 0x4E,0x50,0x66,0x30,0x41,0x6E,0x6A,0x2B,0x70,0x30,0x46,0x2F,0x55,0x44,0x77, - 0x47,0x6D,0x54,0x54,0x76,0x4D,0x43,0x6D,0x77,0x48,0x2F,0x72,0x68,0x73,0x46, - 0x61,0x4C,0x79,0x42,0x6D,0x44,0x74,0x20,0x61,0x48,0x76,0x37,0x4D,0x77,0x79, - 0x4D,0x4B,0x2F,0x51,0x58,0x39,0x63,0x58,0x41,0x75,0x4D,0x66,0x65,0x66,0x69, - 0x66,0x5A,0x6C,0x54,0x55,0x4B,0x71,0x4B,0x51,0x42,0x2F,0x44,0x6E,0x51,0x59, - 0x31,0x50,0x77,0x2F,0x4A,0x54,0x48,0x61,0x32,0x65,0x55,0x38,0x43,0x50,0x71, - 0x6B,0x39,0x66,0x4F,0x5A,0x46,0x31,0x4F,0x6F,0x31,0x36,0x48,0x30,0x55,0x35, - 0x5A,0x71,0x4A,0x51,0x42,0x20,0x64,0x41,0x47,0x66,0x74,0x79,0x33,0x38,0x30, - 0x71,0x6D,0x4D,0x45,0x6E,0x35,0x45,0x33,0x54,0x4C,0x70,0x6D,0x7A,0x62,0x75, - 0x77,0x4F,0x63,0x78,0x47,0x6F,0x71,0x64,0x53,0x68,0x6E,0x41,0x41,0x37,0x59, - 0x46,0x65,0x30,0x63,0x39,0x44,0x6D,0x68,0x72,0x4C,0x31,0x48,0x6E,0x48,0x42, - 0x6A,0x4B,0x75,0x43,0x35,0x6F,0x73,0x39,0x61,0x51,0x43,0x35,0x56,0x51,0x57, - 0x68,0x63,0x4F,0x20,0x36,0x59,0x33,0x4B,0x39,0x52,0x64,0x70,0x34,0x55,0x57, - 0x33,0x74,0x76,0x34,0x77,0x5A,0x59,0x67,0x43,0x4B,0x6D,0x45,0x41,0x39,0x39, - 0x6B,0x57,0x66,0x47,0x63,0x6F,0x77,0x78,0x6D,0x6C,0x2B,0x34,0x71,0x55,0x63, - 0x48,0x72,0x4D,0x63,0x7A,0x32,0x43,0x33,0x46,0x70,0x4C,0x74,0x6C,0x54,0x43, - 0x41,0x4B,0x78,0x47,0x4D,0x51,0x4E,0x67,0x6A,0x39,0x4A,0x39,0x52,0x63,0x70, - 0x34,0x20,0x35,0x58,0x54,0x47,0x5A,0x61,0x6F,0x37,0x39,0x68,0x6D,0x42,0x63, - 0x69,0x76,0x75,0x58,0x6D,0x43,0x6C,0x54,0x63,0x45,0x44,0x67,0x35,0x72,0x32, - 0x45,0x2B,0x6C,0x6A,0x59,0x4E,0x7A,0x6A,0x67,0x50,0x32,0x2B,0x41,0x53,0x73, - 0x78,0x6D,0x6F,0x71,0x4E,0x63,0x68,0x75,0x41,0x6E,0x76,0x35,0x43,0x7A,0x4D, - 0x47,0x65,0x4D,0x39,0x57,0x4C,0x41,0x73,0x71,0x70,0x75,0x67,0x38,0x43,0x20, - 0x31,0x39,0x6F,0x55,0x66,0x48,0x73,0x67,0x77,0x35,0x44,0x62,0x78,0x67,0x6C, - 0x43,0x31,0x41,0x31,0x44,0x45,0x78,0x35,0x76,0x32,0x35,0x39,0x72,0x63,0x53, - 0x30,0x78,0x72,0x68,0x45,0x6F,0x70,0x77,0x48,0x59,0x5A,0x2F,0x30,0x70,0x33, - 0x31,0x2B,0x6B,0x48,0x45,0x63,0x4E,0x78,0x42,0x59,0x46,0x6C,0x45,0x74,0x35, - 0x50,0x56,0x6A,0x6D,0x2F,0x42,0x38,0x5A,0x56,0x74,0x39,0x66,0x20,0x69,0x49, - 0x46,0x78,0x7A,0x2B,0x56,0x67,0x6B,0x65,0x31,0x59,0x5A,0x74,0x58,0x4F,0x52, - 0x62,0x6B,0x4D,0x34,0x44,0x2F,0x62,0x46,0x6E,0x54,0x4D,0x69,0x78,0x61,0x69, - 0x62,0x6E,0x48,0x55,0x67,0x72,0x58,0x47,0x4C,0x6B,0x57,0x35,0x31,0x48,0x65, - 0x50,0x54,0x61,0x48,0x54,0x59,0x78,0x34,0x6E,0x33,0x58,0x5A,0x4B,0x45,0x61, - 0x4A,0x75,0x4F,0x58,0x6E,0x65,0x63,0x7A,0x6C,0x5A,0x20,0x36,0x42,0x36,0x41, - 0x4A,0x31,0x34,0x5A,0x4C,0x2B,0x6C,0x76,0x6C,0x73,0x4D,0x41,0x37,0x67,0x42, - 0x57,0x32,0x78,0x52,0x38,0x58,0x55,0x39,0x2F,0x49,0x61,0x62,0x78,0x43,0x33, - 0x74,0x4E,0x72,0x4D,0x62,0x78,0x42,0x4F,0x32,0x5A,0x4B,0x49,0x63,0x43,0x72, - 0x5A,0x37,0x2B,0x34,0x7A,0x6B,0x34,0x35,0x4A,0x59,0x46,0x4A,0x55,0x54,0x64, - 0x63,0x2B,0x68,0x63,0x68,0x76,0x47,0x63,0x20,0x64,0x66,0x47,0x50,0x51,0x32, - 0x6C,0x52,0x51,0x4E,0x77,0x4B,0x37,0x41,0x49,0x2B,0x61,0x6C,0x50,0x77,0x6C, - 0x30,0x4D,0x5A,0x6E,0x65,0x73,0x6E,0x52,0x42,0x47,0x35,0x77,0x47,0x6A,0x44, - 0x6B,0x6F,0x39,0x53,0x34,0x76,0x71,0x41,0x75,0x41,0x33,0x67,0x44,0x74,0x75, - 0x43,0x2B,0x2B,0x7A,0x6E,0x50,0x59,0x56,0x49,0x46,0x59,0x37,0x61,0x73,0x4E, - 0x62,0x63,0x54,0x4D,0x53,0x74,0x20,0x77,0x72,0x74,0x74,0x43,0x76,0x57,0x4E, - 0x65,0x5A,0x7A,0x56,0x31,0x4A,0x38,0x51,0x4D,0x33,0x4A,0x32,0x33,0x48,0x50, - 0x5A,0x4F,0x2F,0x42,0x75,0x69,0x4E,0x34,0x4E,0x69,0x4E,0x4D,0x41,0x6C,0x6D, - 0x42,0x70,0x41,0x50,0x76,0x31,0x39,0x42,0x66,0x69,0x6B,0x6A,0x69,0x63,0x4B, - 0x33,0x67,0x33,0x52,0x6E,0x75,0x52,0x69,0x46,0x4F,0x4A,0x56,0x71,0x46,0x49, - 0x41,0x4B,0x35,0x4C,0x20,0x49,0x49,0x56,0x49,0x48,0x51,0x66,0x50,0x4F,0x61, - 0x30,0x50,0x69,0x4E,0x77,0x4E,0x71,0x4C,0x67,0x42,0x48,0x42,0x2F,0x78,0x58, - 0x45,0x59,0x35,0x68,0x55,0x67,0x6C,0x34,0x7A,0x6D,0x6A,0x46,0x55,0x73,0x53, - 0x59,0x51,0x43,0x33,0x32,0x78,0x54,0x53,0x30,0x31,0x38,0x49,0x4F,0x78,0x79, - 0x30,0x63,0x6A,0x74,0x45,0x47,0x77,0x65,0x49,0x53,0x34,0x32,0x62,0x73,0x45, - 0x6A,0x2B,0x20,0x38,0x51,0x4D,0x34,0x4C,0x41,0x4D,0x51,0x77,0x6F,0x72,0x44, - 0x35,0x7A,0x4B,0x32,0x5A,0x77,0x69,0x73,0x78,0x6D,0x6A,0x51,0x6D,0x62,0x6A, - 0x55,0x61,0x4C,0x58,0x77,0x52,0x2B,0x47,0x2F,0x45,0x50,0x59,0x34,0x64,0x67, - 0x4F,0x73,0x4E,0x46,0x68,0x4D,0x53,0x51,0x59,0x51,0x43,0x6A,0x6D,0x73,0x55, - 0x68,0x4B,0x50,0x6A,0x2B,0x6A,0x70,0x4C,0x34,0x51,0x4C,0x44,0x70,0x71,0x35, - 0x20,0x45,0x39,0x79,0x37,0x41,0x58,0x45,0x6F,0x73,0x67,0x76,0x59,0x5A,0x6C, - 0x50,0x51,0x38,0x59,0x68,0x6B,0x49,0x56,0x4B,0x50,0x67,0x32,0x61,0x32,0x45, - 0x53,0x45,0x72,0x4D,0x41,0x34,0x44,0x75,0x4E,0x6D,0x6D,0x30,0x50,0x43,0x6B, - 0x6B,0x6E,0x2B,0x45,0x63,0x4F,0x58,0x73,0x75,0x4F,0x64,0x79,0x4F,0x72,0x61, - 0x56,0x46,0x73,0x4E,0x55,0x7A,0x41,0x43,0x4F,0x32,0x76,0x64,0x6C,0x20,0x68, - 0x42,0x41,0x68,0x48,0x4C,0x52,0x54,0x4F,0x51,0x4D,0x49,0x39,0x54,0x56,0x75, - 0x73,0x53,0x6C,0x2F,0x62,0x46,0x67,0x47,0x49,0x45,0x51,0x55,0x48,0x4C,0x52, - 0x7A,0x43,0x37,0x69,0x4E,0x41,0x35,0x51,0x61,0x41,0x54,0x51,0x41,0x4E,0x38, - 0x35,0x56,0x4B,0x41,0x42,0x36,0x52,0x7A,0x55,0x41,0x4B,0x45,0x51,0x55,0x65, - 0x6B,0x65,0x74,0x73,0x77,0x4A,0x76,0x78,0x47,0x6A,0x53,0x20,0x6D,0x6C,0x4A, - 0x56,0x65,0x5A,0x56,0x4E,0x6F,0x59,0x46,0x78,0x54,0x66,0x38,0x4A,0x45,0x5A, - 0x58,0x78,0x48,0x43,0x37,0x37,0x5A,0x6C,0x70,0x70,0x73,0x6B,0x43,0x70,0x42, - 0x72,0x44,0x56,0x70,0x70,0x44,0x6A,0x49,0x59,0x68,0x43,0x69,0x43,0x49,0x63, - 0x4E,0x47,0x53,0x6C,0x79,0x51,0x49,0x56,0x4D,0x51,0x43,0x48,0x70,0x59,0x31, - 0x43,0x69,0x42,0x6C,0x77,0x30,0x46,0x44,0x35,0x20,0x44,0x53,0x41,0x30,0x79, - 0x48,0x43,0x44,0x54,0x58,0x6D,0x48,0x6A,0x51,0x36,0x46,0x45,0x44,0x50,0x67, - 0x6F,0x4B,0x45,0x62,0x77,0x48,0x34,0x67,0x73,0x4A,0x51,0x49,0x6F,0x42,0x6E, - 0x59,0x4F,0x46,0x63,0x68,0x50,0x34,0x42,0x42,0x7A,0x66,0x38,0x4C,0x55,0x52, - 0x4B,0x44,0x34,0x35,0x37,0x74,0x75,0x6F,0x43,0x4E,0x47,0x47,0x31,0x61,0x55, - 0x59,0x6F,0x42,0x57,0x41,0x30,0x32,0x20,0x6E,0x42,0x33,0x33,0x58,0x4E,0x59, - 0x31,0x43,0x79,0x46,0x6D,0x49,0x41,0x43,0x58,0x52,0x44,0x72,0x72,0x67,0x63, - 0x42,0x53,0x44,0x4D,0x44,0x71,0x33,0x4C,0x39,0x2B,0x50,0x66,0x32,0x46,0x69, - 0x41,0x55,0x48,0x4C,0x56,0x6C,0x70,0x45,0x30,0x6F,0x7A,0x41,0x4B,0x76,0x6C, - 0x68,0x7A,0x49,0x41,0x49,0x65,0x4C,0x42,0x51,0x55,0x76,0x57,0x53,0x34,0x50, - 0x4C,0x33,0x67,0x58,0x51,0x20,0x75,0x58,0x39,0x43,0x78,0x45,0x4D,0x35,0x63, - 0x67,0x47,0x63,0x44,0x53,0x41,0x30,0x75,0x72,0x6A,0x65,0x70,0x76,0x7A,0x67, - 0x68,0x4F,0x74,0x66,0x45,0x45,0x4C,0x4D,0x68,0x49,0x4F,0x57,0x31,0x6F,0x50, - 0x64,0x54,0x45,0x44,0x55,0x43,0x4B,0x41,0x42,0x57,0x44,0x4E,0x58,0x6F,0x51, - 0x41,0x59,0x6D,0x56,0x49,0x45,0x49,0x45,0x51,0x63,0x6A,0x45,0x78,0x5A,0x44, - 0x36,0x69,0x76,0x20,0x77,0x54,0x49,0x6C,0x4F,0x4B,0x6F,0x42,0x72,0x4C,0x51, - 0x70,0x4E,0x44,0x4A,0x70,0x50,0x58,0x55,0x68,0x68,0x4A,0x67,0x44,0x50,0x7A, - 0x43,0x61,0x73,0x73,0x52,0x4B,0x6F,0x31,0x45,0x4E,0x77,0x4F,0x70,0x73,0x38, - 0x75,0x48,0x4A,0x69,0x48,0x63,0x58,0x51,0x73,0x79,0x49,0x67,0x36,0x61,0x73, - 0x4E,0x46,0x70,0x57,0x41,0x7A,0x68,0x6E,0x37,0x31,0x5A,0x43,0x43,0x41,0x73, - 0x63,0x20,0x4E,0x46,0x56,0x57,0x41,0x37,0x41,0x36,0x2F,0x6C,0x73,0x52,0x67, - 0x42,0x44,0x78,0x34,0x71,0x41,0x70,0x4B,0x34,0x31,0x47,0x4E,0x51,0x43,0x72, - 0x76,0x63,0x66,0x47,0x63,0x34,0x6F,0x41,0x68,0x49,0x67,0x54,0x42,0x30,0x31, - 0x5A,0x61,0x62,0x53,0x73,0x67,0x34,0x44,0x6E,0x70,0x79,0x4C,0x65,0x58,0x51, - 0x67,0x78,0x49,0x77,0x36,0x61,0x4B,0x75,0x73,0x67,0x59,0x49,0x64,0x4E,0x20, - 0x6F,0x51,0x6C,0x66,0x45,0x59,0x41,0x51,0x63,0x65,0x4B,0x67,0x4B,0x53,0x75, - 0x4E,0x6C,0x72,0x6B,0x4C,0x45,0x50,0x48,0x75,0x51,0x6F,0x67,0x5A,0x63,0x64, - 0x42,0x55,0x57,0x62,0x73,0x41,0x6C,0x68,0x46,0x41,0x78,0x4C,0x73,0x4C,0x49, - 0x57,0x62,0x45,0x51,0x56,0x4E,0x6C,0x6A,0x51,0x42,0x61,0x62,0x51,0x70,0x4E, - 0x79,0x51,0x43,0x45,0x69,0x42,0x55,0x48,0x54,0x56,0x6C,0x70,0x20,0x4E,0x4B, - 0x6F,0x42,0x74,0x4E,0x6B,0x55,0x6D,0x74,0x49,0x59,0x67,0x42,0x43,0x78,0x34, - 0x71,0x41,0x70,0x4B,0x34,0x30,0x36,0x47,0x55,0x42,0x6F,0x63,0x55,0x47,0x54, - 0x54,0x66,0x6D,0x63,0x30,0x6F,0x43,0x46,0x69,0x42,0x55,0x48,0x53,0x57,0x56, - 0x68,0x37,0x67,0x56,0x42,0x55,0x53,0x49,0x41,0x44,0x32,0x69,0x78,0x4B,0x53, - 0x67,0x44,0x45,0x43,0x4A,0x65,0x4A,0x75,0x32,0x37,0x20,0x41,0x50,0x4D,0x78, - 0x57,0x72,0x30,0x6B,0x4F,0x71,0x31,0x44,0x69,0x42,0x51,0x6A,0x41,0x78,0x41, - 0x69,0x78,0x63,0x67,0x41,0x68,0x4B,0x67,0x68,0x47,0x75,0x30,0x56,0x4F,0x34, - 0x4C,0x46,0x6B,0x45,0x45,0x55,0x41,0x77,0x69,0x41,0x4D,0x5A,0x75,0x43,0x57, - 0x55,0x30,0x43,0x43,0x42,0x45,0x72,0x44,0x70,0x4C,0x4B,0x41,0x64,0x79,0x2F, - 0x35,0x64,0x49,0x37,0x68,0x44,0x73,0x5A,0x20,0x51,0x4F,0x68,0x6D,0x56,0x70, - 0x73,0x54,0x79,0x51,0x43,0x45,0x69,0x4A,0x65,0x4D,0x76,0x61,0x61,0x73,0x4E, - 0x42,0x71,0x31,0x43,0x7A,0x42,0x73,0x55,0x36,0x67,0x68,0x6F,0x32,0x6B,0x41, - 0x49,0x65,0x4C,0x45,0x51,0x56,0x4F,0x6A,0x4E,0x6F,0x57,0x69,0x47,0x6F,0x44, - 0x56,0x7A,0x52,0x73,0x30,0x77,0x69,0x42,0x45,0x72,0x43,0x51,0x6C,0x41,0x68, - 0x69,0x30,0x4B,0x64,0x51,0x6B,0x20,0x41,0x78,0x41,0x69,0x56,0x68,0x77,0x30, - 0x5A,0x61,0x58,0x52,0x71,0x42,0x4C,0x74,0x74,0x79,0x6E,0x55,0x6E,0x49,0x31, - 0x34,0x64,0x79,0x48,0x45,0x6A,0x44,0x68,0x6F,0x79,0x6B,0x71,0x6A,0x5A,0x59, - 0x34,0x41,0x4E,0x41,0x59,0x67,0x52,0x4A,0x77,0x34,0x61,0x4B,0x71,0x73,0x45, - 0x63,0x42,0x78,0x6D,0x30,0x4C,0x7A,0x72,0x48,0x59,0x6D,0x46,0x30,0x4C,0x59, - 0x30,0x6D,0x71,0x76,0x20,0x71,0x5A,0x4D,0x32,0x68,0x63,0x72,0x63,0x42,0x56, - 0x41,0x45,0x49,0x45,0x53,0x63,0x74,0x4E,0x68,0x72,0x71,0x73,0x2B,0x6D,0x55, - 0x46,0x51,0x44,0x4F,0x47,0x4A,0x54,0x71,0x4B,0x30,0x78,0x34,0x74,0x32,0x46, - 0x45,0x44,0x50,0x69,0x6F,0x43,0x6B,0x72,0x6A,0x55,0x59,0x31,0x67,0x49,0x4D, - 0x32,0x68,0x64,0x6F,0x62,0x46,0x51,0x45,0x49,0x45,0x53,0x63,0x4F,0x6D,0x72, - 0x4C,0x53,0x20,0x61,0x46,0x6B,0x6A,0x67,0x50,0x6D,0x4B,0x41,0x49,0x53,0x49, - 0x46,0x51,0x64,0x4E,0x6C,0x54,0x55,0x43,0x73,0x4F,0x77,0x43,0x42,0x43,0x36, - 0x35,0x79,0x30,0x4B,0x49,0x53,0x35,0x44,0x78,0x6A,0x4B,0x59,0x73,0x4B,0x61, - 0x73,0x42,0x54,0x41,0x47,0x48,0x35,0x69,0x72,0x6B,0x34,0x56,0x52,0x68,0x49, - 0x63,0x51,0x6C,0x6D,0x4E,0x39,0x67,0x2F,0x55,0x41,0x39,0x68,0x4E,0x48,0x6F, - 0x20,0x6E,0x44,0x67,0x62,0x51,0x47,0x68,0x42,0x30,0x44,0x36,0x62,0x38,0x68, - 0x31,0x57,0x6D,0x34,0x63,0x4A,0x49,0x65,0x62,0x43,0x51,0x55,0x76,0x37,0x59, - 0x4F,0x36,0x56,0x67,0x46,0x44,0x61,0x66,0x67,0x42,0x76,0x32,0x42,0x54,0x71, - 0x62,0x46,0x59,0x45,0x49,0x45,0x51,0x63,0x4F,0x47,0x6A,0x4A,0x53,0x70,0x74, - 0x51,0x6D,0x67,0x48,0x73,0x74,0x53,0x6E,0x55,0x4A,0x51,0x4D,0x51,0x20,0x49, - 0x68,0x59,0x63,0x74,0x47,0x53,0x6C,0x54,0x61,0x69,0x41,0x41,0x53,0x79,0x55, - 0x41,0x51,0x67,0x52,0x43,0x77,0x35,0x61,0x71,0x6F,0x67,0x42,0x57,0x49,0x55, - 0x5A,0x43,0x35,0x73,0x31,0x45,0x79,0x42,0x45,0x71,0x58,0x67,0x6B,0x4C,0x77, - 0x49,0x34,0x44,0x37,0x77,0x35,0x56,0x36,0x47,0x73,0x42,0x78,0x32,0x4B,0x41, - 0x6F,0x51,0x6F,0x69,0x59,0x37,0x6D,0x77,0x48,0x59,0x76,0x20,0x67,0x44,0x65, - 0x42,0x53,0x78,0x38,0x47,0x45,0x43,0x4B,0x53,0x41,0x59,0x52,0x47,0x46,0x31, - 0x2B,0x79,0x4B,0x62,0x2B,0x6B,0x52,0x51,0x59,0x67,0x52,0x43,0x6B,0x34,0x61, - 0x4F,0x67,0x6C,0x73,0x4A,0x73,0x42,0x67,0x4E,0x4A,0x33,0x42,0x64,0x35,0x74, - 0x55,0x32,0x68,0x70,0x71,0x77,0x78,0x41,0x69,0x46,0x4A,0x77,0x30,0x4A,0x43, - 0x56,0x4A,0x67,0x74,0x55,0x78,0x41,0x43,0x36,0x20,0x5A,0x51,0x42,0x43,0x6C, - 0x49,0x53,0x44,0x68,0x69,0x70,0x71,0x41,0x4E,0x61,0x35,0x41,0x4E,0x6F,0x64, - 0x53,0x49,0x68,0x6F,0x4E,0x47,0x66,0x4C,0x6B,0x77,0x4D,0x41,0x70,0x52,0x76, - 0x41,0x46,0x50,0x44,0x69,0x58,0x49,0x55,0x38,0x6F,0x4C,0x74,0x56,0x5A,0x34, - 0x55,0x4C,0x45,0x59,0x58,0x75,0x56,0x74,0x39,0x32,0x4A,0x75,0x31,0x46,0x4C, - 0x46,0x4F,0x41,0x43,0x30,0x51,0x32,0x20,0x67,0x4E,0x41,0x67,0x77,0x2F,0x4D, - 0x32,0x35,0x53,0x39,0x72,0x55,0x7A,0x64,0x41,0x69,0x43,0x67,0x34,0x61,0x4F, - 0x64,0x35,0x73,0x42,0x38,0x41,0x68,0x48,0x69,0x4F,0x42,0x6E,0x76,0x42,0x70, - 0x74,0x43,0x71,0x2B,0x54,0x49,0x41,0x49,0x61,0x4C,0x67,0x6F,0x42,0x30,0x72, - 0x4C,0x59,0x61,0x70,0x6D,0x41,0x47,0x30,0x4E,0x51,0x62,0x4B,0x43,0x68,0x54, - 0x43,0x6B,0x59,0x58,0x4E,0x20,0x67,0x63,0x75,0x4B,0x32,0x71,0x6F,0x59,0x51, - 0x44,0x2F,0x77,0x59,0x35,0x75,0x43,0x79,0x7A,0x51,0x62,0x49,0x49,0x51,0x54, - 0x44,0x70,0x72,0x35,0x4D,0x5A,0x5A,0x37,0x64,0x59,0x59,0x70,0x79,0x51,0x42, - 0x43,0x66,0x59,0x31,0x64,0x4E,0x75,0x56,0x58,0x74,0x57,0x6B,0x67,0x55,0x41, - 0x67,0x58,0x48,0x44,0x53,0x7A,0x43,0x39,0x7A,0x36,0x2F,0x78,0x44,0x66,0x38, - 0x65,0x41,0x37,0x20,0x62,0x51,0x71,0x74,0x6E,0x4B,0x2F,0x70,0x51,0x43,0x46, - 0x73,0x61,0x63,0x34,0x61,0x7A,0x56,0x68,0x69,0x70,0x63,0x46,0x69,0x34,0x6A, - 0x4B,0x41,0x76,0x56,0x68,0x73,0x51,0x5A,0x54,0x78,0x59,0x4C,0x57,0x69,0x41, - 0x43,0x47,0x73,0x57,0x4E,0x33,0x6D,0x32,0x2B,0x62,0x2F,0x48,0x38,0x46,0x68, - 0x41,0x56,0x43,0x59,0x4F,0x45,0x2F,0x76,0x73,0x78,0x71,0x41,0x36,0x47,0x6D, - 0x58,0x20,0x41,0x51,0x68,0x68,0x67,0x34,0x4E,0x57,0x58,0x67,0x44,0x33,0x38, - 0x42,0x2F,0x69,0x4E,0x51,0x43,0x72,0x45,0x4F,0x53,0x79,0x4E,0x6E,0x55,0x44, - 0x68,0x4A,0x69,0x4C,0x35,0x71,0x7A,0x54,0x2F,0x48,0x2B,0x6B,0x38,0x42,0x2F, - 0x69,0x4E,0x59,0x42,0x6E,0x62,0x41,0x70,0x35,0x4B,0x41,0x6F,0x51,0x59,0x69, - 0x35,0x36,0x32,0x71,0x32,0x7A,0x2F,0x38,0x42,0x53,0x65,0x7A,0x4D,0x52,0x20, - 0x70,0x77,0x48,0x30,0x41,0x54,0x74,0x73,0x43,0x71,0x37,0x72,0x6B,0x41,0x45, - 0x49,0x63,0x53,0x6B,0x63,0x4E,0x4C,0x49,0x44,0x79,0x32,0x50,0x41,0x5A,0x69, - 0x4A,0x4F,0x41,0x77,0x42,0x34,0x79,0x71,0x5A,0x51,0x64,0x32,0x74,0x41,0x52, - 0x35,0x4E,0x79,0x41,0x6F,0x53,0x59,0x69,0x59,0x36,0x6D,0x77,0x47,0x58,0x31, - 0x33,0x31,0x4D,0x51,0x72,0x66,0x38,0x50,0x38,0x52,0x75,0x41,0x20,0x56,0x54, - 0x34,0x41,0x77,0x4D,0x61,0x46,0x69,0x67,0x4B,0x45,0x6D,0x49,0x6B,0x4E,0x6E, - 0x55,0x37,0x61,0x73,0x4E,0x62,0x63,0x54,0x4D,0x52,0x74,0x41,0x50,0x33,0x41, - 0x64,0x32,0x77,0x4B,0x72,0x6C,0x76,0x67,0x6B,0x39,0x56,0x6D,0x67,0x55,0x4A, - 0x4D,0x49,0x2B,0x76,0x42,0x6C,0x66,0x62,0x68,0x2F,0x33,0x65,0x49,0x6B,0x50, - 0x30,0x58,0x4A,0x6D,0x34,0x44,0x41,0x50,0x69,0x57,0x20,0x54,0x61,0x48,0x6D, - 0x4C,0x4B,0x7A,0x52,0x59,0x4B,0x41,0x51,0x30,0x31,0x6A,0x54,0x37,0x72,0x76, - 0x4D,0x6B,0x6E,0x30,0x4C,0x6F,0x6F,0x66,0x2F,0x55,0x42,0x34,0x44,0x32,0x41, - 0x6D,0x63,0x74,0x43,0x6C,0x34,0x64,0x5A,0x63,0x4D,0x51,0x49,0x67,0x77,0x56, - 0x39,0x6C,0x33,0x6A,0x55,0x39,0x53,0x77,0x76,0x52,0x66,0x67,0x58,0x49,0x59, - 0x41,0x4D,0x43,0x54,0x4E,0x6F,0x57,0x57,0x20,0x74,0x41,0x51,0x73,0x6D,0x36, - 0x66,0x42,0x51,0x43,0x45,0x41,0x6C,0x73,0x30,0x4C,0x58,0x50,0x62,0x2B,0x2B, - 0x78,0x71,0x55,0x39,0x76,0x53,0x48,0x38,0x68,0x6D,0x41,0x56,0x54,0x63,0x41, - 0x59,0x4A,0x4F,0x69,0x41,0x43,0x45,0x41,0x5A,0x79,0x31,0x38,0x4D,0x34,0x36, - 0x2F,0x57,0x53,0x34,0x44,0x4F,0x49,0x68,0x6C,0x65,0x4C,0x4B,0x71,0x7A,0x64, - 0x66,0x35,0x67,0x53,0x4C,0x31,0x20,0x64,0x44,0x51,0x46,0x4C,0x69,0x76,0x2F, - 0x64,0x6D,0x49,0x30,0x56,0x6A,0x4C,0x6C,0x4D,0x67,0x43,0x41,0x4A,0x32,0x77, - 0x4B,0x65,0x63,0x41,0x6D,0x54,0x51,0x6D,0x4B,0x6C,0x50,0x4F,0x65,0x4C,0x71, - 0x66,0x4D,0x50,0x79,0x74,0x74,0x32,0x56,0x42,0x4F,0x41,0x33,0x67,0x61,0x65, - 0x4E,0x57,0x6D,0x34,0x4A,0x57,0x64,0x50,0x75,0x33,0x32,0x75,0x35,0x34,0x49, - 0x55,0x56,0x65,0x30,0x20,0x4E,0x77,0x5A,0x63,0x61,0x54,0x2F,0x33,0x2F,0x79, - 0x70,0x47,0x57,0x37,0x46,0x51,0x54,0x67,0x4D,0x41,0x68,0x79,0x6A,0x67,0x75, - 0x73,0x57,0x4B,0x41,0x6B,0x51,0x36,0x75,0x57,0x35,0x78,0x64,0x5A,0x37,0x2B, - 0x55,0x48,0x34,0x44,0x2B,0x44,0x2B,0x32,0x42,0x64,0x64,0x31,0x2B,0x45,0x6F, - 0x50,0x46,0x71,0x6D,0x6A,0x6F,0x79,0x6C,0x77,0x58,0x52,0x74,0x6A,0x72,0x53, - 0x6B,0x62,0x20,0x79,0x6D,0x30,0x41,0x2F,0x63,0x43,0x44,0x4E,0x67,0x55,0x39, - 0x59,0x49,0x75,0x69,0x41,0x4A,0x45,0x79,0x74,0x72,0x67,0x39,0x2F,0x52,0x2B, - 0x69,0x78,0x4D,0x79,0x2F,0x59,0x73,0x70,0x74,0x41,0x41,0x42,0x66,0x74,0x53, - 0x33,0x59,0x73,0x38,0x42,0x6E,0x6B,0x51,0x34,0x53,0x46,0x53,0x6C,0x68,0x55, - 0x55,0x74,0x41,0x7A,0x77,0x4B,0x6E,0x68,0x39,0x37,0x6A,0x63,0x64,0x65,0x68, - 0x20,0x45,0x67,0x62,0x51,0x44,0x33,0x7A,0x4F,0x70,0x71,0x41,0x48,0x62,0x4F, - 0x33,0x4F,0x6C,0x62,0x63,0x32,0x51,0x69,0x53,0x45,0x72,0x64,0x30,0x35,0x6C, - 0x36,0x66,0x2F,0x35,0x34,0x6A,0x35,0x36,0x51,0x2B,0x56,0x4D,0x51,0x43,0x41, - 0x4C,0x39,0x6B,0x57,0x37,0x47,0x34,0x4E,0x75,0x4D,0x4C,0x4E,0x46,0x59,0x57, - 0x6F,0x4F,0x61,0x35,0x59,0x34,0x4C,0x73,0x65,0x6D,0x6D,0x75,0x74,0x20,0x49, - 0x52,0x63,0x71,0x5A,0x51,0x44,0x39,0x6D,0x50,0x36,0x4C,0x46,0x54,0x63,0x73, - 0x39,0x57,0x6D,0x73,0x56,0x4D,0x32,0x45,0x71,0x44,0x43,0x4E,0x47,0x64,0x50, - 0x47,0x48,0x59,0x69,0x39,0x37,0x31,0x2B,0x67,0x6B,0x6A,0x4B,0x7A,0x37,0x72, - 0x2F,0x4D,0x61,0x77,0x69,0x34,0x52,0x69,0x6E,0x43,0x6F,0x6B,0x37,0x5A,0x31, - 0x4A,0x56,0x6A,0x58,0x6F,0x50,0x54,0x30,0x7A,0x2F,0x32,0x20,0x76,0x6E,0x2B, - 0x42,0x53,0x68,0x71,0x41,0x39,0x59,0x77,0x41,0x77,0x4C,0x57,0x4C,0x63,0x70, - 0x6F,0x57,0x46,0x48,0x56,0x48,0x5A,0x33,0x50,0x41,0x35,0x6B,0x56,0x4F,0x44, - 0x37,0x63,0x48,0x4B,0x64,0x50,0x54,0x48,0x79,0x70,0x72,0x41,0x41,0x42,0x66, - 0x77,0x48,0x4B,0x4E,0x51,0x4D,0x61,0x44,0x57,0x35,0x59,0x37,0x44,0x5A,0x49, - 0x49,0x6B,0x57,0x67,0x38,0x34,0x4F,0x5A,0x6C,0x20,0x4F,0x64,0x75,0x39,0x2F, - 0x73,0x46,0x6F,0x35,0x51,0x74,0x6C,0x71,0x78,0x43,0x56,0x4E,0x77,0x42,0x77, - 0x79,0x47,0x54,0x71,0x62,0x67,0x31,0x63,0x74,0x30,0x63,0x53,0x49,0x72,0x46, - 0x73,0x58,0x4F,0x67,0x38,0x38,0x42,0x64,0x72,0x31,0x74,0x39,0x4D,0x56,0x4D, - 0x4D,0x41,0x6E,0x67,0x62,0x2B,0x33,0x72,0x62,0x77,0x65,0x35,0x63,0x36,0x39, - 0x35,0x65,0x45,0x53,0x42,0x7A,0x7A,0x20,0x47,0x67,0x4B,0x75,0x58,0x2B,0x49, - 0x30,0x78,0x66,0x33,0x33,0x78,0x4A,0x6A,0x7A,0x50,0x78,0x76,0x56,0x47,0x6D, - 0x76,0x2F,0x4F,0x39,0x75,0x43,0x6A,0x52,0x6E,0x59,0x74,0x6B,0x4A,0x64,0x41, - 0x56,0x47,0x37,0x65,0x4A,0x67,0x32,0x37,0x44,0x69,0x7A,0x39,0x54,0x66,0x6C, - 0x71,0x63,0x31,0x30,0x71,0x6D,0x55,0x41,0x2B,0x33,0x47,0x59,0x46,0x6C,0x77, - 0x78,0x54,0x37,0x4D,0x43,0x20,0x6F,0x6E,0x61,0x35,0x70,0x73,0x74,0x6E,0x68, - 0x64,0x76,0x4F,0x56,0x77,0x38,0x42,0x42,0x38,0x70,0x55,0x6E,0x57,0x6C,0x55, - 0x63,0x37,0x62,0x39,0x55,0x65,0x44,0x37,0x74,0x6F,0x57,0x76,0x58,0x35,0x4A, - 0x54,0x6D,0x72,0x43,0x6F,0x4F,0x52,0x61,0x31,0x4F,0x49,0x66,0x2B,0x75,0x7A, - 0x44,0x61,0x71,0x41,0x6A,0x56,0x54,0x72,0x65,0x78,0x2F,0x6F,0x64,0x6D,0x50, - 0x4C,0x68,0x74,0x20,0x52,0x55,0x35,0x62,0x69,0x59,0x75,0x61,0x49,0x5A,0x74, - 0x76,0x73,0x77,0x36,0x6A,0x2F,0x67,0x42,0x2F,0x57,0x61,0x62,0x71,0x7A,0x45, - 0x69,0x31,0x44,0x65,0x44,0x66,0x67,0x43,0x2F,0x61,0x46,0x75,0x35,0x6F,0x43, - 0x6E,0x6A,0x66,0x4D,0x71,0x30,0x56,0x45,0x4C,0x58,0x42,0x2B,0x35,0x59,0x35, - 0x35,0x37,0x4A,0x38,0x45,0x58,0x69,0x78,0x54,0x4E,0x57,0x5A,0x6B,0x57,0x6F, - 0x62,0x20,0x41,0x4D,0x43,0x6E,0x4D,0x55,0x5A,0x67,0x78,0x5A,0x55,0x64,0x50, - 0x68,0x73,0x31,0x4E,0x53,0x67,0x53,0x7A,0x73,0x5A,0x4F,0x33,0x2B,0x57,0x41, - 0x44,0x7A,0x41,0x61,0x2B,0x48,0x53,0x5A,0x71,0x6A,0x4D,0x72,0x53,0x54,0x41, - 0x41,0x67,0x45,0x2B,0x36,0x46,0x4C,0x36,0x78,0x4F,0x2B,0x65,0x79,0x66,0x62, - 0x49,0x51,0x46,0x57,0x56,0x70,0x61,0x38,0x43,0x4E,0x37,0x71,0x74,0x61,0x20, - 0x6E,0x54,0x51,0x51,0x46,0x30,0x6B,0x78,0x67,0x4E,0x64,0x77,0x6D,0x42,0x58, - 0x49,0x65,0x50,0x41,0x62,0x4B,0x33,0x4F,0x30,0x32,0x4A,0x2B,0x67,0x49,0x6B, - 0x52,0x46,0x61,0x4D,0x6D,0x61,0x74,0x75,0x6E,0x59,0x37,0x33,0x38,0x49,0x6F, - 0x34,0x47,0x4B,0x55,0x33,0x55,0x44,0x2B,0x4D,0x5A,0x62,0x6A,0x59,0x55,0x66, - 0x48,0x38,0x58,0x68,0x6F,0x4D,0x4E,0x35,0x44,0x51,0x45,0x66,0x20,0x57,0x44, - 0x57,0x6C,0x51,0x55,0x47,0x52,0x47,0x4C,0x49,0x65,0x66,0x47,0x44,0x56,0x6C, - 0x47,0x76,0x69,0x57,0x6B,0x56,0x48,0x2F,0x59,0x75,0x70,0x75,0x67,0x48,0x41, - 0x4E,0x42,0x50,0x34,0x49,0x2B,0x43,0x55,0x37,0x66,0x75,0x57,0x74,0x41,0x54, - 0x63,0x75,0x6C,0x79,0x44,0x67,0x69,0x49,0x5A,0x33,0x4C,0x6F,0x38,0x78,0x78, - 0x4B,0x33,0x71,0x65,0x70,0x54,0x6D,0x44,0x5A,0x66,0x20,0x4E,0x52,0x4A,0x68, - 0x41,0x43,0x45,0x4F,0x41,0x52,0x39,0x7A,0x65,0x63,0x50,0x61,0x42,0x62,0x37, - 0x72,0x50,0x4B,0x73,0x51,0x73,0x58,0x50,0x39,0x6B,0x68,0x78,0x72,0x33,0x54, - 0x65,0x79,0x2B,0x52,0x69,0x6D,0x7A,0x56,0x65,0x4E,0x78,0x42,0x68,0x41,0x4B, - 0x41,0x70,0x34,0x44,0x6F,0x66,0x78,0x41,0x49,0x44,0x4E,0x69,0x7A,0x51,0x7A, - 0x49,0x4B,0x72,0x48,0x78,0x6B,0x37,0x66,0x20,0x64,0x59,0x6B,0x76,0x6D,0x44, - 0x62,0x2B,0x58,0x42,0x6D,0x71,0x34,0x30,0x52,0x69,0x44,0x41,0x43,0x69,0x6A, - 0x77,0x63,0x41,0x62,0x46,0x32,0x57,0x6F,0x30,0x66,0x48,0x6A,0x59,0x73,0x4B, - 0x30,0x39,0x50,0x75,0x73,0x39,0x55,0x39,0x4E,0x36,0x57,0x71,0x2F,0x66,0x34, - 0x77,0x69,0x54,0x49,0x41,0x75,0x47,0x67,0x38,0x34,0x4C,0x44,0x74,0x2B,0x7A, - 0x7A,0x67,0x2F,0x53,0x74,0x79,0x20,0x72,0x47,0x72,0x54,0x39,0x4B,0x43,0x6F, - 0x44,0x4B,0x76,0x61,0x41,0x74,0x37,0x76,0x76,0x6C,0x44,0x74,0x4D,0x50,0x6C, - 0x2B,0x66,0x36,0x69,0x74,0x56,0x34,0x33,0x45,0x47,0x55,0x43,0x49,0x51,0x38, - 0x42,0x2F,0x63,0x6E,0x6D,0x44,0x6D,0x52,0x36,0x63,0x63,0x6C,0x31,0x34,0x49, - 0x59,0x51,0x7A,0x4B,0x2B,0x59,0x46,0x2F,0x4D,0x62,0x4B,0x4B,0x64,0x66,0x70, - 0x50,0x6A,0x42,0x74,0x20,0x2B,0x6C,0x44,0x73,0x46,0x59,0x70,0x49,0x49,0x67, - 0x30,0x67,0x35,0x49,0x7A,0x2F,0x48,0x37,0x6A,0x4C,0x35,0x62,0x32,0x46,0x71, - 0x52,0x67,0x6C,0x43,0x6F,0x6C,0x79,0x73,0x62,0x51,0x31,0x38,0x68,0x54,0x30, - 0x58,0x5A,0x67,0x32,0x6E,0x59,0x69,0x6E,0x50,0x79,0x54,0x55,0x41,0x47,0x44, - 0x61,0x42,0x2F,0x54,0x50,0x77,0x4A,0x2B,0x34,0x76,0x44,0x66,0x72,0x77,0x5A, - 0x32,0x72,0x20,0x46,0x41,0x6D,0x49,0x2B,0x46,0x6B,0x78,0x4C,0x2B,0x44,0x4F, - 0x61,0x4F,0x4C,0x2F,0x45,0x30,0x78,0x62,0x54,0x6F,0x7A,0x34,0x49,0x63,0x45, - 0x47,0x41,0x4E,0x4D,0x2B,0x71,0x43,0x38,0x42,0x58,0x33,0x46,0x35,0x62,0x32, - 0x50,0x47,0x52,0x41,0x49,0x61,0x45,0x78,0x42,0x78,0x73,0x61,0x72,0x4E,0x50, - 0x50,0x6B,0x6A,0x62,0x46,0x6E,0x2F,0x46,0x66,0x4C,0x37,0x2B,0x69,0x64,0x4A, - 0x20,0x2F,0x4A,0x42,0x77,0x41,0x34,0x42,0x70,0x48,0x39,0x67,0x44,0x57,0x47, - 0x34,0x6F,0x57,0x69,0x44,0x72,0x77,0x57,0x2B,0x75,0x6E,0x4E,0x4C,0x73,0x67, - 0x43,0x69,0x5A,0x6E,0x6E,0x61,0x66,0x33,0x31,0x77,0x5A,0x36,0x63,0x6D,0x2F, - 0x45,0x39,0x4E,0x32,0x45,0x79,0x64,0x2B,0x71,0x41,0x45,0x44,0x67,0x49,0x74, - 0x6D,0x42,0x6E,0x37,0x69,0x38,0x74,0x36,0x4D,0x42,0x37,0x65,0x74,0x20,0x7A, - 0x48,0x48,0x56,0x51,0x70,0x6D,0x41,0x69,0x4D,0x5A,0x56,0x43,0x33,0x31,0x75, - 0x63,0x38,0x2F,0x76,0x42,0x39,0x4E,0x57,0x45,0x7A,0x50,0x69,0x50,0x78,0x4D, - 0x31,0x59,0x51,0x41,0x68,0x6A,0x67,0x4B,0x2F,0x42,0x2B,0x78,0x78,0x65,0x56, - 0x50,0x68,0x7A,0x45,0x46,0x6C,0x44,0x41,0x70,0x58,0x72,0x6C,0x2B,0x53,0x63, - 0x7A,0x33,0x44,0x72,0x38,0x41,0x65,0x54,0x46,0x73,0x39,0x20,0x47,0x6E,0x65, - 0x64,0x34,0x71,0x52,0x6D,0x44,0x43,0x44,0x6B,0x6F,0x49,0x63,0x77,0x55,0x79, - 0x6C,0x76,0x75,0x64,0x35,0x6A,0x38,0x79,0x4B,0x66,0x32,0x31,0x64,0x71,0x56, - 0x79,0x45,0x78,0x4E,0x31,0x6B,0x50,0x62,0x6C,0x2B,0x5A,0x69,0x35,0x4C,0x68, - 0x42,0x36,0x5A,0x74,0x76,0x6A,0x76,0x64,0x6C,0x39,0x53,0x6E,0x50,0x39,0x53, - 0x51,0x41,0x63,0x43,0x30,0x44,0x2F,0x49,0x41,0x20,0x38,0x4E,0x73,0x34,0x4A, - 0x41,0x6F,0x56,0x36,0x47,0x6E,0x33,0x32,0x58,0x37,0x35,0x46,0x4B,0x30,0x4E, - 0x63,0x64,0x5A,0x4D,0x31,0x42,0x4F,0x74,0x44,0x62,0x44,0x39,0x38,0x73,0x68, - 0x6A,0x52,0x34,0x63,0x78,0x62,0x66,0x4D,0x41,0x4A,0x46,0x76,0x38,0x55,0x47, - 0x4D,0x47,0x41,0x42,0x65,0x5A,0x77,0x41,0x65,0x49,0x45,0x41,0x6B,0x73,0x61, - 0x51,0x6E,0x34,0x38,0x42,0x72,0x6C,0x20,0x43,0x6F,0x69,0x4C,0x57,0x64,0x70, - 0x71,0x32,0x6F,0x62,0x6A,0x71,0x72,0x34,0x43,0x62,0x32,0x48,0x61,0x5A,0x45, - 0x32,0x49,0x48,0x32,0x72,0x51,0x41,0x47,0x44,0x61,0x42,0x37,0x73,0x66,0x34, - 0x37,0x5A,0x4F,0x59,0x77,0x4A,0x67,0x39,0x68,0x50,0x59,0x76,0x6E,0x70,0x4B, - 0x69,0x34,0x6A,0x45,0x75,0x32,0x7A,0x73,0x39,0x4E,0x6D,0x2B,0x32,0x6E,0x6B, - 0x39,0x66,0x34,0x45,0x39,0x20,0x6D,0x4C,0x61,0x34,0x48,0x32,0x70,0x44,0x2F, - 0x46,0x43,0x6A,0x42,0x67,0x41,0x58,0x52,0x51,0x49,0x66,0x77,0x58,0x46,0x32, - 0x41,0x4D,0x77,0x4D,0x77,0x55,0x33,0x4C,0x63,0x6D,0x78,0x62,0x72,0x6E,0x47, - 0x42,0x4E,0x4A,0x50,0x31,0x59,0x4E,0x76,0x79,0x48,0x44,0x65,0x35,0x6E,0x64, - 0x73,0x58,0x35,0x69,0x65,0x59,0x4E,0x6C,0x67,0x7A,0x54,0x2F,0x34,0x43,0x4E, - 0x57,0x73,0x41,0x20,0x63,0x4E,0x48,0x41,0x34,0x4D,0x64,0x77,0x7A,0x42,0x4D, - 0x6F,0x73,0x4B,0x37,0x44,0x35,0x36,0x36,0x65,0x4B,0x52,0x62,0x72,0x33,0x49, - 0x48,0x55,0x73,0x61,0x67,0x6C,0x34,0x4B,0x36,0x65,0x4B,0x64,0x61,0x35,0x62, - 0x65,0x41,0x5A,0x5A,0x69,0x65,0x68,0x64,0x66,0x32,0x31,0x4A,0x48,0x36,0x6F, - 0x63,0x51,0x4F,0x41,0x61,0x52,0x2F,0x34,0x55,0x55,0x77,0x49,0x35,0x70,0x51, - 0x78,0x20,0x57,0x4B,0x43,0x6A,0x4B,0x65,0x42,0x44,0x6C,0x30,0x39,0x46,0x48, - 0x66,0x55,0x56,0x4E,0x63,0x6A,0x6D,0x52,0x54,0x36,0x2F,0x63,0x2F,0x6C,0x55, - 0x4B,0x63,0x66,0x51,0x66,0x77,0x58,0x54,0x35,0x6F,0x35,0x43,0x37,0x59,0x6B, - 0x66,0x6F,0x43,0x37,0x47,0x77,0x67,0x73,0x66,0x2F,0x44,0x30,0x62,0x4A,0x73, - 0x46,0x6B,0x58,0x66,0x30,0x53,0x2B,0x4C,0x4C,0x72,0x66,0x54,0x4B,0x65,0x20, - 0x6D,0x66,0x65,0x39,0x62,0x4C,0x37,0x50,0x63,0x79,0x65,0x79,0x6E,0x4A,0x39, - 0x53,0x76,0x36,0x41,0x65,0x6D,0x64,0x63,0x51,0x73,0x47,0x31,0x46,0x72,0x74, - 0x53,0x31,0x49,0x76,0x38,0x64,0x65,0x41,0x78,0x71,0x55,0x2F,0x67,0x46,0x61, - 0x6A,0x34,0x43,0x43,0x42,0x50,0x36,0x49,0x68,0x37,0x44,0x63,0x52,0x56,0x68, - 0x6D,0x47,0x58,0x7A,0x41,0x75,0x35,0x65,0x4F,0x36,0x58,0x73,0x20,0x77,0x54, - 0x72,0x6B,0x71,0x6F,0x55,0x2B,0x64,0x36,0x38,0x74,0x65,0x61,0x48,0x59,0x58, - 0x64,0x53,0x42,0x2B,0x4B,0x48,0x4F,0x44,0x41,0x41,0x75,0x57,0x6B,0x56,0x34, - 0x41,0x78,0x46,0x79,0x42,0x63,0x41,0x73,0x4A,0x74,0x72,0x61,0x6E,0x65,0x4E, - 0x44,0x70,0x59,0x57,0x49,0x49,0x69,0x45,0x55,0x75,0x6E,0x68,0x62,0x75,0x35, - 0x31,0x50,0x36,0x51,0x31,0x7A,0x47,0x4E,0x4F,0x6D,0x20,0x45,0x72,0x65,0x71, - 0x4C,0x79,0x70,0x31,0x5A,0x77,0x42,0x77,0x30,0x58,0x34,0x43,0x37,0x38,0x64, - 0x78,0x65,0x37,0x45,0x77,0x53,0x31,0x73,0x44,0x50,0x74,0x49,0x7A,0x78,0x58, - 0x57,0x4C,0x66,0x63,0x30,0x55,0x31,0x43,0x42,0x5A,0x44,0x36,0x35,0x62,0x37, - 0x50,0x4F,0x52,0x6E,0x70,0x4C,0x7A,0x50,0x6E,0x5A,0x68,0x32,0x6C,0x4B,0x69, - 0x31,0x76,0x4F,0x58,0x53,0x6C,0x30,0x61,0x20,0x41,0x46,0x77,0x30,0x51,0x2F, - 0x42,0x62,0x4F,0x47,0x34,0x30,0x47,0x69,0x62,0x6A,0x77,0x5A,0x62,0x46,0x4F, - 0x65,0x35,0x65,0x4F,0x38,0x55,0x56,0x37,0x6A,0x75,0x2F,0x69,0x69,0x70,0x78, - 0x78,0x51,0x49,0x54,0x37,0x6D,0x39,0x5A,0x48,0x48,0x6C,0x36,0x72,0x38,0x42, - 0x44,0x6D,0x44,0x5A,0x30,0x43,0x4F,0x70,0x48,0x2F,0x46,0x41,0x6E,0x67,0x34, - 0x43,0x7A,0x55,0x54,0x51,0x34,0x20,0x2B,0x43,0x6A,0x77,0x41,0x76,0x42,0x74, - 0x59,0x48,0x6D,0x55,0x2B,0x37,0x55,0x31,0x6D,0x6A,0x33,0x67,0x72,0x6C,0x72, - 0x6F,0x38,0x35,0x50,0x65,0x4C,0x47,0x66,0x47,0x46,0x42,0x49,0x6B,0x6B,0x55, - 0x55,0x74,0x41,0x54,0x66,0x46,0x63,0x33,0x7A,0x63,0x4B,0x63,0x77,0x55,0x33, - 0x33,0x4E,0x51,0x58,0x38,0x49,0x76,0x55,0x4C,0x63,0x52,0x51,0x4A,0x69,0x69, - 0x4C,0x63,0x64,0x76,0x20,0x6F,0x6F,0x51,0x75,0x41,0x56,0x78,0x49,0x46,0x39, - 0x32,0x32,0x33,0x50,0x6E,0x30,0x56,0x31,0x46,0x47,0x4F,0x70,0x6F,0x43,0x74, - 0x69,0x33,0x50,0x78,0x5A,0x58,0x6D,0x76,0x51,0x76,0x34,0x44,0x39,0x53,0x78, - 0x2B,0x43,0x45,0x6C,0x42,0x67,0x44,0x78,0x64,0x67,0x6B,0x4B,0x72,0x4F,0x76, - 0x77,0x2B,0x64,0x32,0x31,0x55,0x39,0x79,0x36,0x50,0x45,0x64,0x37,0x6F,0x34, - 0x79,0x67,0x20,0x57,0x72,0x51,0x33,0x6D,0x68,0x4F,0x69,0x66,0x6E,0x64,0x74, - 0x53,0x51,0x6B,0x39,0x59,0x65,0x6F,0x32,0x35,0x43,0x2B,0x6D,0x72,0x72,0x73, - 0x41,0x78,0x63,0x7A,0x51,0x4A,0x66,0x68,0x6E,0x34,0x45,0x6E,0x67,0x66,0x56, - 0x48,0x76,0x36,0x57,0x47,0x4F,0x4C,0x46,0x2F,0x58,0x34,0x62,0x4E,0x76,0x49, - 0x4D,0x50,0x72,0x2F,0x52,0x6B,0x47,0x4A,0x39,0x51,0x31,0x71,0x41,0x51,0x64, - 0x20,0x54,0x51,0x48,0x58,0x64,0x50,0x6D,0x73,0x37,0x2F,0x53,0x6A,0x72,0x4E, - 0x65,0x66,0x69,0x58,0x2F,0x44,0x62,0x4F,0x43,0x78,0x46,0x2B,0x70,0x62,0x2B, - 0x41,0x56,0x53,0x45,0x77,0x47,0x45,0x43,0x58,0x32,0x78,0x65,0x34,0x47,0x62, - 0x67,0x53,0x2B,0x57,0x65,0x6B,0x38,0x50,0x32,0x4E,0x42,0x70,0x42,0x70,0x33, - 0x75,0x75,0x43,0x78,0x48,0x74,0x31,0x59,0x61,0x6C,0x6F,0x33,0x75,0x20,0x31, - 0x6F,0x41,0x37,0x4C,0x6A,0x4F,0x44,0x73,0x68,0x76,0x69,0x45,0x2F,0x38,0x58, - 0x4D,0x57,0x30,0x68,0x4E,0x65,0x4B,0x48,0x6C,0x45,0x55,0x41,0x59,0x59,0x71, - 0x69,0x67,0x55,0x38,0x44,0x4F,0x34,0x43,0x2F,0x41,0x50,0x35,0x6A,0x71,0x66, - 0x64,0x65,0x33,0x65,0x61,0x7A,0x75,0x73,0x32,0x6E,0x62,0x38,0x7A,0x6A,0x39, - 0x66,0x34,0x4D,0x68,0x38,0x35,0x6C,0x38,0x4F,0x55,0x48,0x20,0x4A,0x5A,0x48, - 0x78,0x7A,0x46,0x34,0x4F,0x56,0x33,0x66,0x35,0x55,0x5A,0x66,0x71,0x7A,0x73, - 0x62,0x33,0x4D,0x64,0x2F,0x37,0x69,0x35,0x41,0x65,0x34,0x52,0x64,0x49,0x72, - 0x51,0x45,0x55,0x2B,0x4D,0x5A,0x62,0x6A,0x51,0x55,0x54,0x65,0x42,0x47,0x34, - 0x45,0x2F,0x67,0x73,0x38,0x45,0x67,0x63,0x39,0x31,0x37,0x53,0x45,0x6E,0x44, - 0x62,0x69,0x68,0x7A,0x6A,0x75,0x52,0x78,0x76,0x20,0x44,0x32,0x5A,0x34,0x61, - 0x30,0x44,0x64,0x41,0x31,0x63,0x36,0x6D,0x67,0x49,0x32,0x64,0x50,0x70,0x63, - 0x32,0x65,0x48,0x54,0x6E,0x49,0x33,0x39,0x39,0x67,0x38,0x52,0x4F,0x71,0x49, - 0x72,0x62,0x65,0x49,0x48,0x47,0x51,0x41,0x77,0x34,0x39,0x6A,0x41,0x64,0x34, - 0x44,0x2F,0x41,0x58,0x77,0x69,0x6A,0x76,0x73,0x33,0x5A,0x2B,0x47,0x61,0x4C, - 0x70,0x39,0x72,0x75,0x6E,0x78,0x36,0x20,0x52,0x7A,0x33,0x32,0x44,0x32,0x59, - 0x34,0x66,0x43,0x37,0x44,0x75,0x4C,0x59,0x6F,0x6E,0x4A,0x48,0x6D,0x4C,0x46, - 0x7A,0x65,0x37,0x76,0x4E,0x72,0x48,0x58,0x36,0x35,0x75,0x6C,0x4A,0x66,0x42, - 0x2F,0x36,0x47,0x47,0x6C,0x75,0x37,0x58,0x77,0x35,0x6B,0x41,0x43,0x46,0x43, - 0x30,0x63,0x42,0x2B,0x34,0x46,0x35,0x4D,0x74,0x2B,0x42,0x2B,0x59,0x48,0x74, - 0x63,0x66,0x36,0x4F,0x37,0x20,0x4E,0x61,0x43,0x37,0x4E,0x63,0x66,0x4E,0x79, - 0x33,0x49,0x63,0x47,0x2F,0x5A,0x34,0x35,0x31,0x79,0x47,0x49,0x2B,0x63,0x79, - 0x54,0x4B,0x51,0x38,0x76,0x36,0x67,0x70,0x41,0x36,0x76,0x62,0x66,0x64,0x61, - 0x32,0x2B,0x31,0x7A,0x57,0x46,0x73,0x54,0x56,0x72,0x79,0x39,0x6D,0x4A,0x2F, - 0x41,0x45,0x38,0x48,0x54,0x68,0x46,0x32,0x6B,0x57,0x50,0x38,0x67,0x41,0x4C, - 0x71,0x49,0x6F,0x20,0x47,0x6E,0x67,0x36,0x66,0x2F,0x30,0x70,0x78,0x67,0x68, - 0x36,0x34,0x76,0x6F,0x37,0x48,0x75,0x61,0x67,0x69,0x56,0x56,0x74,0x4F,0x66, - 0x78,0x6C,0x4F,0x59,0x36,0x50,0x65,0x42,0x77,0x66,0x79,0x58,0x42,0x30,0x78, - 0x47,0x4D,0x6F,0x4A,0x64,0x32,0x45,0x39,0x73,0x61,0x41,0x31,0x57,0x30,0x42, - 0x4B,0x2B,0x66,0x37,0x72,0x4A,0x77,0x66,0x6C,0x4A,0x71,0x74,0x64,0x79,0x6B, - 0x4F,0x20,0x59,0x6F,0x54,0x2F,0x74,0x34,0x56,0x66,0x70,0x46,0x33,0x34,0x42, - 0x57,0x51,0x41,0x73,0x31,0x42,0x6B,0x42,0x48,0x38,0x4C,0x2F,0x42,0x33,0x77, - 0x49,0x44,0x47,0x4E,0x44,0x34,0x54,0x4A,0x65,0x42,0x66,0x4D,0x34,0x45,0x5A, - 0x67,0x65,0x4E,0x4C,0x6A,0x36,0x49,0x6A,0x48,0x73,0x57,0x47,0x50,0x55,0x36, - 0x4D,0x5A,0x78,0x75,0x71,0x6B,0x71,0x39,0x43,0x53,0x68,0x61,0x57,0x74,0x20, - 0x50,0x69,0x76,0x6D,0x47,0x2B,0x46,0x58,0x4B,0x48,0x66,0x69,0x49,0x65,0x44, - 0x7A,0x67,0x41,0x38,0x53,0x66,0x6A,0x45,0x79,0x67,0x44,0x6B,0x49,0x64,0x51, - 0x74,0x38,0x7A,0x50,0x6A,0x41,0x34,0x38,0x41,0x66,0x41,0x35,0x38,0x70,0x31, - 0x39,0x39,0x73,0x61,0x77,0x7A,0x59,0x32,0x42,0x6D,0x77,0x73,0x52,0x4D,0x67, - 0x78,0x39,0x43,0x45,0x52,0x2B,0x2B,0x6F,0x78,0x36,0x2F,0x4F,0x20,0x65,0x35, - 0x77,0x65,0x38,0x7A,0x67,0x37,0x58,0x68,0x73,0x52,0x77,0x73,0x4C,0x6D,0x67, - 0x4D,0x55,0x74,0x41,0x63,0x76,0x6E,0x42,0x58,0x53,0x33,0x42,0x69,0x79,0x6F, - 0x62,0x4E,0x62,0x6B,0x35,0x7A,0x44,0x48,0x63,0x66,0x55,0x58,0x66,0x69,0x48, - 0x78,0x58,0x34,0x77,0x4D,0x77,0x49,0x4B,0x69,0x61,0x4B,0x41,0x66,0x4D,0x31, - 0x50,0x77,0x4A,0x65,0x43,0x54,0x6D,0x4B,0x37,0x42,0x20,0x73,0x6E,0x4C,0x2B, - 0x2F,0x51,0x56,0x4E,0x52,0x6A,0x78,0x58,0x64,0x6C,0x7A,0x34,0x33,0x63,0x43, - 0x34,0x78,0x37,0x6C,0x4A,0x47,0x4A,0x72,0x30,0x47,0x42,0x6A,0x33,0x36,0x42, - 0x38,0x33,0x58,0x59,0x64,0x4B,0x52,0x77,0x73,0x74,0x57,0x56,0x4F,0x2F,0x72, - 0x75,0x61,0x41,0x7A,0x75,0x61,0x41,0x42,0x59,0x30,0x42,0x37,0x59,0x33,0x51, - 0x32,0x56,0x79,0x56,0x65,0x63,0x2B,0x54,0x20,0x6D,0x46,0x44,0x2F,0x63,0x53, - 0x52,0x38,0x4B,0x32,0x51,0x41,0x44,0x73,0x78,0x67,0x42,0x49,0x2F,0x6D,0x72, - 0x2F,0x73,0x77,0x52,0x72,0x43,0x70,0x55,0x6E,0x58,0x70,0x62,0x41,0x37,0x6F, - 0x62,0x41,0x61,0x59,0x4C,0x72,0x51,0x4A,0x48,0x34,0x59,0x6D,0x50,0x50,0x72, - 0x48,0x50,0x45,0x5A,0x7A,0x70,0x6A,0x73,0x42,0x35,0x6E,0x65,0x46,0x67,0x63, - 0x5A,0x4A,0x6E,0x31,0x6D,0x6E,0x20,0x49,0x78,0x63,0x32,0x42,0x39,0x4F,0x57, - 0x50,0x52,0x65,0x2F,0x37,0x6D,0x6F,0x4A,0x79,0x4F,0x62,0x2F,0x75,0x36,0x41, - 0x70,0x6F,0x43,0x6B,0x5A,0x71,0x57,0x52,0x37,0x4D,0x63,0x4C,0x2F,0x61,0x76, - 0x69,0x58,0x45,0x76,0x37,0x63,0x79,0x41,0x41,0x69,0x45,0x47,0x35,0x59,0x65, - 0x54,0x50,0x34,0x61,0x76,0x37,0x36,0x45,0x4D,0x59,0x49,0x37,0x71,0x78,0x4B, - 0x78,0x54,0x43,0x6A,0x20,0x36,0x59,0x74,0x62,0x67,0x72,0x52,0x73,0x63,0x4B, - 0x70,0x52,0x2F,0x52,0x4C,0x78,0x67,0x71,0x43,0x30,0x68,0x76,0x4C,0x45,0x4B, - 0x2B,0x4D,0x78,0x56,0x61,0x57,0x75,0x36,0x41,0x45,0x2B,0x44,0x76,0x77,0x42, - 0x5A,0x65,0x34,0x65,0x70,0x4A,0x43,0x54,0x77,0x4E,0x65,0x41,0x62,0x32,0x4A, - 0x47,0x39,0x31,0x50,0x4E,0x2F,0x56,0x75,0x61,0x53,0x33,0x70,0x2F,0x4D,0x67, - 0x4B,0x34,0x20,0x2B,0x75,0x4D,0x67,0x38,0x44,0x42,0x6D,0x33,0x34,0x48,0x66, - 0x42,0x70,0x36,0x71,0x62,0x6E,0x58,0x71,0x67,0x71,0x63,0x77,0x6E,0x2B,0x56, - 0x79,0x7A,0x47,0x65,0x62,0x65,0x76,0x48,0x48,0x67,0x62,0x6F,0x41,0x35,0x57, - 0x64,0x6E,0x2F,0x75,0x72,0x43,0x64,0x41,0x30,0x2B,0x43,0x76,0x78,0x4F,0x56, - 0x57,0x74,0x55,0x4F,0x33,0x77,0x58,0x6B,0x35,0x57,0x35,0x69,0x39,0x43,0x67, - 0x20,0x6E,0x6F,0x67,0x50,0x47,0x55,0x44,0x6C,0x36,0x41,0x66,0x2B,0x49,0x58, - 0x38,0x74,0x41,0x65,0x37,0x49,0x58,0x39,0x76,0x7A,0x72,0x34,0x58,0x35,0x6A, - 0x4C,0x34,0x4C,0x50,0x4A,0x4F,0x2F,0x2B,0x71,0x70,0x62,0x6E,0x66,0x70,0x48, - 0x42,0x6C,0x41,0x64,0x2B,0x72,0x68,0x67,0x42,0x6D,0x42,0x6D,0x44,0x37,0x5A, - 0x6A,0x49,0x6F,0x53,0x62,0x67,0x66,0x69,0x58,0x76,0x53,0x53,0x54,0x20,0x48, - 0x47,0x61,0x62,0x74,0x6D,0x63,0x78,0x77,0x6E,0x2B,0x31,0x75,0x74,0x56,0x4A, - 0x48,0x7A,0x4B,0x41,0x5A,0x4C,0x41,0x33,0x66,0x2F,0x31,0x31,0x2F,0x76,0x56, - 0x57,0x34,0x42,0x61,0x4D,0x47,0x57,0x77,0x46,0x46,0x6C,0x65,0x70,0x58,0x6E, - 0x46,0x7A,0x47,0x74,0x69,0x4E,0x45,0x66,0x33,0x7A,0x2B,0x5A,0x39,0x46,0x46, - 0x5A,0x45,0x42,0x4A,0x4A,0x50,0x64,0x2B,0x61,0x75,0x77,0x20,0x55,0x63,0x6C, - 0x36,0x4C,0x68,0x6A,0x43,0x72,0x77,0x50,0x58,0x56,0x4B,0x6C,0x65,0x72,0x72, - 0x77,0x4F,0x2F,0x49,0x77,0x4C,0x67,0x74,0x39,0x58,0x33,0x65,0x71,0x49,0x59, - 0x6D,0x51,0x41,0x74,0x63,0x47,0x2B,0x2F,0x50,0x58,0x31,0x2F,0x47,0x73,0x50, - 0x75,0x41,0x6F,0x7A,0x33,0x62,0x67,0x75,0x2F,0x2F,0x4F,0x6D,0x2F,0x4D,0x2B, - 0x56,0x6A,0x68,0x5A,0x4F,0x59,0x34,0x35,0x69,0x20,0x32,0x77,0x75,0x38,0x6B, - 0x66,0x2F,0x35,0x59,0x50,0x37,0x6E,0x56,0x43,0x51,0x6A,0x31,0x44,0x49,0x79, - 0x67,0x4E,0x6F,0x6B,0x41,0x48,0x36,0x52,0x76,0x34,0x72,0x70,0x78,0x42,0x6A, - 0x42,0x74,0x5A,0x6A,0x42,0x78,0x63,0x49,0x4B,0x78,0x6E,0x56,0x41,0x49,0x5A, - 0x6D,0x34,0x44,0x66,0x69,0x31,0x57,0x65,0x37,0x39,0x4F,0x6A,0x41,0x52,0x65, - 0x72,0x32,0x33,0x36,0x50,0x57,0x72,0x20,0x2B,0x64,0x65,0x76,0x59,0x73,0x51, - 0x2B,0x34,0x46,0x35,0x39,0x6B,0x52,0x52,0x6B,0x41,0x50,0x58,0x48,0x41,0x50, - 0x42,0x79,0x2F,0x72,0x6F,0x55,0x73,0x36,0x30,0x6F,0x30,0x6C,0x4D,0x37,0x52, - 0x63,0x67,0x41,0x30,0x6F,0x75,0x45,0x4C,0x70,0x51,0x4A,0x4B,0x45,0x53,0x61, - 0x4B,0x58,0x6B,0x74,0x67,0x42,0x43,0x69,0x64,0x6C,0x45,0x45,0x49,0x45,0x53, - 0x4B,0x6B,0x51,0x45,0x49,0x20,0x6B,0x57,0x4A,0x6B,0x41,0x45,0x4B,0x6B,0x47, - 0x42,0x6D,0x41,0x45,0x43,0x6C,0x47,0x42,0x69,0x42,0x45,0x69,0x70,0x45,0x42, - 0x43,0x4A,0x46,0x69,0x2F,0x68,0x30,0x37,0x77,0x4F,0x37,0x35,0x36,0x2F,0x2B, - 0x71,0x74,0x67,0x41,0x41,0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B, - 0x4A,0x67,0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x73,0x74,0x61,0x72,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20, - 0x5B,0x5B,0x20,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,0x43,0x41, - 0x41,0x41,0x41,0x41,0x67,0x43,0x41,0x59,0x41,0x41,0x41,0x42,0x7A,0x65,0x6E, - 0x72,0x30,0x41,0x41,0x41,0x42,0x53,0x45,0x6C,0x45,0x51,0x56,0x52,0x59,0x68, - 0x65,0x32,0x57,0x30,0x57,0x33,0x43,0x4D,0x42,0x43,0x47,0x76,0x31,0x53,0x38, - 0x20,0x4E,0x79,0x4E,0x55,0x36,0x67,0x4B,0x77,0x51,0x64,0x6D,0x6B,0x33,0x53, - 0x42,0x4D,0x41,0x45,0x78,0x41,0x6D,0x51,0x42,0x31,0x41,0x74,0x6F,0x4A,0x6D, - 0x6B,0x35,0x51,0x47,0x41,0x43,0x4A,0x45,0x63,0x49,0x45,0x36,0x59,0x4D,0x64, - 0x39,0x62,0x42,0x51,0x66,0x4F,0x65,0x6B,0x53,0x68,0x2F,0x79,0x50,0x7A,0x6D, - 0x4F,0x37,0x66,0x2F,0x2F,0x7A,0x33,0x65,0x32,0x73,0x37,0x71,0x75,0x20,0x47, - 0x52,0x4A,0x33,0x67,0x37,0x4B,0x50,0x41,0x6B,0x59,0x42,0x2F,0x30,0x48,0x41, - 0x70,0x4B,0x2B,0x46,0x54,0x70,0x66,0x72,0x37,0x38,0x64,0x37,0x33,0x62,0x7A, - 0x4F,0x45,0x54,0x68,0x64,0x72,0x73,0x68,0x58,0x77,0x4E,0x51,0x79,0x58,0x78, - 0x57,0x42,0x30,0x42,0x30,0x34,0x68,0x36,0x49,0x2F,0x42,0x7A,0x62,0x41,0x4D, - 0x31,0x44,0x32,0x4C,0x73,0x42,0x6A,0x41,0x78,0x77,0x39,0x20,0x77,0x54,0x6B, - 0x67,0x2F,0x38,0x54,0x6F,0x50,0x45,0x56,0x41,0x44,0x75,0x78,0x38,0x2B,0x2B, - 0x43,0x46,0x66,0x50,0x6D,0x2B,0x50,0x49,0x55,0x63,0x49,0x4E,0x50,0x63,0x42, - 0x64,0x37,0x74,0x46,0x50,0x68,0x57,0x72,0x44,0x6B,0x48,0x79,0x72,0x39,0x49, - 0x77,0x73,0x5A,0x31,0x44,0x44,0x6E,0x63,0x7A,0x70,0x74,0x6B,0x41,0x63,0x4C, - 0x4E,0x6D,0x32,0x4C,0x34,0x44,0x69,0x67,0x61,0x20,0x45,0x54,0x45,0x68,0x71, - 0x69,0x31,0x6F,0x46,0x76,0x50,0x51,0x33,0x74,0x38,0x6C,0x73,0x4D,0x42,0x46, - 0x44,0x72,0x68,0x39,0x4E,0x71,0x67,0x69,0x49,0x4D,0x67,0x4C,0x4A,0x54,0x6E, - 0x41,0x45,0x79,0x35,0x6E,0x56,0x72,0x51,0x6B,0x71,0x53,0x55,0x48,0x48,0x6F, - 0x43,0x6C,0x59,0x54,0x77,0x34,0x39,0x31,0x58,0x62,0x67,0x47,0x67,0x5A,0x43, - 0x76,0x66,0x61,0x63,0x6A,0x73,0x44,0x20,0x37,0x38,0x44,0x57,0x74,0x31,0x75, - 0x68,0x50,0x51,0x63,0x4B,0x58,0x45,0x68,0x6A,0x4F,0x41,0x41,0x7A,0x32,0x52, - 0x45,0x72,0x52,0x38,0x74,0x42,0x74,0x42,0x59,0x6B,0x46,0x62,0x38,0x48,0x6B, - 0x34,0x7A,0x4B,0x68,0x34,0x59,0x30,0x52,0x63,0x42,0x72,0x79,0x37,0x2B,0x39, - 0x61,0x4A,0x64,0x36,0x61,0x67,0x64,0x31,0x47,0x59,0x59,0x49,0x62,0x73,0x41, - 0x6D,0x4F,0x54,0x4F,0x77,0x20,0x52,0x53,0x42,0x5A,0x51,0x43,0x42,0x69,0x6A, - 0x39,0x75,0x4B,0x75,0x59,0x55,0x63,0x4F,0x72,0x34,0x48,0x42,0x4E,0x6B,0x4C, - 0x4C,0x75,0x76,0x4E,0x36,0x4F,0x74,0x4A,0x56,0x75,0x46,0x4B,0x7A,0x34,0x78, - 0x4F,0x57,0x39,0x41,0x48,0x42,0x6E,0x2B,0x55,0x6A,0x67,0x4A,0x47,0x41,0x54, - 0x2F,0x6D,0x2F,0x46,0x57,0x39,0x51,0x77,0x43,0x69,0x33,0x41,0x41,0x41,0x41, - 0x41,0x42,0x4A,0x20,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D, - 0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74, - 0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72, - 0x28,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20, - 0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x7B,0x20,0x78,0x30,0x20,0x3D,0x20,0x2D, - 0x31,0x30,0x30,0x2C,0x20,0x78,0x20,0x3D,0x20,0x31,0x30,0x30,0x30,0x2C,0x20, - 0x79,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D, - 0x28,0x29,0x20,0x2A,0x20,0x36,0x30,0x30,0x2C,0x20,0x72,0x30,0x20,0x3D,0x20, - 0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A, - 0x20,0x6D,0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x32,0x2C,0x20,0x72, - 0x76,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D, - 0x28,0x29,0x20,0x2A,0x20,0x6D,0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20, - 0x34,0x2C,0x20,0x74,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E, - 0x64,0x6F,0x6D,0x28,0x29,0x2C,0x20,0x73,0x63,0x61,0x6C,0x65,0x20,0x3D,0x20, - 0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x20,0x3D,0x20, - 0x73,0x70,0x65,0x65,0x64,0x2C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72, - 0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72, - 0x28,0x6E,0x75,0x6D,0x5F,0x73,0x74,0x61,0x72,0x73,0x2C,0x20,0x73,0x63,0x61, - 0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x6C,0x61,0x79,0x65,0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F, - 0x72,0x20,0x69,0x20,0x3D,0x20,0x31,0x2C,0x6E,0x75,0x6D,0x5F,0x73,0x74,0x61, - 0x72,0x73,0x20,0x64,0x6F,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73, - 0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x2C,0x20,0x63,0x72,0x65,0x61, - 0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20, - 0x73,0x70,0x65,0x65,0x64,0x29,0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74, - 0x75,0x72,0x6E,0x20,0x6C,0x61,0x79,0x65,0x72,0x20,0x65,0x6E,0x64,0x20,0x6C, - 0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75, - 0x70,0x64,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20, - 0x73,0x29,0x20,0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2B,0x20, - 0x30,0x2E,0x31,0x20,0x2A,0x20,0x73,0x2E,0x73,0x70,0x65,0x65,0x64,0x20,0x2A, - 0x20,0x64,0x74,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x73,0x2E,0x74,0x20,0x3E, - 0x20,0x31,0x20,0x64,0x6F,0x20,0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74, - 0x20,0x2D,0x20,0x31,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72, - 0x61,0x77,0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x29,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x78,0x20,0x3D,0x20,0x73,0x2E,0x78,0x30,0x20,0x2B,0x20,0x73,0x2E, - 0x78,0x20,0x2A,0x20,0x73,0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79, - 0x20,0x3D,0x20,0x73,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x72,0x20, - 0x3D,0x20,0x73,0x2E,0x72,0x30,0x20,0x2B,0x20,0x73,0x2E,0x72,0x76,0x20,0x2A, - 0x20,0x73,0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x78,0x20,0x3D, - 0x20,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x73,0x79,0x20,0x3D,0x20,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,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,0x2A,0x73,0x2E,0x73,0x63,0x61, - 0x6C,0x65,0x2C,0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65, - 0x2C,0x20,0x32,0x35,0x35,0x2C,0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63, - 0x61,0x6C,0x65,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, - 0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x73,0x74,0x61,0x72,0x31,0x2C, - 0x20,0x78,0x2C,0x20,0x79,0x2C,0x20,0x72,0x2C,0x20,0x73,0x78,0x2C,0x20,0x73, - 0x79,0x2C,0x20,0x31,0x36,0x2C,0x20,0x31,0x36,0x29,0x20,0x65,0x6E,0x64,0x20, - 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, - 0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79, - 0x65,0x72,0x28,0x64,0x74,0x2C,0x20,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x66, - 0x6F,0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72, - 0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64, - 0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x73, - 0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x6C,0x61,0x79,0x65,0x72, - 0x29,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70, - 0x61,0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20, - 0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61,0x72,0x28,0x76,0x29,0x20,0x65,0x6E, - 0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E, - 0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E, - 0x6F,0x6C,0x6C,0x28,0x70,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x7B, - 0x20,0x70,0x20,0x3D,0x20,0x70,0x2C,0x20,0x74,0x30,0x20,0x3D,0x20,0x6D,0x61, - 0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x31, - 0x30,0x2C,0x20,0x74,0x20,0x3D,0x20,0x30,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20, - 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, - 0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x6E, - 0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x74,0x20,0x3D,0x20,0x7B,0x7D,0x20, - 0x66,0x6F,0x72,0x20,0x69,0x20,0x3D,0x20,0x31,0x2C,0x6E,0x20,0x64,0x6F,0x20, - 0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x74,0x2C, - 0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x28, - 0x6D,0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x32,0x20,0x2F,0x20,0x6E, - 0x29,0x20,0x2A,0x20,0x69,0x29,0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74, - 0x75,0x72,0x6E,0x20,0x74,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C, - 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74, - 0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64,0x74,0x2C,0x20,0x6B,0x29,0x20, - 0x6B,0x2E,0x74,0x20,0x3D,0x20,0x6B,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20, + 0x41,0x41,0x41,0x45,0x41,0x43,0x41,0x59,0x41,0x41,0x41,0x42,0x63,0x63,0x71, + 0x68,0x6D,0x41,0x41,0x41,0x64,0x35,0x6B,0x6C,0x45,0x51,0x56,0x52,0x34,0x6E, + 0x4F,0x32,0x64,0x66,0x5A,0x42,0x63,0x31,0x58,0x6E,0x6D,0x66,0x37,0x64,0x37, + 0x20,0x50,0x71,0x55,0x5A,0x7A,0x57,0x6A,0x30,0x4D,0x66,0x70,0x41,0x51,0x69, + 0x4E,0x45,0x4A,0x41,0x47,0x79,0x51,0x4D,0x45,0x73,0x77,0x6F,0x41,0x4D,0x43, + 0x56,0x35,0x69,0x78,0x53,0x6E,0x6A,0x73,0x47,0x56,0x58,0x4A,0x62,0x76,0x72, + 0x4C,0x55,0x78,0x43,0x63,0x4A,0x6D,0x74,0x70,0x4C,0x4C,0x6C,0x53,0x72,0x41, + 0x68,0x41,0x64,0x74,0x4A,0x4F,0x61,0x6D,0x34,0x6A,0x41,0x74,0x77,0x20,0x58, + 0x48,0x61,0x74,0x64,0x31,0x31,0x4F,0x78,0x52,0x56,0x32,0x6C,0x58,0x56,0x46, + 0x57,0x44,0x5A,0x6C,0x73,0x41,0x4F,0x78,0x4D,0x49,0x73,0x52,0x57,0x42,0x69, + 0x51,0x73,0x4E,0x43,0x33,0x72,0x4E,0x46,0x49,0x6F,0x35,0x6E,0x52,0x6A,0x4F, + 0x61,0x7A,0x37,0x38,0x30,0x66,0x70,0x78,0x76,0x64,0x61,0x63,0x31,0x6F,0x7A, + 0x72,0x6C,0x39,0x75,0x2F,0x74,0x32,0x33,0x2B,0x64,0x58,0x20,0x64,0x59,0x76, + 0x70,0x34,0x66,0x53,0x64,0x6F,0x2B,0x37,0x7A,0x50,0x50,0x63,0x39,0x35,0x37, + 0x7A,0x6E,0x48,0x43,0x38,0x49,0x41,0x6F,0x51,0x51,0x36,0x53,0x52,0x54,0x37, + 0x51,0x6F,0x49,0x49,0x61,0x71,0x48,0x44,0x45,0x43,0x49,0x46,0x43,0x4D,0x44, + 0x45,0x43,0x4C,0x46,0x79,0x41,0x43,0x45,0x53,0x44,0x45,0x79,0x41,0x43,0x46, + 0x53,0x6A,0x41,0x78,0x41,0x69,0x42,0x51,0x6A,0x20,0x41,0x78,0x41,0x69,0x78, + 0x63,0x67,0x41,0x68,0x45,0x67,0x78,0x44,0x61,0x58,0x65,0x34,0x49,0x6C,0x58, + 0x78,0x75,0x4F,0x6F,0x68,0x78,0x41,0x69,0x41,0x76,0x64,0x76,0x61,0x53,0x37, + 0x70,0x2F,0x59,0x6F,0x41,0x68,0x45,0x67,0x78,0x4A,0x55,0x63,0x41,0x6F,0x71, + 0x62,0x78,0x5A,0x76,0x6D,0x39,0x38,0x73,0x4E,0x54,0x67,0x67,0x79,0x67,0x2F, + 0x70,0x67,0x48,0x58,0x41,0x56,0x73,0x20,0x41,0x6A,0x72,0x79,0x50,0x77,0x4F, + 0x73,0x42,0x70,0x61,0x45,0x79,0x71,0x30,0x48,0x35,0x73,0x39,0x79,0x6A,0x78, + 0x46,0x67,0x58,0x2B,0x68,0x31,0x48,0x33,0x41,0x6B,0x2F,0x2F,0x4D,0x62,0x77, + 0x43,0x43,0x77,0x4E,0x2F,0x2F,0x7A,0x2B,0x56,0x68,0x71,0x4C,0x61,0x71,0x43, + 0x44,0x4B,0x41,0x32,0x38,0x59,0x42,0x31,0x6F,0x57,0x73,0x54,0x52,0x75,0x67, + 0x39,0x77,0x49,0x6F,0x59,0x20,0x37,0x6A,0x38,0x66,0x32,0x47,0x4A,0x5A,0x39, + 0x67,0x52,0x77,0x45,0x47,0x4D,0x47,0x65,0x34,0x46,0x66,0x68,0x69,0x35,0x46, + 0x45,0x67,0x6C,0x48,0x42,0x6C,0x41,0x62,0x58,0x41,0x6C,0x73,0x42,0x57,0x34, + 0x47,0x62,0x67,0x41,0x32,0x56,0x37,0x63,0x36,0x30,0x31,0x69,0x52,0x76,0x39, + 0x34,0x33,0x77,0x2F,0x39,0x37,0x44,0x58,0x67,0x4A,0x65,0x41,0x48,0x59,0x44, + 0x62,0x78,0x64,0x20,0x77,0x58,0x6F,0x4A,0x43,0x32,0x51,0x41,0x79,0x65,0x51, + 0x47,0x34,0x42,0x61,0x4D,0x34,0x47,0x38,0x47,0x46,0x6C,0x65,0x33,0x4F,0x70, + 0x48,0x5A,0x6E,0x4C,0x2F,0x75,0x7A,0x62,0x38,0x2B,0x6A,0x54,0x47,0x43,0x46, + 0x34,0x44,0x6E,0x38,0x7A,0x2B,0x4C,0x4B,0x69,0x49,0x44,0x53,0x41,0x61,0x62, + 0x67,0x4F,0x33,0x41,0x48,0x52,0x6A,0x42,0x4E,0x31,0x57,0x33,0x4F,0x6D,0x56, + 0x6A,0x20,0x4D,0x66,0x43,0x68,0x2F,0x41,0x57,0x51,0x77,0x35,0x6A,0x42,0x4C, + 0x6D,0x41,0x6E,0x70,0x67,0x73,0x68,0x4B,0x6F,0x67,0x4D,0x6F,0x44,0x70,0x30, + 0x59,0x63,0x52,0x2B,0x4F,0x33,0x41,0x58,0x30,0x77,0x66,0x6E,0x30,0x6B,0x51, + 0x57,0x32,0x4A,0x61,0x2F,0x2F,0x67,0x6F,0x7A,0x32,0x4C,0x67,0x44,0x65,0x42, + 0x5A,0x34,0x42,0x75,0x69,0x76,0x58,0x74,0x58,0x53,0x67,0x51,0x79,0x67,0x20, + 0x73,0x6E,0x77,0x55,0x75,0x44,0x74,0x2F,0x69,0x59,0x74,0x5A,0x41,0x76,0x78, + 0x42,0x2F,0x67,0x4A,0x34,0x4B,0x6E,0x2F,0x4A,0x44,0x4D,0x71,0x45,0x44,0x4B, + 0x44,0x38,0x33,0x41,0x6E,0x63,0x67,0x33,0x6E,0x53,0x5A,0x36,0x74,0x63,0x6C, + 0x31,0x6F,0x6A,0x62,0x4A,0x5A,0x50,0x41,0x64,0x2F,0x41,0x64,0x42,0x64,0x45, + 0x54,0x4D,0x67,0x41,0x79,0x6B,0x4D,0x50,0x38,0x48,0x47,0x4D,0x20,0x38,0x46, + 0x64,0x57,0x74,0x79,0x70,0x31,0x51,0x38,0x45,0x4D,0x6A,0x6D,0x4F,0x4D,0x34, + 0x4A,0x75,0x59,0x36,0x55,0x64,0x52,0x41,0x6C,0x55,0x33,0x67,0x47,0x2B,0x38, + 0x31,0x56,0x6A,0x74,0x4B,0x70,0x54,0x45,0x50,0x52,0x73,0x6D,0x77,0x79,0x38, + 0x2F,0x43,0x4E,0x79,0x50,0x47,0x64,0x41,0x54,0x35,0x57,0x45,0x6C,0x38,0x46, + 0x44,0x2B,0x32,0x67,0x6B,0x38,0x41,0x54,0x78,0x64,0x20,0x2B,0x4A,0x2B,0x31, + 0x31,0x70,0x36,0x4B,0x32,0x6B,0x2F,0x46,0x71,0x62,0x6F,0x42,0x31,0x43,0x49, + 0x7A,0x66,0x47,0x6E,0x33,0x59,0x59,0x53,0x2F,0x71,0x66,0x4B,0x31,0x6D,0x55, + 0x34,0x75,0x67,0x4C,0x50,0x6A,0x48,0x6D,0x66,0x48,0x50,0x53,0x5A,0x38,0x47, + 0x42,0x67,0x33,0x32,0x62,0x37,0x44,0x6B,0x78,0x35,0x6A,0x75,0x51,0x76,0x6C, + 0x42,0x69,0x63,0x38,0x4A,0x76,0x32,0x5A,0x20,0x37,0x39,0x47,0x59,0x67,0x59, + 0x36,0x6D,0x43,0x7A,0x6B,0x38,0x4C,0x56,0x6C,0x6F,0x61,0x7A,0x53,0x76,0x4F, + 0x35,0x73,0x44,0x6D,0x6A,0x4B,0x77,0x73,0x44,0x6C,0x67,0x59,0x58,0x4E,0x41, + 0x64,0x72,0x5A,0x6B,0x34,0x73,0x71,0x77,0x50,0x58,0x2F,0x74,0x78,0x52,0x6A, + 0x42,0x56,0x38,0x50,0x66,0x54,0x61,0x32,0x5A,0x51,0x54,0x57,0x51,0x41,0x54, + 0x68,0x51,0x4A,0x50,0x77,0x75,0x20,0x34,0x4A,0x4D,0x59,0x34,0x53,0x2B,0x72, + 0x64,0x46,0x32,0x47,0x4A,0x6A,0x79,0x47,0x4A,0x73,0x31,0x2F,0x43,0x34,0x49, + 0x2F,0x4E,0x77,0x6E,0x6E,0x70,0x30,0x70,0x58,0x35,0x4B,0x51,0x50,0x70,0x38, + 0x65,0x4B,0x37,0x7A,0x50,0x7A,0x66,0x65,0x63,0x31,0x42,0x4C,0x51,0x33,0x58, + 0x6A,0x43,0x45,0x42,0x55,0x30,0x42,0x43,0x78,0x70,0x68,0x51,0x56,0x4E,0x46, + 0x6B,0x77,0x41,0x33,0x20,0x41,0x55,0x38,0x43,0x44,0x32,0x4F,0x4D,0x34,0x48, + 0x47,0x67,0x76,0x2F,0x42,0x39,0x79,0x51,0x68,0x6D,0x52,0x77,0x5A,0x67,0x53, + 0x55,0x6A,0x38,0x6A,0x63,0x43,0x44,0x6D,0x4D,0x5A,0x57,0x45,0x59,0x59,0x6D, + 0x50,0x45,0x36,0x4E,0x65,0x76,0x53,0x4F,0x65,0x76,0x53,0x4E,0x65,0x5A,0x79, + 0x35,0x53,0x4A,0x7A,0x56,0x34,0x2F,0x79,0x55,0x78,0x2F,0x6B,0x70,0x36,0x42, + 0x32,0x39,0x20,0x75,0x45,0x36,0x4C,0x57,0x67,0x4B,0x57,0x74,0x41,0x52,0x30, + 0x74,0x77,0x59,0x73,0x62,0x51,0x30,0x71,0x59,0x51,0x72,0x4C,0x67,0x45,0x66, + 0x79,0x31,0x31,0x38,0x43,0x6E,0x77,0x63,0x6D,0x37,0x39,0x6B,0x77,0x4B,0x52, + 0x4F,0x59,0x42,0x52,0x6E,0x41,0x48,0x42,0x51,0x39,0x39,0x66,0x38,0x63,0x38, + 0x38,0x51,0x76,0x36,0x38,0x44,0x65,0x38,0x4B,0x54,0x48,0x30,0x52,0x47,0x50, + 0x20,0x34,0x79,0x4D,0x65,0x76,0x65,0x63,0x7A,0x30,0x30,0x4C,0x33,0x57,0x75, + 0x4A,0x4D,0x33,0x71,0x7A,0x65,0x47,0x6A,0x43,0x76,0x57,0x37,0x4B,0x77,0x74, + 0x4E,0x58,0x6E,0x73,0x72,0x61,0x41,0x56,0x66,0x4F,0x44,0x64,0x37,0x73,0x56, + 0x5A,0x65,0x4A,0x68,0x34,0x42,0x4F,0x59,0x69,0x4F,0x41,0x4C,0x69,0x67,0x5A, + 0x6D,0x52,0x67,0x59,0x77,0x43,0x30,0x58,0x43,0x66,0x77,0x41,0x6A,0x20,0x2F, + 0x50,0x58,0x6C,0x2B,0x46,0x73,0x42,0x63,0x48,0x7A,0x45,0x34,0x38,0x52,0x49, + 0x68,0x73,0x50,0x44,0x48,0x6B,0x4D,0x54,0x79,0x58,0x6E,0x43,0x78,0x38,0x6C, + 0x59,0x44,0x6F,0x34,0x4D,0x5A,0x7A,0x67,0x79,0x62,0x46,0x34,0x76,0x61,0x41, + 0x71,0x34,0x76,0x43,0x31,0x67,0x78,0x58,0x79,0x66,0x6C,0x66,0x4F,0x44,0x57, + 0x64,0x63,0x6D,0x6C,0x38,0x42,0x4B,0x54,0x42,0x54,0x77,0x20,0x58,0x7A,0x42, + 0x47,0x38,0x4A,0x69,0x4D,0x59,0x44,0x6F,0x79,0x67,0x43,0x49,0x71,0x4F,0x61, + 0x70,0x2F,0x62,0x4D,0x54,0x6A,0x34,0x4C,0x6B,0x4D,0x68,0x38,0x39,0x6C,0x47, + 0x4B,0x2F,0x52,0x70,0x33,0x77,0x70,0x44,0x45,0x31,0x34,0x37,0x4F,0x33,0x33, + 0x32,0x4E,0x75,0x66,0x6F,0x54,0x6B,0x4C,0x6C,0x37,0x66,0x37,0x39,0x4C,0x53, + 0x58,0x78,0x51,0x7A,0x57,0x41,0x31,0x38,0x47,0x20,0x50,0x6B,0x42,0x2B,0x31, + 0x6B,0x42,0x47,0x59,0x4A,0x41,0x42,0x68,0x41,0x69,0x4A,0x66,0x77,0x32,0x6D, + 0x6E,0x2F,0x2B,0x4A,0x75,0x50,0x2F,0x47,0x71,0x56,0x47,0x50,0x66,0x59,0x50, + 0x70,0x46,0x66,0x31,0x73,0x6A,0x4F,0x64,0x67,0x2F,0x30,0x43,0x47,0x2F,0x51, + 0x4D,0x58,0x7A,0x47,0x42,0x39,0x68,0x38,0x2F,0x53,0x31,0x6C,0x69,0x37,0x43, + 0x59,0x56,0x5A,0x67,0x36,0x39,0x6A,0x20,0x49,0x6F,0x4E,0x44,0x61,0x52,0x38, + 0x66,0x6B,0x41,0x46,0x77,0x30,0x56,0x50,0x2F,0x73,0x35,0x68,0x42,0x70,0x4E, + 0x67,0x59,0x7A,0x38,0x48,0x62,0x67,0x78,0x6E,0x32,0x44,0x57,0x62,0x65,0x6E, + 0x5A,0x59,0x54,0x73,0x78,0x4D,0x32,0x67,0x38,0x37,0x6D,0x67,0x50,0x55,0x64, + 0x50,0x6C,0x64,0x32,0x2B,0x44,0x54,0x48,0x6C,0x30,0x66,0x35,0x69,0x66,0x7A, + 0x31,0x45,0x50,0x42,0x6F,0x20,0x6D,0x71,0x4F,0x42,0x31,0x4F,0x38,0x4A,0x47, + 0x42,0x4C,0x2F,0x65,0x34,0x48,0x76,0x45,0x61,0x50,0x34,0x2B,0x38,0x59,0x38, + 0x66,0x6E,0x51,0x69,0x79,0x7A,0x2F,0x38,0x73,0x70,0x47,0x66,0x6E,0x73,0x70, + 0x4B,0x2F,0x42,0x45,0x59,0x47,0x50,0x66,0x34,0x36,0x53,0x6E,0x7A,0x47,0x66, + 0x37,0x6F,0x52,0x4A,0x61,0x2B,0x65,0x47,0x64,0x41,0x48,0x73,0x46,0x38,0x35, + 0x2B,0x2B,0x46,0x20,0x36,0x69,0x66,0x6C,0x56,0x49,0x50,0x55,0x52,0x67,0x42, + 0x46,0x58,0x2F,0x61,0x6A,0x77,0x47,0x66,0x69,0x75,0x76,0x65,0x52,0x34,0x51, + 0x77,0x2F,0x50,0x35,0x4F,0x5A,0x63,0x57,0x70,0x4D,0x52,0x4D,0x4D,0x50,0x34, + 0x4D,0x42,0x51,0x68,0x67,0x4E,0x44,0x47,0x62,0x70,0x62,0x41,0x39,0x36,0x7A, + 0x79,0x47,0x64,0x31,0x32,0x79,0x79,0x5A,0x54,0x47,0x37,0x63,0x6D,0x62,0x38, + 0x2B,0x20,0x42,0x33,0x77,0x32,0x62,0x64,0x46,0x41,0x4B,0x69,0x4F,0x41,0x6B, + 0x50,0x6A,0x58,0x59,0x35,0x61,0x65,0x6C,0x69,0x7A,0x2B,0x41,0x42,0x4F,0x32, + 0x50,0x76,0x56,0x4F,0x41,0x38,0x38,0x63,0x79,0x30,0x72,0x38,0x5A,0x61,0x52, + 0x33,0x31,0x4F,0x4F,0x5A,0x59,0x31,0x6D,0x65,0x65,0x71,0x65,0x42,0x2F,0x51, + 0x4F,0x5A,0x75,0x50,0x59,0x64,0x2B,0x77,0x79,0x6D,0x4C,0x61,0x79,0x48,0x20, + 0x39,0x45,0x51,0x44,0x71,0x54,0x4F,0x41,0x30,0x42,0x66,0x37,0x2B,0x35,0x67, + 0x74,0x71,0x32,0x34,0x72,0x39,0x5A,0x35,0x76,0x44,0x78,0x72,0x68,0x50,0x33, + 0x38,0x79,0x79,0x32,0x43,0x64,0x54,0x75,0x45,0x6C,0x6B,0x63,0x45,0x4A,0x6A, + 0x2B,0x64,0x50,0x47,0x69,0x4E,0x34,0x65,0x7A,0x43,0x57,0x70,0x6E,0x77,0x62, + 0x70,0x6B,0x33,0x38,0x50,0x71,0x54,0x44,0x42,0x46,0x4C,0x54,0x20,0x42,0x53, + 0x6A,0x36,0x4D,0x70,0x2F,0x45,0x35,0x4F,0x2B,0x58,0x78,0x44,0x74,0x44,0x47, + 0x66,0x61,0x63,0x30,0x63,0x42,0x65,0x74,0x52,0x6D,0x61,0x38,0x50,0x6A,0x58, + 0x58,0x32,0x58,0x35,0x65,0x58,0x2B,0x47,0x36,0x78,0x62,0x35,0x72,0x46,0x31, + 0x51,0x55,0x74,0x65,0x67,0x47,0x66,0x67,0x57,0x5A,0x6F,0x2F,0x44,0x50,0x36, + 0x72,0x33,0x4C,0x6B,0x45,0x71,0x49,0x6F,0x43,0x51,0x20,0x2B,0x44,0x64,0x6A, + 0x48,0x4C,0x34,0x6B,0x38,0x66,0x65,0x4E,0x65,0x58,0x7A,0x33,0x55,0x41,0x50, + 0x50,0x6E,0x64,0x44,0x41,0x58,0x70,0x49,0x59,0x47,0x50,0x64,0x34,0x37,0x6B, + 0x53,0x57,0x37,0x78,0x35,0x71,0x69,0x47,0x4F,0x77,0x38,0x44,0x35,0x4D,0x57, + 0x39,0x6B,0x4D,0x39,0x52,0x73,0x4E,0x31,0x48,0x55,0x45,0x55,0x50,0x53,0x6C, + 0x2F,0x56,0x66,0x67,0x66,0x7A,0x4C,0x37,0x20,0x59,0x52,0x68,0x7A,0x4D,0x6A, + 0x7A,0x70,0x38,0x58,0x4B,0x66,0x47,0x59,0x67,0x53,0x79,0x61,0x56,0x67,0x30, + 0x46,0x63,0x73,0x38,0x4C,0x6C,0x2B,0x69,0x56,0x39,0x4B,0x79,0x76,0x46,0x37, + 0x67,0x44,0x33,0x41,0x66,0x77,0x50,0x2B,0x56,0x7A,0x31,0x47,0x41,0x33,0x58, + 0x62,0x6B,0x6B,0x50,0x69,0x7A,0x77,0x4A,0x66,0x77,0x32,0x77,0x67,0x45,0x55, + 0x6E,0x38,0x66,0x67,0x43,0x76,0x20,0x6E,0x6A,0x48,0x39,0x66,0x49,0x6D,0x2F, + 0x64,0x6A,0x67,0x77,0x5A,0x4C,0x36,0x7A,0x56,0x38,0x39,0x6B,0x38,0x4B,0x4F, + 0x50,0x46,0x48,0x71,0x59,0x74,0x76,0x4D,0x31,0x38,0x6A,0x73,0x36,0x31,0x56, + 0x4D,0x30,0x55,0x4A,0x65,0x74,0x4F,0x66,0x51,0x46,0x58,0x59,0x73,0x4A,0x34, + 0x2B,0x36,0x64,0x76,0x66,0x53,0x6C,0x36,0x52,0x76,0x7A,0x32,0x48,0x47,0x6F, + 0x67,0x5A,0x2F,0x31,0x20,0x5A,0x63,0x6E,0x70,0x6D,0x49,0x75,0x61,0x49,0x78, + 0x66,0x41,0x7A,0x2F,0x71,0x79,0x37,0x43,0x69,0x39,0x57,0x33,0x41,0x76,0x70, + 0x69,0x31,0x64,0x43,0x2F,0x56,0x6A,0x41,0x6E,0x56,0x6E,0x41,0x4B,0x45,0x76, + 0x35,0x73,0x4F,0x59,0x38,0x4F,0x33,0x71,0x4B,0x50,0x65,0x5A,0x39,0x4F,0x48, + 0x46,0x58,0x74,0x4F,0x66,0x56,0x44,0x2B,0x2F,0x39,0x68,0x6B,0x59,0x4E,0x39, + 0x32,0x43,0x20,0x46,0x33,0x75,0x7A,0x73,0x32,0x36,0x45,0x59,0x73,0x48,0x56, + 0x6D,0x44,0x62,0x31,0x59,0x61,0x67,0x50,0x45,0x36,0x67,0x72,0x41,0x77,0x68, + 0x39,0x49,0x51,0x39,0x67,0x74,0x70,0x65,0x4F,0x52,0x4F,0x2B,0x6F,0x78,0x34, + 0x36,0x44,0x44,0x66,0x7A,0x69,0x62,0x46,0x31,0x39,0x50,0x41,0x4C,0x34,0x78, + 0x64,0x6B,0x4D,0x4F,0x77,0x34,0x32,0x6C,0x4A,0x71,0x6E,0x73,0x51,0x50,0x54, + 0x20,0x78,0x6D,0x72,0x65,0x42,0x4F,0x70,0x69,0x45,0x4C,0x44,0x6F,0x53,0x33, + 0x67,0x4D,0x2B,0x46,0x54,0x55,0x65,0x37,0x31,0x32,0x4A,0x73,0x50,0x50,0x2B, + 0x72,0x49,0x36,0x31,0x4B,0x36,0x4F,0x4F,0x54,0x66,0x70,0x73,0x66,0x4E,0x77, + 0x41,0x37,0x2B,0x2B,0x4A,0x4D,0x66,0x6D,0x52,0x5A,0x48,0x44,0x67,0x53,0x39, + 0x6A,0x7A,0x6D,0x56,0x38,0x6F,0x4A,0x59,0x48,0x42,0x32,0x76,0x2B,0x20,0x45, + 0x52,0x63,0x53,0x2F,0x79,0x72,0x67,0x58,0x34,0x67,0x6F,0x2F,0x72,0x45,0x63, + 0x66,0x50,0x39,0x6F,0x41,0x79,0x39,0x4C,0x2F,0x4B,0x6B,0x67,0x41,0x46,0x37, + 0x75,0x79,0x2F,0x4C,0x39,0x6F,0x77,0x32,0x6C,0x62,0x4C,0x6A,0x79,0x4B,0x55, + 0x79,0x62,0x57,0x77,0x57,0x31,0x47,0x51,0x33,0x55,0x74,0x41,0x45,0x55,0x4C, + 0x64,0x2F,0x39,0x4E,0x68,0x48,0x58,0x37,0x52,0x64,0x43,0x20,0x2F,0x6D,0x4D, + 0x6A,0x36,0x75,0x75,0x6E,0x6A,0x57,0x4D,0x6A,0x58,0x71,0x6C,0x64,0x67,0x75, + 0x33,0x41,0x50,0x32,0x4C,0x61,0x59,0x4D,0x32,0x5A,0x51,0x4D,0x30,0x61,0x51, + 0x4F,0x69,0x44,0x76,0x67,0x4C,0x34,0x4A,0x38,0x78,0x68,0x6D,0x73,0x37,0x73, + 0x4F,0x5A,0x31,0x68,0x35,0x2B,0x47,0x47,0x57,0x44,0x62,0x54,0x46,0x4C,0x58, + 0x4A,0x2B,0x53,0x6E,0x54,0x4A,0x64,0x68,0x7A,0x20,0x4F,0x72,0x49,0x63,0x62, + 0x73,0x4B,0x30,0x77,0x53,0x75,0x67,0x74,0x6B,0x79,0x67,0x4A,0x67,0x32,0x67, + 0x53,0x50,0x7A,0x2F,0x41,0x6C,0x7A,0x76,0x65,0x6F,0x2B,0x78,0x48,0x4F,0x77, + 0x36,0x32,0x73,0x41,0x72,0x70,0x78,0x58,0x79,0x43,0x39,0x4D,0x6C,0x65,0x4F, + 0x56,0x30,0x6C,0x6C,0x33,0x52,0x75,0x77,0x54,0x58,0x59,0x39,0x70,0x69,0x54, + 0x5A,0x6C,0x41,0x7A,0x52,0x6C,0x41,0x20,0x6B,0x66,0x68,0x2F,0x41,0x47,0x78, + 0x77,0x76,0x55,0x66,0x66,0x6D,0x4D,0x66,0x2F,0x50,0x64,0x6A,0x49,0x63,0x59, + 0x58,0x38,0x6F,0x6F,0x6A,0x6A,0x49,0x36,0x5A,0x74,0x52,0x4D,0x77,0x5A,0x32, + 0x49,0x42,0x70,0x6B,0x7A,0x56,0x6A,0x41,0x6A,0x56,0x6C,0x41,0x45,0x56,0x39, + 0x2F,0x76,0x38,0x48,0x72,0x48,0x57,0x39,0x78,0x38,0x46,0x7A,0x4A,0x75,0x51, + 0x66,0x6E,0x59,0x71,0x78,0x20,0x59,0x71,0x4B,0x75,0x47,0x4A,0x32,0x43,0x6E, + 0x59,0x63,0x62,0x4F,0x48,0x67,0x75,0x6B,0x6A,0x7A,0x57,0x59,0x74,0x72,0x6D, + 0x47,0x6B,0x69,0x2B,0x43,0x64,0x53,0x4D,0x41,0x52,0x53,0x4A,0x2F,0x35,0x2B, + 0x49,0x6B,0x4F,0x44,0x7A,0x32,0x70,0x6B,0x4D,0x7A,0x78,0x35,0x58,0x52,0x70, + 0x2B,0x59,0x6D,0x31,0x77,0x41,0x7A,0x78,0x37,0x50,0x38,0x74,0x71,0x5A,0x53, + 0x42,0x4B,0x35,0x20,0x47,0x74,0x4E,0x47,0x31,0x30,0x43,0x79,0x54,0x61,0x42, + 0x6D,0x44,0x43,0x44,0x50,0x4B,0x75,0x42,0x2F,0x34,0x39,0x6A,0x6E,0x44,0x34, + 0x44,0x64,0x76,0x56,0x6C,0x65,0x37,0x74,0x50,0x68,0x76,0x4D,0x4B,0x4E,0x6C, + 0x2F,0x75,0x79,0x37,0x4F,0x36,0x4E,0x4E,0x45,0x35,0x30,0x50,0x61,0x61,0x74, + 0x72,0x6F,0x71,0x37,0x54,0x6E,0x46,0x53,0x45,0x77,0x59,0x51,0x63,0x74,0x41, + 0x6E,0x20,0x63,0x52,0x7A,0x74,0x39,0x77,0x50,0x34,0x30,0x59,0x6B,0x73,0x62, + 0x79,0x69,0x72,0x54,0x30,0x54,0x6B,0x6A,0x62,0x4D,0x5A,0x6E,0x6A,0x75,0x65, + 0x6A,0x62,0x4B,0x67,0x36,0x42,0x5A,0x4D,0x6D,0x30,0x31,0x73,0x46,0x4A,0x42, + 0x34,0x56,0x59,0x51,0x2B,0x75,0x4D,0x64,0x77,0x6E,0x4F,0x66,0x50,0x42,0x66, + 0x44,0x44,0x34,0x31,0x6E,0x65,0x30,0x51,0x6F,0x2B,0x55,0x53,0x49,0x48,0x20, + 0x7A,0x32,0x58,0x34,0x59,0x62,0x54,0x75,0x34,0x33,0x5A,0x4D,0x32,0x30,0x32, + 0x6B,0x43,0x53,0x52,0x61,0x47,0x61,0x45,0x50,0x37,0x44,0x34,0x63,0x4D,0x2F, + 0x78,0x79,0x41,0x66,0x7A,0x67,0x61,0x41,0x4E,0x48,0x68,0x68,0x50,0x39,0x54, + 0x78,0x51,0x31,0x78,0x4A,0x48,0x68,0x44,0x44,0x38,0x34,0x32,0x68,0x44,0x46, + 0x42,0x44,0x35,0x46,0x66,0x68,0x4F,0x61,0x70,0x4A,0x6C,0x41,0x20,0x59,0x74, + 0x56,0x52,0x74,0x4B,0x72,0x76,0x53,0x5A,0x66,0x33,0x35,0x67,0x4C,0x34,0x33, + 0x70,0x45,0x47,0x54,0x70,0x7A,0x58,0x4E,0x4A,0x2B,0x49,0x6C,0x78,0x50,0x6E, + 0x50,0x62,0x35,0x33,0x4A,0x4A,0x49,0x4A,0x50,0x45,0x6B,0x43,0x56,0x78,0x45, + 0x6D,0x30,0x67,0x42,0x43,0x48,0x39,0x41,0x57,0x48,0x46,0x66,0x31,0x2B,0x51, + 0x45,0x38,0x63,0x36,0x7A,0x6B,0x31,0x56,0x35,0x43,0x20,0x7A,0x49,0x72,0x5A, + 0x6C,0x62,0x67,0x68,0x79,0x70,0x6A,0x41,0x44,0x6B,0x79,0x62,0x54,0x6F,0x77, + 0x4A,0x4A,0x4E,0x49,0x41,0x38,0x71,0x7A,0x42,0x54,0x4B,0x56,0x59,0x34,0x2B, + 0x66,0x37,0x2F,0x45,0x72,0x77,0x45,0x65,0x58,0x6D,0x2B,0x49,0x6A,0x48,0x44, + 0x36,0x4D,0x4E,0x44,0x4C,0x34,0x37,0x50,0x5A,0x67,0x45,0x45,0x6D,0x63,0x41, + 0x52,0x53,0x50,0x2B,0x31,0x6F,0x6B,0x2B,0x20,0x41,0x66,0x44,0x6A,0x58,0x32, + 0x58,0x56,0x35,0x78,0x63,0x56,0x34,0x38,0x68,0x77,0x68,0x68,0x2F,0x2F,0x79, + 0x6E,0x6D,0x4B,0x63,0x43,0x30,0x4A,0x6D,0x68,0x6C,0x49,0x6C,0x46,0x70,0x43, + 0x48,0x38,0x68,0x6E,0x4D,0x61,0x65,0x31,0x57,0x4C,0x50,0x37,0x70,0x45,0x62, + 0x37,0x52,0x65,0x56,0x35,0x5A,0x79,0x6A,0x44,0x37,0x70,0x50,0x4F,0x2B,0x53, + 0x56,0x33,0x59,0x74,0x70,0x34,0x20,0x31,0x55,0x6D,0x4D,0x59,0x6B,0x4C,0x69, + 0x76,0x77,0x33,0x48,0x38,0x2F,0x6C,0x65,0x4F,0x35,0x50,0x68,0x7A,0x59,0x48, + 0x45,0x2F,0x46,0x4E,0x45,0x79,0x6E,0x68,0x7A,0x49,0x42,0x4D,0x6C,0x59,0x2F, + 0x41,0x52,0x59,0x6A,0x69,0x55,0x70,0x6C,0x53,0x53,0x70,0x70,0x6F,0x31,0x6D, + 0x48,0x58,0x39,0x31,0x68,0x77,0x5A,0x4E,0x6A,0x76,0x34,0x43,0x46,0x46,0x4E, + 0x58,0x75,0x36,0x4C,0x20,0x31,0x50,0x33,0x38,0x4E,0x6C,0x55,0x65,0x44,0x30, + 0x69,0x45,0x41,0x52,0x54,0x31,0x2B,0x35,0x66,0x62,0x76,0x71,0x39,0x76,0x7A, + 0x4F,0x50,0x5A,0x34,0x31,0x72,0x4F,0x4B,0x35,0x4C,0x42,0x73,0x38,0x65,0x64, + 0x54,0x79,0x39,0x65,0x6A,0x75,0x4D,0x55,0x64,0x39,0x78,0x55,0x33,0x51,0x43, + 0x69,0x39,0x76,0x74,0x48,0x70,0x38,0x78,0x30,0x6E,0x78,0x62,0x32,0x69,0x4B, + 0x53,0x51,0x20,0x79,0x30,0x39,0x42,0x4F,0x36,0x34,0x30,0x72,0x65,0x70,0x34, + 0x51,0x4E,0x55,0x4E,0x49,0x4D,0x38,0x31,0x4F,0x50,0x54,0x37,0x7A,0x58,0x53, + 0x66,0x6C,0x76,0x53,0x4B,0x35,0x44,0x45,0x36,0x5A,0x64,0x71,0x6D,0x34,0x2F, + 0x54,0x67,0x49,0x78,0x67,0x4E,0x56,0x4A,0x79,0x6B,0x47,0x4D,0x44,0x6A,0x4C, + 0x6F,0x56,0x66,0x4F,0x71,0x58,0x6A,0x74,0x30,0x56,0x79,0x36,0x52,0x33,0x31, + 0x20,0x2B,0x4F,0x6B,0x70,0x35,0x33,0x45,0x70,0x4A,0x77,0x33,0x45,0x52,0x52, + 0x49,0x4D,0x34,0x41,0x76,0x41,0x72,0x62,0x61,0x46,0x33,0x78,0x37,0x4D,0x61, + 0x4C,0x39,0x2B,0x6B,0x58,0x6A,0x65,0x4F,0x4A,0x74,0x78,0x50,0x62,0x4C,0x38, + 0x56,0x6F,0x77,0x57,0x4B,0x6B,0x71,0x31,0x6C,0x58,0x51,0x6A,0x38,0x47,0x65, + 0x32,0x68,0x51,0x63,0x6E,0x50,0x48,0x62,0x33,0x61,0x73,0x52,0x66,0x20,0x31, + 0x41,0x61,0x37,0x65,0x37,0x4D,0x4D,0x54,0x6A,0x68,0x46,0x71,0x6E,0x2B,0x47, + 0x30,0x55,0x54,0x46,0x71,0x4C,0x59,0x42,0x50,0x47,0x78,0x62,0x73,0x4C,0x43, + 0x75,0x76,0x34,0x52,0x6A,0x6E,0x59,0x53,0x6F,0x4B,0x4A,0x4F,0x2B,0x61,0x62, + 0x4F,0x4F,0x34,0x77,0x48,0x57,0x6D,0x6F,0x69,0x44,0x61,0x68,0x71,0x41,0x30, + 0x36,0x6A,0x2F,0x4B,0x36,0x65,0x7A,0x6E,0x43,0x37,0x39,0x20,0x7A,0x48,0x63, + 0x68,0x4B,0x73,0x72,0x70,0x4D,0x59,0x39,0x58,0x54,0x6A,0x74,0x46,0x72,0x52, + 0x57,0x64,0x46,0x61,0x69,0x57,0x41,0x61,0x7A,0x43,0x59,0x64,0x54,0x2F,0x78, + 0x48,0x6D,0x50,0x6E,0x30,0x66,0x62,0x6D,0x30,0x32,0x49,0x71,0x76,0x50,0x7A, + 0x4D,0x78,0x6E,0x58,0x70,0x65,0x6D,0x50,0x55,0x4B,0x47,0x74,0x78,0x4B,0x71, + 0x6C,0x71,0x67,0x64,0x74,0x43,0x30,0x37,0x36,0x20,0x38,0x4C,0x7A,0x37,0x67, + 0x67,0x73,0x68,0x45,0x6B,0x4F,0x41,0x61,0x63,0x4F,0x4F,0x33,0x56,0x64,0x72, + 0x6A,0x5A,0x52,0x43,0x4E,0x51,0x7A,0x67,0x67,0x38,0x41,0x66,0x32,0x68,0x5A, + 0x2B,0x75,0x53,0x2F,0x4C,0x38,0x4B,0x52,0x43,0x66,0x31,0x48,0x62,0x44,0x45, + 0x39,0x36,0x72,0x70,0x76,0x53,0x2F,0x69,0x46,0x47,0x4B,0x32,0x57,0x6C,0x47, + 0x67,0x5A,0x77,0x76,0x32,0x33,0x42,0x20,0x55,0x36,0x4D,0x65,0x62,0x32,0x72, + 0x4B,0x54,0x39,0x51,0x4A,0x62,0x35,0x37,0x4E,0x63,0x4D,0x6F,0x74,0x66,0x38, + 0x56,0x61,0x4B,0x31,0x47,0x70,0x74,0x4C,0x72,0x2B,0x46,0x4D,0x75,0x4E,0x50, + 0x66,0x30,0x41,0x6E,0x6A,0x2B,0x70,0x30,0x46,0x2F,0x55,0x44,0x77,0x47,0x6D, + 0x54,0x54,0x76,0x4D,0x43,0x6D,0x77,0x48,0x2F,0x72,0x68,0x73,0x46,0x61,0x4C, + 0x79,0x42,0x6D,0x44,0x74,0x20,0x61,0x48,0x76,0x37,0x4D,0x77,0x79,0x4D,0x4B, + 0x2F,0x51,0x58,0x39,0x63,0x58,0x41,0x75,0x4D,0x66,0x65,0x66,0x69,0x66,0x5A, + 0x6C,0x54,0x55,0x4B,0x71,0x4B,0x51,0x42,0x2F,0x44,0x6E,0x51,0x59,0x31,0x50, + 0x77,0x2F,0x4A,0x54,0x48,0x61,0x32,0x65,0x55,0x38,0x43,0x50,0x71,0x6B,0x39, + 0x66,0x4F,0x5A,0x46,0x31,0x4F,0x6F,0x31,0x36,0x48,0x30,0x55,0x35,0x5A,0x71, + 0x4A,0x51,0x42,0x20,0x64,0x41,0x47,0x66,0x74,0x79,0x33,0x38,0x30,0x71,0x6D, + 0x4D,0x45,0x6E,0x35,0x45,0x33,0x54,0x4C,0x70,0x6D,0x7A,0x62,0x75,0x77,0x4F, + 0x63,0x78,0x47,0x6F,0x71,0x64,0x53,0x68,0x6E,0x41,0x41,0x37,0x59,0x46,0x65, + 0x30,0x63,0x39,0x44,0x6D,0x68,0x72,0x4C,0x31,0x48,0x6E,0x48,0x42,0x6A,0x4B, + 0x75,0x43,0x35,0x6F,0x73,0x39,0x61,0x51,0x43,0x35,0x56,0x51,0x57,0x68,0x63, + 0x4F,0x20,0x36,0x59,0x33,0x4B,0x39,0x52,0x64,0x70,0x34,0x55,0x57,0x33,0x74, + 0x76,0x34,0x77,0x5A,0x59,0x67,0x43,0x4B,0x6D,0x45,0x41,0x39,0x39,0x6B,0x57, + 0x66,0x47,0x63,0x6F,0x77,0x78,0x6D,0x6C,0x2B,0x34,0x71,0x55,0x63,0x48,0x72, + 0x4D,0x63,0x7A,0x32,0x43,0x33,0x46,0x70,0x4C,0x74,0x6C,0x54,0x43,0x41,0x4B, + 0x78,0x47,0x4D,0x51,0x4E,0x67,0x6A,0x39,0x4A,0x39,0x52,0x63,0x70,0x34,0x20, + 0x35,0x58,0x54,0x47,0x5A,0x61,0x6F,0x37,0x39,0x68,0x6D,0x42,0x63,0x69,0x76, + 0x75,0x58,0x6D,0x43,0x6C,0x54,0x63,0x45,0x44,0x67,0x35,0x72,0x32,0x45,0x2B, + 0x6C,0x6A,0x59,0x4E,0x7A,0x6A,0x67,0x50,0x32,0x2B,0x41,0x53,0x73,0x78,0x6D, + 0x6F,0x71,0x4E,0x63,0x68,0x75,0x41,0x6E,0x76,0x35,0x43,0x7A,0x4D,0x47,0x65, + 0x4D,0x39,0x57,0x4C,0x41,0x73,0x71,0x70,0x75,0x67,0x38,0x43,0x20,0x31,0x39, + 0x6F,0x55,0x66,0x48,0x73,0x67,0x77,0x35,0x44,0x62,0x78,0x67,0x6C,0x43,0x31, + 0x41,0x31,0x44,0x45,0x78,0x35,0x76,0x32,0x35,0x39,0x72,0x63,0x53,0x30,0x78, + 0x72,0x68,0x45,0x6F,0x70,0x77,0x48,0x59,0x5A,0x2F,0x30,0x70,0x33,0x31,0x2B, + 0x6B,0x48,0x45,0x63,0x4E,0x78,0x42,0x59,0x46,0x6C,0x45,0x74,0x35,0x50,0x56, + 0x6A,0x6D,0x2F,0x42,0x38,0x5A,0x56,0x74,0x39,0x66,0x20,0x69,0x49,0x46,0x78, + 0x7A,0x2B,0x56,0x67,0x6B,0x65,0x31,0x59,0x5A,0x74,0x58,0x4F,0x52,0x62,0x6B, + 0x4D,0x34,0x44,0x2F,0x62,0x46,0x6E,0x54,0x4D,0x69,0x78,0x61,0x69,0x62,0x6E, + 0x48,0x55,0x67,0x72,0x58,0x47,0x4C,0x6B,0x57,0x35,0x31,0x48,0x65,0x50,0x54, + 0x61,0x48,0x54,0x59,0x78,0x34,0x6E,0x33,0x58,0x5A,0x4B,0x45,0x61,0x4A,0x75, + 0x4F,0x58,0x6E,0x65,0x63,0x7A,0x6C,0x5A,0x20,0x36,0x42,0x36,0x41,0x4A,0x31, + 0x34,0x5A,0x4C,0x2B,0x6C,0x76,0x6C,0x73,0x4D,0x41,0x37,0x67,0x42,0x57,0x32, + 0x78,0x52,0x38,0x58,0x55,0x39,0x2F,0x49,0x61,0x62,0x78,0x43,0x33,0x74,0x4E, + 0x72,0x4D,0x62,0x78,0x42,0x4F,0x32,0x5A,0x4B,0x49,0x63,0x43,0x72,0x5A,0x37, + 0x2B,0x34,0x7A,0x6B,0x34,0x35,0x4A,0x59,0x46,0x4A,0x55,0x54,0x64,0x63,0x2B, + 0x68,0x63,0x68,0x76,0x47,0x63,0x20,0x64,0x66,0x47,0x50,0x51,0x32,0x6C,0x52, + 0x51,0x4E,0x77,0x4B,0x37,0x41,0x49,0x2B,0x61,0x6C,0x50,0x77,0x6C,0x30,0x4D, + 0x5A,0x6E,0x65,0x73,0x6E,0x52,0x42,0x47,0x35,0x77,0x47,0x6A,0x44,0x6B,0x6F, + 0x39,0x53,0x34,0x76,0x71,0x41,0x75,0x41,0x33,0x67,0x44,0x74,0x75,0x43,0x2B, + 0x2B,0x7A,0x6E,0x50,0x59,0x56,0x49,0x46,0x59,0x37,0x61,0x73,0x4E,0x62,0x63, + 0x54,0x4D,0x53,0x74,0x20,0x77,0x72,0x74,0x74,0x43,0x76,0x57,0x4E,0x65,0x5A, + 0x7A,0x56,0x31,0x4A,0x38,0x51,0x4D,0x33,0x4A,0x32,0x33,0x48,0x50,0x5A,0x4F, + 0x2F,0x42,0x75,0x69,0x4E,0x34,0x4E,0x69,0x4E,0x4D,0x41,0x6C,0x6D,0x42,0x70, + 0x41,0x50,0x76,0x31,0x39,0x42,0x66,0x69,0x6B,0x6A,0x69,0x63,0x4B,0x33,0x67, + 0x33,0x52,0x6E,0x75,0x52,0x69,0x46,0x4F,0x4A,0x56,0x71,0x46,0x49,0x41,0x4B, + 0x35,0x4C,0x20,0x49,0x49,0x56,0x49,0x48,0x51,0x66,0x50,0x4F,0x61,0x30,0x50, + 0x69,0x4E,0x77,0x4E,0x71,0x4C,0x67,0x42,0x48,0x42,0x2F,0x78,0x58,0x45,0x59, + 0x35,0x68,0x55,0x67,0x6C,0x34,0x7A,0x6D,0x6A,0x46,0x55,0x73,0x53,0x59,0x51, + 0x43,0x33,0x32,0x78,0x54,0x53,0x30,0x31,0x38,0x49,0x4F,0x78,0x79,0x30,0x63, + 0x6A,0x74,0x45,0x47,0x77,0x65,0x49,0x53,0x34,0x32,0x62,0x73,0x45,0x6A,0x2B, + 0x20,0x38,0x51,0x4D,0x34,0x4C,0x41,0x4D,0x51,0x77,0x6F,0x72,0x44,0x35,0x7A, + 0x4B,0x32,0x5A,0x77,0x69,0x73,0x78,0x6D,0x6A,0x51,0x6D,0x62,0x6A,0x55,0x61, + 0x4C,0x58,0x77,0x52,0x2B,0x47,0x2F,0x45,0x50,0x59,0x34,0x64,0x67,0x4F,0x73, + 0x4E,0x46,0x68,0x4D,0x53,0x51,0x59,0x51,0x43,0x6A,0x6D,0x73,0x55,0x68,0x4B, + 0x50,0x6A,0x2B,0x6A,0x70,0x4C,0x34,0x51,0x4C,0x44,0x70,0x71,0x35,0x20,0x45, + 0x39,0x79,0x37,0x41,0x58,0x45,0x6F,0x73,0x67,0x76,0x59,0x5A,0x6C,0x50,0x51, + 0x38,0x59,0x68,0x6B,0x49,0x56,0x4B,0x50,0x67,0x32,0x61,0x32,0x45,0x53,0x45, + 0x72,0x4D,0x41,0x34,0x44,0x75,0x4E,0x6D,0x6D,0x30,0x50,0x43,0x6B,0x6B,0x6E, + 0x2B,0x45,0x63,0x4F,0x58,0x73,0x75,0x4F,0x64,0x79,0x4F,0x72,0x61,0x56,0x46, + 0x73,0x4E,0x55,0x7A,0x41,0x43,0x4F,0x32,0x76,0x64,0x6C,0x20,0x68,0x42,0x41, + 0x68,0x48,0x4C,0x52,0x54,0x4F,0x51,0x4D,0x49,0x39,0x54,0x56,0x75,0x73,0x53, + 0x6C,0x2F,0x62,0x46,0x67,0x47,0x49,0x45,0x51,0x55,0x48,0x4C,0x52,0x7A,0x43, + 0x37,0x69,0x4E,0x41,0x35,0x51,0x61,0x41,0x54,0x51,0x41,0x4E,0x38,0x35,0x56, + 0x4B,0x41,0x42,0x36,0x52,0x7A,0x55,0x41,0x4B,0x45,0x51,0x55,0x65,0x6B,0x65, + 0x74,0x73,0x77,0x4A,0x76,0x78,0x47,0x6A,0x53,0x20,0x6D,0x6C,0x4A,0x56,0x65, + 0x5A,0x56,0x4E,0x6F,0x59,0x46,0x78,0x54,0x66,0x38,0x4A,0x45,0x5A,0x58,0x78, + 0x48,0x43,0x37,0x37,0x5A,0x6C,0x70,0x70,0x73,0x6B,0x43,0x70,0x42,0x72,0x44, + 0x56,0x70,0x70,0x44,0x6A,0x49,0x59,0x68,0x43,0x69,0x43,0x49,0x63,0x4E,0x47, + 0x53,0x6C,0x79,0x51,0x49,0x56,0x4D,0x51,0x43,0x48,0x70,0x59,0x31,0x43,0x69, + 0x42,0x6C,0x77,0x30,0x46,0x44,0x35,0x20,0x44,0x53,0x41,0x30,0x79,0x48,0x43, + 0x44,0x54,0x58,0x6D,0x48,0x6A,0x51,0x36,0x46,0x45,0x44,0x50,0x67,0x6F,0x4B, + 0x45,0x62,0x77,0x48,0x34,0x67,0x73,0x4A,0x51,0x49,0x6F,0x42,0x6E,0x59,0x4F, + 0x46,0x63,0x68,0x50,0x34,0x42,0x42,0x7A,0x66,0x38,0x4C,0x55,0x52,0x4B,0x44, + 0x34,0x35,0x37,0x74,0x75,0x6F,0x43,0x4E,0x47,0x47,0x31,0x61,0x55,0x59,0x6F, + 0x42,0x57,0x41,0x30,0x32,0x20,0x6E,0x42,0x33,0x33,0x58,0x4E,0x59,0x31,0x43, + 0x79,0x46,0x6D,0x49,0x41,0x43,0x58,0x52,0x44,0x72,0x72,0x67,0x63,0x42,0x53, + 0x44,0x4D,0x44,0x71,0x33,0x4C,0x39,0x2B,0x50,0x66,0x32,0x46,0x69,0x41,0x55, + 0x48,0x4C,0x56,0x6C,0x70,0x45,0x30,0x6F,0x7A,0x41,0x4B,0x76,0x6C,0x68,0x7A, + 0x49,0x41,0x49,0x65,0x4C,0x42,0x51,0x55,0x76,0x57,0x53,0x34,0x50,0x4C,0x33, + 0x67,0x58,0x51,0x20,0x75,0x58,0x39,0x43,0x78,0x45,0x4D,0x35,0x63,0x67,0x47, + 0x63,0x44,0x53,0x41,0x30,0x75,0x72,0x6A,0x65,0x70,0x76,0x7A,0x67,0x68,0x4F, + 0x74,0x66,0x45,0x45,0x4C,0x4D,0x68,0x49,0x4F,0x57,0x31,0x6F,0x50,0x64,0x54, + 0x45,0x44,0x55,0x43,0x4B,0x41,0x42,0x57,0x44,0x4E,0x58,0x6F,0x51,0x41,0x59, + 0x6D,0x56,0x49,0x45,0x49,0x45,0x51,0x63,0x6A,0x45,0x78,0x5A,0x44,0x36,0x69, + 0x76,0x20,0x77,0x54,0x49,0x6C,0x4F,0x4B,0x6F,0x42,0x72,0x4C,0x51,0x70,0x4E, + 0x44,0x4A,0x70,0x50,0x58,0x55,0x68,0x68,0x4A,0x67,0x44,0x50,0x7A,0x43,0x61, + 0x73,0x73,0x52,0x4B,0x6F,0x31,0x45,0x4E,0x77,0x4F,0x70,0x73,0x38,0x75,0x48, + 0x4A,0x69,0x48,0x63,0x58,0x51,0x73,0x79,0x49,0x67,0x36,0x61,0x73,0x4E,0x46, + 0x70,0x57,0x41,0x7A,0x68,0x6E,0x37,0x31,0x5A,0x43,0x43,0x41,0x73,0x63,0x20, + 0x4E,0x46,0x56,0x57,0x41,0x37,0x41,0x36,0x2F,0x6C,0x73,0x52,0x67,0x42,0x44, + 0x78,0x34,0x71,0x41,0x70,0x4B,0x34,0x31,0x47,0x4E,0x51,0x43,0x72,0x76,0x63, + 0x66,0x47,0x63,0x34,0x6F,0x41,0x68,0x49,0x67,0x54,0x42,0x30,0x31,0x5A,0x61, + 0x62,0x53,0x73,0x67,0x34,0x44,0x6E,0x70,0x79,0x4C,0x65,0x58,0x51,0x67,0x78, + 0x49,0x77,0x36,0x61,0x4B,0x75,0x73,0x67,0x59,0x49,0x64,0x4E,0x20,0x6F,0x51, + 0x6C,0x66,0x45,0x59,0x41,0x51,0x63,0x65,0x4B,0x67,0x4B,0x53,0x75,0x4E,0x6C, + 0x72,0x6B,0x4C,0x45,0x50,0x48,0x75,0x51,0x6F,0x67,0x5A,0x63,0x64,0x42,0x55, + 0x57,0x62,0x73,0x41,0x6C,0x68,0x46,0x41,0x78,0x4C,0x73,0x4C,0x49,0x57,0x62, + 0x45,0x51,0x56,0x4E,0x6C,0x6A,0x51,0x42,0x61,0x62,0x51,0x70,0x4E,0x79,0x51, + 0x43,0x45,0x69,0x42,0x55,0x48,0x54,0x56,0x6C,0x70,0x20,0x4E,0x4B,0x6F,0x42, + 0x74,0x4E,0x6B,0x55,0x6D,0x74,0x49,0x59,0x67,0x42,0x43,0x78,0x34,0x71,0x41, + 0x70,0x4B,0x34,0x30,0x36,0x47,0x55,0x42,0x6F,0x63,0x55,0x47,0x54,0x54,0x66, + 0x6D,0x63,0x30,0x6F,0x43,0x46,0x69,0x42,0x55,0x48,0x53,0x57,0x56,0x68,0x37, + 0x67,0x56,0x42,0x55,0x53,0x49,0x41,0x44,0x32,0x69,0x78,0x4B,0x53,0x67,0x44, + 0x45,0x43,0x4A,0x65,0x4A,0x75,0x32,0x37,0x20,0x41,0x50,0x4D,0x78,0x57,0x72, + 0x30,0x6B,0x4F,0x71,0x31,0x44,0x69,0x42,0x51,0x6A,0x41,0x78,0x41,0x69,0x78, + 0x63,0x67,0x41,0x68,0x4B,0x67,0x68,0x47,0x75,0x30,0x56,0x4F,0x34,0x4C,0x46, + 0x6B,0x45,0x45,0x55,0x41,0x77,0x69,0x41,0x4D,0x5A,0x75,0x43,0x57,0x55,0x30, + 0x43,0x43,0x42,0x45,0x72,0x44,0x70,0x4C,0x4B,0x41,0x64,0x79,0x2F,0x35,0x64, + 0x49,0x37,0x68,0x44,0x73,0x5A,0x20,0x51,0x4F,0x68,0x6D,0x56,0x70,0x73,0x54, + 0x79,0x51,0x43,0x45,0x69,0x4A,0x65,0x4D,0x76,0x61,0x61,0x73,0x4E,0x42,0x71, + 0x31,0x43,0x7A,0x42,0x73,0x55,0x36,0x67,0x68,0x6F,0x32,0x6B,0x41,0x49,0x65, + 0x4C,0x45,0x51,0x56,0x4F,0x6A,0x4E,0x6F,0x57,0x69,0x47,0x6F,0x44,0x56,0x7A, + 0x52,0x73,0x30,0x77,0x69,0x42,0x45,0x72,0x43,0x51,0x6C,0x41,0x68,0x69,0x30, + 0x4B,0x64,0x51,0x6B,0x20,0x41,0x78,0x41,0x69,0x56,0x68,0x77,0x30,0x5A,0x61, + 0x58,0x52,0x71,0x42,0x4C,0x74,0x74,0x79,0x6E,0x55,0x6E,0x49,0x31,0x34,0x64, + 0x79,0x48,0x45,0x6A,0x44,0x68,0x6F,0x79,0x6B,0x71,0x6A,0x5A,0x59,0x34,0x41, + 0x4E,0x41,0x59,0x67,0x52,0x4A,0x77,0x34,0x61,0x4B,0x71,0x73,0x45,0x63,0x42, + 0x78,0x6D,0x30,0x4C,0x7A,0x72,0x48,0x59,0x6D,0x46,0x30,0x4C,0x59,0x30,0x6D, + 0x71,0x76,0x20,0x71,0x5A,0x4D,0x32,0x68,0x63,0x72,0x63,0x42,0x56,0x41,0x45, + 0x49,0x45,0x53,0x63,0x74,0x4E,0x68,0x72,0x71,0x73,0x2B,0x6D,0x55,0x46,0x51, + 0x44,0x4F,0x47,0x4A,0x54,0x71,0x4B,0x30,0x78,0x34,0x74,0x32,0x46,0x45,0x44, + 0x50,0x69,0x6F,0x43,0x6B,0x72,0x6A,0x55,0x59,0x31,0x67,0x49,0x4D,0x32,0x68, + 0x64,0x6F,0x62,0x46,0x51,0x45,0x49,0x45,0x53,0x63,0x4F,0x6D,0x72,0x4C,0x53, + 0x20,0x61,0x46,0x6B,0x6A,0x67,0x50,0x6D,0x4B,0x41,0x49,0x53,0x49,0x46,0x51, + 0x64,0x4E,0x6C,0x54,0x55,0x43,0x73,0x4F,0x77,0x43,0x42,0x43,0x36,0x35,0x79, + 0x30,0x4B,0x49,0x53,0x35,0x44,0x78,0x6A,0x4B,0x59,0x73,0x4B,0x61,0x73,0x42, + 0x54,0x41,0x47,0x48,0x35,0x69,0x72,0x6B,0x34,0x56,0x52,0x68,0x49,0x63,0x51, + 0x6C,0x6D,0x4E,0x39,0x67,0x2F,0x55,0x41,0x39,0x68,0x4E,0x48,0x6F,0x20,0x6E, + 0x44,0x67,0x62,0x51,0x47,0x68,0x42,0x30,0x44,0x36,0x62,0x38,0x68,0x31,0x57, + 0x6D,0x34,0x63,0x4A,0x49,0x65,0x62,0x43,0x51,0x55,0x76,0x37,0x59,0x4F,0x36, + 0x56,0x67,0x46,0x44,0x61,0x66,0x67,0x42,0x76,0x32,0x42,0x54,0x71,0x62,0x46, + 0x59,0x45,0x49,0x45,0x51,0x63,0x4F,0x47,0x6A,0x4A,0x53,0x70,0x74,0x51,0x6D, + 0x67,0x48,0x73,0x74,0x53,0x6E,0x55,0x4A,0x51,0x4D,0x51,0x20,0x49,0x68,0x59, + 0x63,0x74,0x47,0x53,0x6C,0x54,0x61,0x69,0x41,0x41,0x53,0x79,0x55,0x41,0x51, + 0x67,0x52,0x43,0x77,0x35,0x61,0x71,0x6F,0x67,0x42,0x57,0x49,0x55,0x5A,0x43, + 0x35,0x73,0x31,0x45,0x79,0x42,0x45,0x71,0x58,0x67,0x6B,0x4C,0x77,0x49,0x34, + 0x44,0x37,0x77,0x35,0x56,0x36,0x47,0x73,0x42,0x78,0x32,0x4B,0x41,0x6F,0x51, + 0x6F,0x69,0x59,0x37,0x6D,0x77,0x48,0x59,0x76,0x20,0x67,0x44,0x65,0x42,0x53, + 0x78,0x38,0x47,0x45,0x43,0x4B,0x53,0x41,0x59,0x52,0x47,0x46,0x31,0x2B,0x79, + 0x4B,0x62,0x2B,0x6B,0x52,0x51,0x59,0x67,0x52,0x43,0x6B,0x34,0x61,0x4F,0x67, + 0x6C,0x73,0x4A,0x73,0x42,0x67,0x4E,0x4A,0x33,0x42,0x64,0x35,0x74,0x55,0x32, + 0x68,0x70,0x71,0x77,0x78,0x41,0x69,0x46,0x4A,0x77,0x30,0x4A,0x43,0x56,0x4A, + 0x67,0x74,0x55,0x78,0x41,0x43,0x36,0x20,0x5A,0x51,0x42,0x43,0x6C,0x49,0x53, + 0x44,0x68,0x69,0x70,0x71,0x41,0x4E,0x61,0x35,0x41,0x4E,0x6F,0x64,0x53,0x49, + 0x68,0x6F,0x4E,0x47,0x66,0x4C,0x6B,0x77,0x4D,0x41,0x70,0x52,0x76,0x41,0x46, + 0x50,0x44,0x69,0x58,0x49,0x55,0x38,0x6F,0x4C,0x74,0x56,0x5A,0x34,0x55,0x4C, + 0x45,0x59,0x58,0x75,0x56,0x74,0x39,0x32,0x4A,0x75,0x31,0x46,0x4C,0x46,0x4F, + 0x41,0x43,0x30,0x51,0x32,0x20,0x67,0x4E,0x41,0x67,0x77,0x2F,0x4D,0x32,0x35, + 0x53,0x39,0x72,0x55,0x7A,0x64,0x41,0x69,0x43,0x67,0x34,0x61,0x4F,0x64,0x35, + 0x73,0x42,0x38,0x41,0x68,0x48,0x69,0x4F,0x42,0x6E,0x76,0x42,0x70,0x74,0x43, + 0x71,0x2B,0x54,0x49,0x41,0x49,0x61,0x4C,0x67,0x6F,0x42,0x30,0x72,0x4C,0x59, + 0x61,0x70,0x6D,0x41,0x47,0x30,0x4E,0x51,0x62,0x4B,0x43,0x68,0x54,0x43,0x6B, + 0x59,0x58,0x4E,0x20,0x67,0x63,0x75,0x4B,0x32,0x71,0x6F,0x59,0x51,0x44,0x2F, + 0x77,0x59,0x35,0x75,0x43,0x79,0x7A,0x51,0x62,0x49,0x49,0x51,0x54,0x44,0x70, + 0x72,0x35,0x4D,0x5A,0x5A,0x37,0x64,0x59,0x59,0x70,0x79,0x51,0x42,0x43,0x66, + 0x59,0x31,0x64,0x4E,0x75,0x56,0x58,0x74,0x57,0x6B,0x67,0x55,0x41,0x67,0x58, + 0x48,0x44,0x53,0x7A,0x43,0x39,0x7A,0x36,0x2F,0x78,0x44,0x66,0x38,0x65,0x41, + 0x37,0x20,0x62,0x51,0x71,0x74,0x6E,0x4B,0x2F,0x70,0x51,0x43,0x46,0x73,0x61, + 0x63,0x34,0x61,0x7A,0x56,0x68,0x69,0x70,0x63,0x46,0x69,0x34,0x6A,0x4B,0x41, + 0x76,0x56,0x68,0x73,0x51,0x5A,0x54,0x78,0x59,0x4C,0x57,0x69,0x41,0x43,0x47, + 0x73,0x57,0x4E,0x33,0x6D,0x32,0x2B,0x62,0x2F,0x48,0x38,0x46,0x68,0x41,0x56, + 0x43,0x59,0x4F,0x45,0x2F,0x76,0x73,0x78,0x71,0x41,0x36,0x47,0x6D,0x58,0x20, + 0x41,0x51,0x68,0x68,0x67,0x34,0x4E,0x57,0x58,0x67,0x44,0x33,0x38,0x42,0x2F, + 0x69,0x4E,0x51,0x43,0x72,0x45,0x4F,0x53,0x79,0x4E,0x6E,0x55,0x44,0x68,0x4A, + 0x69,0x4C,0x35,0x71,0x7A,0x54,0x2F,0x48,0x2B,0x6B,0x38,0x42,0x2F,0x69,0x4E, + 0x59,0x42,0x6E,0x62,0x41,0x70,0x35,0x4B,0x41,0x6F,0x51,0x59,0x69,0x35,0x36, + 0x32,0x71,0x32,0x7A,0x2F,0x38,0x42,0x53,0x65,0x7A,0x4D,0x52,0x20,0x70,0x77, + 0x48,0x30,0x41,0x54,0x74,0x73,0x43,0x71,0x37,0x72,0x6B,0x41,0x45,0x49,0x63, + 0x53,0x6B,0x63,0x4E,0x4C,0x49,0x44,0x79,0x32,0x50,0x41,0x5A,0x69,0x4A,0x4F, + 0x41,0x77,0x42,0x34,0x79,0x71,0x5A,0x51,0x64,0x32,0x74,0x41,0x52,0x35,0x4E, + 0x79,0x41,0x6F,0x53,0x59,0x69,0x59,0x36,0x6D,0x77,0x47,0x58,0x31,0x33,0x31, + 0x4D,0x51,0x72,0x66,0x38,0x50,0x38,0x52,0x75,0x41,0x20,0x56,0x54,0x34,0x41, + 0x77,0x4D,0x61,0x46,0x69,0x67,0x4B,0x45,0x6D,0x49,0x6B,0x4E,0x6E,0x55,0x37, + 0x61,0x73,0x4E,0x62,0x63,0x54,0x4D,0x52,0x74,0x41,0x50,0x33,0x41,0x64,0x32, + 0x77,0x4B,0x72,0x6C,0x76,0x67,0x6B,0x39,0x56,0x6D,0x67,0x55,0x4A,0x4D,0x49, + 0x2B,0x76,0x42,0x6C,0x66,0x62,0x68,0x2F,0x33,0x65,0x49,0x6B,0x50,0x30,0x58, + 0x4A,0x6D,0x34,0x44,0x41,0x50,0x69,0x57,0x20,0x54,0x61,0x48,0x6D,0x4C,0x4B, + 0x7A,0x52,0x59,0x4B,0x41,0x51,0x30,0x31,0x6A,0x54,0x37,0x72,0x76,0x4D,0x6B, + 0x6E,0x30,0x4C,0x6F,0x6F,0x66,0x2F,0x55,0x42,0x34,0x44,0x32,0x41,0x6D,0x63, + 0x74,0x43,0x6C,0x34,0x64,0x5A,0x63,0x4D,0x51,0x49,0x67,0x77,0x56,0x39,0x6C, + 0x33,0x6A,0x55,0x39,0x53,0x77,0x76,0x52,0x66,0x67,0x58,0x49,0x59,0x41,0x4D, + 0x43,0x54,0x4E,0x6F,0x57,0x57,0x20,0x74,0x41,0x51,0x73,0x6D,0x36,0x66,0x42, + 0x51,0x43,0x45,0x41,0x6C,0x73,0x30,0x4C,0x58,0x50,0x62,0x2B,0x2B,0x78,0x71, + 0x55,0x39,0x76,0x53,0x48,0x38,0x68,0x6D,0x41,0x56,0x54,0x63,0x41,0x59,0x4A, + 0x4F,0x69,0x41,0x43,0x45,0x41,0x5A,0x79,0x31,0x38,0x4D,0x34,0x36,0x2F,0x57, + 0x53,0x34,0x44,0x4F,0x49,0x68,0x6C,0x65,0x4C,0x4B,0x71,0x7A,0x64,0x66,0x35, + 0x67,0x53,0x4C,0x31,0x20,0x64,0x44,0x51,0x46,0x4C,0x69,0x76,0x2F,0x64,0x6D, + 0x49,0x30,0x56,0x6A,0x4C,0x6C,0x4D,0x67,0x43,0x41,0x4A,0x32,0x77,0x4B,0x65, + 0x63,0x41,0x6D,0x54,0x51,0x6D,0x4B,0x6C,0x50,0x4F,0x65,0x4C,0x71,0x66,0x4D, + 0x50,0x79,0x74,0x74,0x32,0x56,0x42,0x4F,0x41,0x33,0x67,0x61,0x65,0x4E,0x57, + 0x6D,0x34,0x4A,0x57,0x64,0x50,0x75,0x33,0x32,0x75,0x35,0x34,0x49,0x55,0x56, + 0x65,0x30,0x20,0x4E,0x77,0x5A,0x63,0x61,0x54,0x2F,0x33,0x2F,0x79,0x70,0x47, + 0x57,0x37,0x46,0x51,0x54,0x67,0x4D,0x41,0x68,0x79,0x6A,0x67,0x75,0x73,0x57, + 0x4B,0x41,0x6B,0x51,0x36,0x75,0x57,0x35,0x78,0x64,0x5A,0x37,0x2B,0x55,0x48, + 0x34,0x44,0x2B,0x44,0x2B,0x32,0x42,0x64,0x64,0x31,0x2B,0x45,0x6F,0x50,0x46, + 0x71,0x6D,0x6A,0x6F,0x79,0x6C,0x77,0x58,0x52,0x74,0x6A,0x72,0x53,0x6B,0x62, + 0x20,0x79,0x6D,0x30,0x41,0x2F,0x63,0x43,0x44,0x4E,0x67,0x55,0x39,0x59,0x49, + 0x75,0x69,0x41,0x4A,0x45,0x79,0x74,0x72,0x67,0x39,0x2F,0x52,0x2B,0x69,0x78, + 0x4D,0x79,0x2F,0x59,0x73,0x70,0x74,0x41,0x41,0x42,0x66,0x74,0x53,0x33,0x59, + 0x73,0x38,0x42,0x6E,0x6B,0x51,0x34,0x53,0x46,0x53,0x6C,0x68,0x55,0x55,0x74, + 0x41,0x7A,0x77,0x4B,0x6E,0x68,0x39,0x37,0x6A,0x63,0x64,0x65,0x68,0x20,0x45, + 0x67,0x62,0x51,0x44,0x33,0x7A,0x4F,0x70,0x71,0x41,0x48,0x62,0x4F,0x33,0x4F, + 0x6C,0x62,0x63,0x32,0x51,0x69,0x53,0x45,0x72,0x64,0x30,0x35,0x6C,0x36,0x66, + 0x2F,0x35,0x34,0x6A,0x35,0x36,0x51,0x2B,0x56,0x4D,0x51,0x43,0x41,0x4C,0x39, + 0x6B,0x57,0x37,0x47,0x34,0x4E,0x75,0x4D,0x4C,0x4E,0x46,0x59,0x57,0x6F,0x4F, + 0x61,0x35,0x59,0x34,0x4C,0x73,0x65,0x6D,0x6D,0x75,0x74,0x20,0x49,0x52,0x63, + 0x71,0x5A,0x51,0x44,0x39,0x6D,0x50,0x36,0x4C,0x46,0x54,0x63,0x73,0x39,0x57, + 0x6D,0x73,0x56,0x4D,0x32,0x45,0x71,0x44,0x43,0x4E,0x47,0x64,0x50,0x47,0x48, + 0x59,0x69,0x39,0x37,0x31,0x2B,0x67,0x6B,0x6A,0x4B,0x7A,0x37,0x72,0x2F,0x4D, + 0x61,0x77,0x69,0x34,0x52,0x69,0x6E,0x43,0x6F,0x6B,0x37,0x5A,0x31,0x4A,0x56, + 0x6A,0x58,0x6F,0x50,0x54,0x30,0x7A,0x2F,0x32,0x20,0x76,0x6E,0x2B,0x42,0x53, + 0x68,0x71,0x41,0x39,0x59,0x77,0x41,0x77,0x4C,0x57,0x4C,0x63,0x70,0x6F,0x57, + 0x46,0x48,0x56,0x48,0x5A,0x33,0x50,0x41,0x35,0x6B,0x56,0x4F,0x44,0x37,0x63, + 0x48,0x4B,0x64,0x50,0x54,0x48,0x79,0x70,0x72,0x41,0x41,0x42,0x66,0x77,0x48, + 0x4B,0x4E,0x51,0x4D,0x61,0x44,0x57,0x35,0x59,0x37,0x44,0x5A,0x49,0x49,0x6B, + 0x57,0x67,0x38,0x34,0x4F,0x5A,0x6C,0x20,0x4F,0x64,0x75,0x39,0x2F,0x73,0x46, + 0x6F,0x35,0x51,0x74,0x6C,0x71,0x78,0x43,0x56,0x4E,0x77,0x42,0x77,0x79,0x47, + 0x54,0x71,0x62,0x67,0x31,0x63,0x74,0x30,0x63,0x53,0x49,0x72,0x46,0x73,0x58, + 0x4F,0x67,0x38,0x38,0x42,0x64,0x72,0x31,0x74,0x39,0x4D,0x56,0x4D,0x4D,0x41, + 0x6E,0x67,0x62,0x2B,0x33,0x72,0x62,0x77,0x65,0x35,0x63,0x36,0x39,0x35,0x65, + 0x45,0x53,0x42,0x7A,0x7A,0x20,0x47,0x67,0x4B,0x75,0x58,0x2B,0x49,0x30,0x78, + 0x66,0x33,0x33,0x78,0x4A,0x6A,0x7A,0x50,0x78,0x76,0x56,0x47,0x6D,0x76,0x2F, + 0x4F,0x39,0x75,0x43,0x6A,0x52,0x6E,0x59,0x74,0x6B,0x4A,0x64,0x41,0x56,0x47, + 0x37,0x65,0x4A,0x67,0x32,0x37,0x44,0x69,0x7A,0x39,0x54,0x66,0x6C,0x71,0x63, + 0x31,0x30,0x71,0x6D,0x55,0x41,0x2B,0x33,0x47,0x59,0x46,0x6C,0x77,0x78,0x54, + 0x37,0x4D,0x43,0x20,0x6F,0x6E,0x61,0x35,0x70,0x73,0x74,0x6E,0x68,0x64,0x76, + 0x4F,0x56,0x77,0x38,0x42,0x42,0x38,0x70,0x55,0x6E,0x57,0x6C,0x55,0x63,0x37, + 0x62,0x39,0x55,0x65,0x44,0x37,0x74,0x6F,0x57,0x76,0x58,0x35,0x4A,0x54,0x6D, + 0x72,0x43,0x6F,0x4F,0x52,0x61,0x31,0x4F,0x49,0x66,0x2B,0x75,0x7A,0x44,0x61, + 0x71,0x41,0x6A,0x56,0x54,0x72,0x65,0x78,0x2F,0x6F,0x64,0x6D,0x50,0x4C,0x68, + 0x74,0x20,0x52,0x55,0x35,0x62,0x69,0x59,0x75,0x61,0x49,0x5A,0x74,0x76,0x73, + 0x77,0x36,0x6A,0x2F,0x67,0x42,0x2F,0x57,0x61,0x62,0x71,0x7A,0x45,0x69,0x31, + 0x44,0x65,0x44,0x66,0x67,0x43,0x2F,0x61,0x46,0x75,0x35,0x6F,0x43,0x6E,0x6A, + 0x66,0x4D,0x71,0x30,0x56,0x45,0x4C,0x58,0x42,0x2B,0x35,0x59,0x35,0x35,0x37, + 0x4A,0x38,0x45,0x58,0x69,0x78,0x54,0x4E,0x57,0x5A,0x6B,0x57,0x6F,0x62,0x20, + 0x41,0x4D,0x43,0x6E,0x4D,0x55,0x5A,0x67,0x78,0x5A,0x55,0x64,0x50,0x68,0x73, + 0x31,0x4E,0x53,0x67,0x53,0x7A,0x73,0x5A,0x4F,0x33,0x2B,0x57,0x41,0x44,0x7A, + 0x41,0x61,0x2B,0x48,0x53,0x5A,0x71,0x6A,0x4D,0x72,0x53,0x54,0x41,0x41,0x67, + 0x45,0x2B,0x36,0x46,0x4C,0x36,0x78,0x4F,0x2B,0x65,0x79,0x66,0x62,0x49,0x51, + 0x46,0x57,0x56,0x70,0x61,0x38,0x43,0x4E,0x37,0x71,0x74,0x61,0x20,0x6E,0x54, + 0x51,0x51,0x46,0x30,0x6B,0x78,0x67,0x4E,0x64,0x77,0x6D,0x42,0x58,0x49,0x65, + 0x50,0x41,0x62,0x4B,0x33,0x4F,0x30,0x32,0x4A,0x2B,0x67,0x49,0x6B,0x52,0x46, + 0x61,0x4D,0x6D,0x61,0x74,0x75,0x6E,0x59,0x37,0x33,0x38,0x49,0x6F,0x34,0x47, + 0x4B,0x55,0x33,0x55,0x44,0x2B,0x4D,0x5A,0x62,0x6A,0x59,0x55,0x66,0x48,0x38, + 0x58,0x68,0x6F,0x4D,0x4E,0x35,0x44,0x51,0x45,0x66,0x20,0x57,0x44,0x57,0x6C, + 0x51,0x55,0x47,0x52,0x47,0x4C,0x49,0x65,0x66,0x47,0x44,0x56,0x6C,0x47,0x76, + 0x69,0x57,0x6B,0x56,0x48,0x2F,0x59,0x75,0x70,0x75,0x67,0x48,0x41,0x4E,0x42, + 0x50,0x34,0x49,0x2B,0x43,0x55,0x37,0x66,0x75,0x57,0x74,0x41,0x54,0x63,0x75, + 0x6C,0x79,0x44,0x67,0x69,0x49,0x5A,0x33,0x4C,0x6F,0x38,0x78,0x78,0x4B,0x33, + 0x71,0x65,0x70,0x54,0x6D,0x44,0x5A,0x66,0x20,0x4E,0x52,0x4A,0x68,0x41,0x43, + 0x45,0x4F,0x41,0x52,0x39,0x7A,0x65,0x63,0x50,0x61,0x42,0x62,0x37,0x72,0x50, + 0x4B,0x73,0x51,0x73,0x58,0x50,0x39,0x6B,0x68,0x78,0x72,0x33,0x54,0x65,0x79, + 0x2B,0x52,0x69,0x6D,0x7A,0x56,0x65,0x4E,0x78,0x42,0x68,0x41,0x4B,0x41,0x70, + 0x34,0x44,0x6F,0x66,0x78,0x41,0x49,0x44,0x4E,0x69,0x7A,0x51,0x7A,0x49,0x4B, + 0x72,0x48,0x78,0x6B,0x37,0x66,0x20,0x64,0x59,0x6B,0x76,0x6D,0x44,0x62,0x2B, + 0x58,0x42,0x6D,0x71,0x34,0x30,0x52,0x69,0x44,0x41,0x43,0x69,0x6A,0x77,0x63, + 0x41,0x62,0x46,0x32,0x57,0x6F,0x30,0x66,0x48,0x6A,0x59,0x73,0x4B,0x30,0x39, + 0x50,0x75,0x73,0x39,0x55,0x39,0x4E,0x36,0x57,0x71,0x2F,0x66,0x34,0x77,0x69, + 0x54,0x49,0x41,0x75,0x47,0x67,0x38,0x34,0x4C,0x44,0x74,0x2B,0x7A,0x7A,0x67, + 0x2F,0x53,0x74,0x79,0x20,0x72,0x47,0x72,0x54,0x39,0x4B,0x43,0x6F,0x44,0x4B, + 0x76,0x61,0x41,0x74,0x37,0x76,0x76,0x6C,0x44,0x74,0x4D,0x50,0x6C,0x2B,0x66, + 0x36,0x69,0x74,0x56,0x34,0x33,0x45,0x47,0x55,0x43,0x49,0x51,0x38,0x42,0x2F, + 0x63,0x6E,0x6D,0x44,0x6D,0x52,0x36,0x63,0x63,0x6C,0x31,0x34,0x49,0x59,0x51, + 0x7A,0x4B,0x2B,0x59,0x46,0x2F,0x4D,0x62,0x4B,0x4B,0x64,0x66,0x70,0x50,0x6A, + 0x42,0x74,0x20,0x2B,0x6C,0x44,0x73,0x46,0x59,0x70,0x49,0x49,0x67,0x30,0x67, + 0x35,0x49,0x7A,0x2F,0x48,0x37,0x6A,0x4C,0x35,0x62,0x32,0x46,0x71,0x52,0x67, + 0x6C,0x43,0x6F,0x6C,0x79,0x73,0x62,0x51,0x31,0x38,0x68,0x54,0x30,0x58,0x5A, + 0x67,0x32,0x6E,0x59,0x69,0x6E,0x50,0x79,0x54,0x55,0x41,0x47,0x44,0x61,0x42, + 0x2F,0x54,0x50,0x77,0x4A,0x2B,0x34,0x76,0x44,0x66,0x72,0x77,0x5A,0x32,0x72, + 0x20,0x46,0x41,0x6D,0x49,0x2B,0x46,0x6B,0x78,0x4C,0x2B,0x44,0x4F,0x61,0x4F, + 0x4C,0x2F,0x45,0x30,0x78,0x62,0x54,0x6F,0x7A,0x34,0x49,0x63,0x45,0x47,0x41, + 0x4E,0x4D,0x2B,0x71,0x43,0x38,0x42,0x58,0x33,0x46,0x35,0x62,0x32,0x50,0x47, + 0x52,0x41,0x49,0x61,0x45,0x78,0x42,0x78,0x73,0x61,0x72,0x4E,0x50,0x50,0x6B, + 0x6A,0x62,0x46,0x6E,0x2F,0x46,0x66,0x4C,0x37,0x2B,0x69,0x64,0x4A,0x20,0x2F, + 0x4A,0x42,0x77,0x41,0x34,0x42,0x70,0x48,0x39,0x67,0x44,0x57,0x47,0x34,0x6F, + 0x57,0x69,0x44,0x72,0x77,0x57,0x2B,0x75,0x6E,0x4E,0x4C,0x73,0x67,0x43,0x69, + 0x5A,0x6E,0x6E,0x61,0x66,0x33,0x31,0x77,0x5A,0x36,0x63,0x6D,0x2F,0x45,0x39, + 0x4E,0x32,0x45,0x79,0x64,0x2B,0x71,0x41,0x45,0x44,0x67,0x49,0x74,0x6D,0x42, + 0x6E,0x37,0x69,0x38,0x74,0x36,0x4D,0x42,0x37,0x65,0x74,0x20,0x7A,0x48,0x48, + 0x56,0x51,0x70,0x6D,0x41,0x69,0x4D,0x5A,0x56,0x43,0x33,0x31,0x75,0x63,0x38, + 0x2F,0x76,0x42,0x39,0x4E,0x57,0x45,0x7A,0x50,0x69,0x50,0x78,0x4D,0x31,0x59, + 0x51,0x41,0x68,0x6A,0x67,0x4B,0x2F,0x42,0x2B,0x78,0x78,0x65,0x56,0x50,0x68, + 0x7A,0x45,0x46,0x6C,0x44,0x41,0x70,0x58,0x72,0x6C,0x2B,0x53,0x63,0x7A,0x33, + 0x44,0x72,0x38,0x41,0x65,0x54,0x46,0x73,0x39,0x20,0x47,0x6E,0x65,0x64,0x34, + 0x71,0x52,0x6D,0x44,0x43,0x44,0x6B,0x6F,0x49,0x63,0x77,0x55,0x79,0x6C,0x76, + 0x75,0x64,0x35,0x6A,0x38,0x79,0x4B,0x66,0x32,0x31,0x64,0x71,0x56,0x79,0x45, + 0x78,0x4E,0x31,0x6B,0x50,0x62,0x6C,0x2B,0x5A,0x69,0x35,0x4C,0x68,0x42,0x36, + 0x5A,0x74,0x76,0x6A,0x76,0x64,0x6C,0x39,0x53,0x6E,0x50,0x39,0x53,0x51,0x41, + 0x63,0x43,0x30,0x44,0x2F,0x49,0x41,0x20,0x38,0x4E,0x73,0x34,0x4A,0x41,0x6F, + 0x56,0x36,0x47,0x6E,0x33,0x32,0x58,0x37,0x35,0x46,0x4B,0x30,0x4E,0x63,0x64, + 0x5A,0x4D,0x31,0x42,0x4F,0x74,0x44,0x62,0x44,0x39,0x38,0x73,0x68,0x6A,0x52, + 0x34,0x63,0x78,0x62,0x66,0x4D,0x41,0x4A,0x46,0x76,0x38,0x55,0x47,0x4D,0x47, + 0x41,0x42,0x65,0x5A,0x77,0x41,0x65,0x49,0x45,0x41,0x6B,0x73,0x61,0x51,0x6E, + 0x34,0x38,0x42,0x72,0x6C,0x20,0x43,0x6F,0x69,0x4C,0x57,0x64,0x70,0x71,0x32, + 0x6F,0x62,0x6A,0x71,0x72,0x34,0x43,0x62,0x32,0x48,0x61,0x5A,0x45,0x32,0x49, + 0x48,0x32,0x72,0x51,0x41,0x47,0x44,0x61,0x42,0x37,0x73,0x66,0x34,0x37,0x5A, + 0x4F,0x59,0x77,0x4A,0x67,0x39,0x68,0x50,0x59,0x76,0x6E,0x70,0x4B,0x69,0x34, + 0x6A,0x45,0x75,0x32,0x7A,0x73,0x39,0x4E,0x6D,0x2B,0x32,0x6E,0x6B,0x39,0x66, + 0x34,0x45,0x39,0x20,0x6D,0x4C,0x61,0x34,0x48,0x32,0x70,0x44,0x2F,0x46,0x43, + 0x6A,0x42,0x67,0x41,0x58,0x52,0x51,0x49,0x66,0x77,0x58,0x46,0x32,0x41,0x4D, + 0x77,0x4D,0x77,0x55,0x33,0x4C,0x63,0x6D,0x78,0x62,0x72,0x6E,0x47,0x42,0x4E, + 0x4A,0x50,0x31,0x59,0x4E,0x76,0x79,0x48,0x44,0x65,0x35,0x6E,0x64,0x73,0x58, + 0x35,0x69,0x65,0x59,0x4E,0x6C,0x67,0x7A,0x54,0x2F,0x34,0x43,0x4E,0x57,0x73, + 0x41,0x20,0x63,0x4E,0x48,0x41,0x34,0x4D,0x64,0x77,0x7A,0x42,0x4D,0x6F,0x73, + 0x4B,0x37,0x44,0x35,0x36,0x36,0x65,0x4B,0x52,0x62,0x72,0x33,0x49,0x48,0x55, + 0x73,0x61,0x67,0x6C,0x34,0x4B,0x36,0x65,0x4B,0x64,0x61,0x35,0x62,0x65,0x41, + 0x5A,0x5A,0x69,0x65,0x68,0x64,0x66,0x32,0x31,0x4A,0x48,0x36,0x6F,0x63,0x51, + 0x4F,0x41,0x61,0x52,0x2F,0x34,0x55,0x55,0x77,0x49,0x35,0x70,0x51,0x78,0x20, + 0x57,0x4B,0x43,0x6A,0x4B,0x65,0x42,0x44,0x6C,0x30,0x39,0x46,0x48,0x66,0x55, + 0x56,0x4E,0x63,0x6A,0x6D,0x52,0x54,0x36,0x2F,0x63,0x2F,0x6C,0x55,0x4B,0x63, + 0x66,0x51,0x66,0x77,0x58,0x54,0x35,0x6F,0x35,0x43,0x37,0x59,0x6B,0x66,0x6F, + 0x43,0x37,0x47,0x77,0x67,0x73,0x66,0x2F,0x44,0x30,0x62,0x4A,0x73,0x46,0x6B, + 0x58,0x66,0x30,0x53,0x2B,0x4C,0x4C,0x72,0x66,0x54,0x4B,0x65,0x20,0x6D,0x66, + 0x65,0x39,0x62,0x4C,0x37,0x50,0x63,0x79,0x65,0x79,0x6E,0x4A,0x39,0x53,0x76, + 0x36,0x41,0x65,0x6D,0x64,0x63,0x51,0x73,0x47,0x31,0x46,0x72,0x74,0x53,0x31, + 0x49,0x76,0x38,0x64,0x65,0x41,0x78,0x71,0x55,0x2F,0x67,0x46,0x61,0x6A,0x34, + 0x43,0x43,0x42,0x50,0x36,0x49,0x68,0x37,0x44,0x63,0x52,0x56,0x68,0x6D,0x47, + 0x58,0x7A,0x41,0x75,0x35,0x65,0x4F,0x36,0x58,0x73,0x20,0x77,0x54,0x72,0x6B, + 0x71,0x6F,0x55,0x2B,0x64,0x36,0x38,0x74,0x65,0x61,0x48,0x59,0x58,0x64,0x53, + 0x42,0x2B,0x4B,0x48,0x4F,0x44,0x41,0x41,0x75,0x57,0x6B,0x56,0x34,0x41,0x78, + 0x46,0x79,0x42,0x63,0x41,0x73,0x4A,0x74,0x72,0x61,0x6E,0x65,0x4E,0x44,0x70, + 0x59,0x57,0x49,0x49,0x69,0x45,0x55,0x75,0x6E,0x68,0x62,0x75,0x35,0x31,0x50, + 0x36,0x51,0x31,0x7A,0x47,0x4E,0x4F,0x6D,0x20,0x45,0x72,0x65,0x71,0x4C,0x79, + 0x70,0x31,0x5A,0x77,0x42,0x77,0x30,0x58,0x34,0x43,0x37,0x38,0x64,0x78,0x65, + 0x37,0x45,0x77,0x53,0x31,0x73,0x44,0x50,0x74,0x49,0x7A,0x78,0x58,0x57,0x4C, + 0x66,0x63,0x30,0x55,0x31,0x43,0x42,0x5A,0x44,0x36,0x35,0x62,0x37,0x50,0x4F, + 0x52,0x6E,0x70,0x4C,0x7A,0x50,0x6E,0x5A,0x68,0x32,0x6C,0x4B,0x69,0x31,0x76, + 0x4F,0x58,0x53,0x6C,0x30,0x61,0x20,0x41,0x46,0x77,0x30,0x51,0x2F,0x42,0x62, + 0x4F,0x47,0x34,0x30,0x47,0x69,0x62,0x6A,0x77,0x5A,0x62,0x46,0x4F,0x65,0x35, + 0x65,0x4F,0x38,0x55,0x56,0x37,0x6A,0x75,0x2F,0x69,0x69,0x70,0x78,0x78,0x51, + 0x49,0x54,0x37,0x6D,0x39,0x5A,0x48,0x48,0x6C,0x36,0x72,0x38,0x42,0x44,0x6D, + 0x44,0x5A,0x30,0x43,0x4F,0x70,0x48,0x2F,0x46,0x41,0x6E,0x67,0x34,0x43,0x7A, + 0x55,0x54,0x51,0x34,0x20,0x2B,0x43,0x6A,0x77,0x41,0x76,0x42,0x74,0x59,0x48, + 0x6D,0x55,0x2B,0x37,0x55,0x31,0x6D,0x6A,0x33,0x67,0x72,0x6C,0x72,0x6F,0x38, + 0x35,0x50,0x65,0x4C,0x47,0x66,0x47,0x46,0x42,0x49,0x6B,0x6B,0x55,0x55,0x74, + 0x41,0x54,0x66,0x46,0x63,0x33,0x7A,0x63,0x4B,0x63,0x77,0x55,0x33,0x33,0x4E, + 0x51,0x58,0x38,0x49,0x76,0x55,0x4C,0x63,0x52,0x51,0x4A,0x69,0x69,0x4C,0x63, + 0x64,0x76,0x20,0x6F,0x6F,0x51,0x75,0x41,0x56,0x78,0x49,0x46,0x39,0x32,0x32, + 0x33,0x50,0x6E,0x30,0x56,0x31,0x46,0x47,0x4F,0x70,0x6F,0x43,0x74,0x69,0x33, + 0x50,0x78,0x5A,0x58,0x6D,0x76,0x51,0x76,0x34,0x44,0x39,0x53,0x78,0x2B,0x43, + 0x45,0x6C,0x42,0x67,0x44,0x78,0x64,0x67,0x6B,0x4B,0x72,0x4F,0x76,0x77,0x2B, + 0x64,0x32,0x31,0x55,0x39,0x79,0x36,0x50,0x45,0x64,0x37,0x6F,0x34,0x79,0x67, + 0x20,0x57,0x72,0x51,0x33,0x6D,0x68,0x4F,0x69,0x66,0x6E,0x64,0x74,0x53,0x51, + 0x6B,0x39,0x59,0x65,0x6F,0x32,0x35,0x43,0x2B,0x6D,0x72,0x72,0x73,0x41,0x78, + 0x63,0x7A,0x51,0x4A,0x66,0x68,0x6E,0x34,0x45,0x6E,0x67,0x66,0x56,0x48,0x76, + 0x36,0x57,0x47,0x4F,0x4C,0x46,0x2F,0x58,0x34,0x62,0x4E,0x76,0x49,0x4D,0x50, + 0x72,0x2F,0x52,0x6B,0x47,0x4A,0x39,0x51,0x31,0x71,0x41,0x51,0x64,0x20,0x54, + 0x51,0x48,0x58,0x64,0x50,0x6D,0x73,0x37,0x2F,0x53,0x6A,0x72,0x4E,0x65,0x66, + 0x69,0x58,0x2F,0x44,0x62,0x4F,0x43,0x78,0x46,0x2B,0x70,0x62,0x2B,0x41,0x56, + 0x53,0x45,0x77,0x47,0x45,0x43,0x58,0x32,0x78,0x65,0x34,0x47,0x62,0x67,0x53, + 0x2B,0x57,0x65,0x6B,0x38,0x50,0x32,0x4E,0x42,0x70,0x42,0x70,0x33,0x75,0x75, + 0x43,0x78,0x48,0x74,0x31,0x59,0x61,0x6C,0x6F,0x33,0x75,0x20,0x31,0x6F,0x41, + 0x37,0x4C,0x6A,0x4F,0x44,0x73,0x68,0x76,0x69,0x45,0x2F,0x38,0x58,0x4D,0x57, + 0x30,0x68,0x4E,0x65,0x4B,0x48,0x6C,0x45,0x55,0x41,0x59,0x59,0x71,0x69,0x67, + 0x55,0x38,0x44,0x4F,0x34,0x43,0x2F,0x41,0x50,0x35,0x6A,0x71,0x66,0x64,0x65, + 0x33,0x65,0x61,0x7A,0x75,0x73,0x32,0x6E,0x62,0x38,0x7A,0x6A,0x39,0x66,0x34, + 0x4D,0x68,0x38,0x35,0x6C,0x38,0x4F,0x55,0x48,0x20,0x4A,0x5A,0x48,0x78,0x7A, + 0x46,0x34,0x4F,0x56,0x33,0x66,0x35,0x55,0x5A,0x66,0x71,0x7A,0x73,0x62,0x33, + 0x4D,0x64,0x2F,0x37,0x69,0x35,0x41,0x65,0x34,0x52,0x64,0x49,0x72,0x51,0x45, + 0x55,0x2B,0x4D,0x5A,0x62,0x6A,0x51,0x55,0x54,0x65,0x42,0x47,0x34,0x45,0x2F, + 0x67,0x73,0x38,0x45,0x67,0x63,0x39,0x31,0x37,0x53,0x45,0x6E,0x44,0x62,0x69, + 0x68,0x7A,0x6A,0x75,0x52,0x78,0x76,0x20,0x44,0x32,0x5A,0x34,0x61,0x30,0x44, + 0x64,0x41,0x31,0x63,0x36,0x6D,0x67,0x49,0x32,0x64,0x50,0x70,0x63,0x32,0x65, + 0x48,0x54,0x6E,0x49,0x33,0x39,0x39,0x67,0x38,0x52,0x4F,0x71,0x49,0x72,0x62, + 0x65,0x49,0x48,0x47,0x51,0x41,0x77,0x34,0x39,0x6A,0x41,0x64,0x34,0x44,0x2F, + 0x41,0x58,0x77,0x69,0x6A,0x76,0x73,0x33,0x5A,0x2B,0x47,0x61,0x4C,0x70,0x39, + 0x72,0x75,0x6E,0x78,0x36,0x20,0x52,0x7A,0x33,0x32,0x44,0x32,0x59,0x34,0x66, + 0x43,0x37,0x44,0x75,0x4C,0x59,0x6F,0x6E,0x4A,0x48,0x6D,0x4C,0x46,0x7A,0x65, + 0x37,0x76,0x4E,0x72,0x48,0x58,0x36,0x35,0x75,0x6C,0x4A,0x66,0x42,0x2F,0x36, + 0x47,0x47,0x6C,0x75,0x37,0x58,0x77,0x35,0x6B,0x41,0x43,0x46,0x43,0x30,0x63, + 0x42,0x2B,0x34,0x46,0x35,0x4D,0x74,0x2B,0x42,0x2B,0x59,0x48,0x74,0x63,0x66, + 0x36,0x4F,0x37,0x20,0x4E,0x61,0x43,0x37,0x4E,0x63,0x66,0x4E,0x79,0x33,0x49, + 0x63,0x47,0x2F,0x5A,0x34,0x35,0x31,0x79,0x47,0x49,0x2B,0x63,0x79,0x54,0x4B, + 0x51,0x38,0x76,0x36,0x67,0x70,0x41,0x36,0x76,0x62,0x66,0x64,0x61,0x32,0x2B, + 0x31,0x7A,0x57,0x46,0x73,0x54,0x56,0x72,0x79,0x39,0x6D,0x4A,0x2F,0x41,0x45, + 0x38,0x48,0x54,0x68,0x46,0x32,0x6B,0x57,0x50,0x38,0x67,0x41,0x4C,0x71,0x49, + 0x6F,0x20,0x47,0x6E,0x67,0x36,0x66,0x2F,0x30,0x70,0x78,0x67,0x68,0x36,0x34, + 0x76,0x6F,0x37,0x48,0x75,0x61,0x67,0x69,0x56,0x56,0x74,0x4F,0x66,0x78,0x6C, + 0x4F,0x59,0x36,0x50,0x65,0x42,0x77,0x66,0x79,0x58,0x42,0x30,0x78,0x47,0x4D, + 0x6F,0x4A,0x64,0x32,0x45,0x39,0x73,0x61,0x41,0x31,0x57,0x30,0x42,0x4B,0x2B, + 0x66,0x37,0x72,0x4A,0x77,0x66,0x6C,0x4A,0x71,0x74,0x64,0x79,0x6B,0x4F,0x20, + 0x59,0x6F,0x54,0x2F,0x74,0x34,0x56,0x66,0x70,0x46,0x33,0x34,0x42,0x57,0x51, + 0x41,0x73,0x31,0x42,0x6B,0x42,0x48,0x38,0x4C,0x2F,0x42,0x33,0x77,0x49,0x44, + 0x47,0x4E,0x44,0x34,0x54,0x4A,0x65,0x42,0x66,0x4D,0x34,0x45,0x5A,0x67,0x65, + 0x4E,0x4C,0x6A,0x36,0x49,0x6A,0x48,0x73,0x57,0x47,0x50,0x55,0x36,0x4D,0x5A, + 0x78,0x75,0x71,0x6B,0x71,0x39,0x43,0x53,0x68,0x61,0x57,0x74,0x20,0x50,0x69, + 0x76,0x6D,0x47,0x2B,0x46,0x58,0x4B,0x48,0x66,0x69,0x49,0x65,0x44,0x7A,0x67, + 0x41,0x38,0x53,0x66,0x6A,0x45,0x79,0x67,0x44,0x6B,0x49,0x64,0x51,0x74,0x38, + 0x7A,0x50,0x6A,0x41,0x34,0x38,0x41,0x66,0x41,0x35,0x38,0x70,0x31,0x39,0x39, + 0x73,0x61,0x77,0x7A,0x59,0x32,0x42,0x6D,0x77,0x73,0x52,0x4D,0x67,0x78,0x39, + 0x43,0x45,0x52,0x2B,0x2B,0x6F,0x78,0x36,0x2F,0x4F,0x20,0x65,0x35,0x77,0x65, + 0x38,0x7A,0x67,0x37,0x58,0x68,0x73,0x52,0x77,0x73,0x4C,0x6D,0x67,0x4D,0x55, + 0x74,0x41,0x63,0x76,0x6E,0x42,0x58,0x53,0x33,0x42,0x69,0x79,0x6F,0x62,0x4E, + 0x62,0x6B,0x35,0x7A,0x44,0x48,0x63,0x66,0x55,0x58,0x66,0x69,0x48,0x78,0x58, + 0x34,0x77,0x4D,0x77,0x49,0x4B,0x69,0x61,0x4B,0x41,0x66,0x4D,0x31,0x50,0x77, + 0x4A,0x65,0x43,0x54,0x6D,0x4B,0x37,0x42,0x20,0x73,0x6E,0x4C,0x2B,0x2F,0x51, + 0x56,0x4E,0x52,0x6A,0x78,0x58,0x64,0x6C,0x7A,0x34,0x33,0x63,0x43,0x34,0x78, + 0x37,0x6C,0x4A,0x47,0x4A,0x72,0x30,0x47,0x42,0x6A,0x33,0x36,0x42,0x38,0x33, + 0x58,0x59,0x64,0x4B,0x52,0x77,0x73,0x74,0x57,0x56,0x4F,0x2F,0x72,0x75,0x61, + 0x41,0x7A,0x75,0x61,0x41,0x42,0x59,0x30,0x42,0x37,0x59,0x33,0x51,0x32,0x56, + 0x79,0x56,0x65,0x63,0x2B,0x54,0x20,0x6D,0x46,0x44,0x2F,0x63,0x53,0x52,0x38, + 0x4B,0x32,0x51,0x41,0x44,0x73,0x78,0x67,0x42,0x49,0x2F,0x6D,0x72,0x2F,0x73, + 0x77,0x52,0x72,0x43,0x70,0x55,0x6E,0x58,0x70,0x62,0x41,0x37,0x6F,0x62,0x41, + 0x61,0x59,0x4C,0x72,0x51,0x4A,0x48,0x34,0x59,0x6D,0x50,0x50,0x72,0x48,0x50, + 0x45,0x5A,0x7A,0x70,0x6A,0x73,0x42,0x35,0x6E,0x65,0x46,0x67,0x63,0x5A,0x4A, + 0x6E,0x31,0x6D,0x6E,0x20,0x49,0x78,0x63,0x32,0x42,0x39,0x4F,0x57,0x50,0x52, + 0x65,0x2F,0x37,0x6D,0x6F,0x4A,0x79,0x4F,0x62,0x2F,0x75,0x36,0x41,0x70,0x6F, + 0x43,0x6B,0x5A,0x71,0x57,0x52,0x37,0x4D,0x63,0x4C,0x2F,0x61,0x76,0x69,0x58, + 0x45,0x76,0x37,0x63,0x79,0x41,0x41,0x69,0x45,0x47,0x35,0x59,0x65,0x54,0x50, + 0x34,0x61,0x76,0x37,0x36,0x45,0x4D,0x59,0x49,0x37,0x71,0x78,0x4B,0x78,0x54, + 0x43,0x6A,0x20,0x36,0x59,0x74,0x62,0x67,0x72,0x52,0x73,0x63,0x4B,0x70,0x52, + 0x2F,0x52,0x4C,0x78,0x67,0x71,0x43,0x30,0x68,0x76,0x4C,0x45,0x4B,0x2B,0x4D, + 0x78,0x56,0x61,0x57,0x75,0x36,0x41,0x45,0x2B,0x44,0x76,0x77,0x42,0x5A,0x65, + 0x34,0x65,0x70,0x4A,0x43,0x54,0x77,0x4E,0x65,0x41,0x62,0x32,0x4A,0x47,0x39, + 0x31,0x50,0x4E,0x2F,0x56,0x75,0x61,0x53,0x33,0x70,0x2F,0x4D,0x67,0x4B,0x34, + 0x20,0x2B,0x75,0x4D,0x67,0x38,0x44,0x42,0x6D,0x33,0x34,0x48,0x66,0x42,0x70, + 0x36,0x71,0x62,0x6E,0x58,0x71,0x67,0x71,0x63,0x77,0x6E,0x2B,0x56,0x79,0x7A, + 0x47,0x65,0x62,0x65,0x76,0x48,0x48,0x67,0x62,0x6F,0x41,0x35,0x57,0x64,0x6E, + 0x2F,0x75,0x72,0x43,0x64,0x41,0x30,0x2B,0x43,0x76,0x78,0x4F,0x56,0x57,0x74, + 0x55,0x4F,0x33,0x77,0x58,0x6B,0x35,0x57,0x35,0x69,0x39,0x43,0x67,0x20,0x6E, + 0x6F,0x67,0x50,0x47,0x55,0x44,0x6C,0x36,0x41,0x66,0x2B,0x49,0x58,0x38,0x74, + 0x41,0x65,0x37,0x49,0x58,0x39,0x76,0x7A,0x72,0x34,0x58,0x35,0x6A,0x4C,0x34, + 0x4C,0x50,0x4A,0x4F,0x2F,0x2B,0x71,0x70,0x62,0x6E,0x66,0x70,0x48,0x42,0x6C, + 0x41,0x64,0x2B,0x72,0x68,0x67,0x42,0x6D,0x42,0x6D,0x44,0x37,0x5A,0x6A,0x49, + 0x6F,0x53,0x62,0x67,0x66,0x69,0x58,0x76,0x53,0x53,0x54,0x20,0x48,0x47,0x61, + 0x62,0x74,0x6D,0x63,0x78,0x77,0x6E,0x2B,0x31,0x75,0x74,0x56,0x4A,0x48,0x7A, + 0x4B,0x41,0x5A,0x4C,0x41,0x33,0x66,0x2F,0x31,0x31,0x2F,0x76,0x56,0x57,0x34, + 0x42,0x61,0x4D,0x47,0x57,0x77,0x46,0x46,0x6C,0x65,0x70,0x58,0x6E,0x46,0x7A, + 0x47,0x74,0x69,0x4E,0x45,0x66,0x33,0x7A,0x2B,0x5A,0x39,0x46,0x46,0x5A,0x45, + 0x42,0x4A,0x4A,0x50,0x64,0x2B,0x61,0x75,0x77,0x20,0x55,0x63,0x6C,0x36,0x4C, + 0x68,0x6A,0x43,0x72,0x77,0x50,0x58,0x56,0x4B,0x6C,0x65,0x72,0x72,0x77,0x4F, + 0x2F,0x49,0x77,0x4C,0x67,0x74,0x39,0x58,0x33,0x65,0x71,0x49,0x59,0x6D,0x51, + 0x41,0x74,0x63,0x47,0x2B,0x2F,0x50,0x58,0x31,0x2F,0x47,0x73,0x50,0x75,0x41, + 0x6F,0x7A,0x33,0x62,0x67,0x75,0x2F,0x2F,0x4F,0x6D,0x2F,0x4D,0x2B,0x56,0x6A, + 0x68,0x5A,0x4F,0x59,0x34,0x35,0x69,0x20,0x32,0x77,0x75,0x38,0x6B,0x66,0x2F, + 0x35,0x59,0x50,0x37,0x6E,0x56,0x43,0x51,0x6A,0x31,0x44,0x49,0x79,0x67,0x4E, + 0x6F,0x6B,0x41,0x48,0x36,0x52,0x76,0x34,0x72,0x70,0x78,0x42,0x6A,0x42,0x74, + 0x5A,0x6A,0x42,0x78,0x63,0x49,0x4B,0x78,0x6E,0x56,0x41,0x49,0x5A,0x6D,0x34, + 0x44,0x66,0x69,0x31,0x57,0x65,0x37,0x39,0x4F,0x6A,0x41,0x52,0x65,0x72,0x32, + 0x33,0x36,0x50,0x57,0x72,0x20,0x2B,0x64,0x65,0x76,0x59,0x73,0x51,0x2B,0x34, + 0x46,0x35,0x39,0x6B,0x52,0x52,0x6B,0x41,0x50,0x58,0x48,0x41,0x50,0x42,0x79, + 0x2F,0x72,0x6F,0x55,0x73,0x36,0x30,0x6F,0x30,0x6C,0x4D,0x37,0x52,0x63,0x67, + 0x41,0x30,0x6F,0x75,0x45,0x4C,0x70,0x51,0x4A,0x4B,0x45,0x53,0x61,0x4B,0x58, + 0x6B,0x74,0x67,0x42,0x43,0x69,0x64,0x6C,0x45,0x45,0x49,0x45,0x53,0x4B,0x6B, + 0x51,0x45,0x49,0x20,0x6B,0x57,0x4A,0x6B,0x41,0x45,0x4B,0x6B,0x47,0x42,0x6D, + 0x41,0x45,0x43,0x6C,0x47,0x42,0x69,0x42,0x45,0x69,0x70,0x45,0x42,0x43,0x4A, + 0x46,0x69,0x2F,0x68,0x30,0x37,0x77,0x4F,0x37,0x35,0x36,0x2F,0x2B,0x71,0x74, + 0x67,0x41,0x41,0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67, + 0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x74, + 0x61,0x72,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B, + 0x20,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,0x43,0x41,0x41,0x41, + 0x41,0x41,0x67,0x43,0x41,0x59,0x41,0x41,0x41,0x42,0x7A,0x65,0x6E,0x72,0x30, + 0x41,0x41,0x41,0x42,0x53,0x45,0x6C,0x45,0x51,0x56,0x52,0x59,0x68,0x65,0x32, + 0x57,0x30,0x57,0x33,0x43,0x4D,0x42,0x43,0x47,0x76,0x31,0x53,0x38,0x20,0x4E, + 0x79,0x4E,0x55,0x36,0x67,0x4B,0x77,0x51,0x64,0x6D,0x6B,0x33,0x53,0x42,0x4D, + 0x41,0x45,0x78,0x41,0x6D,0x51,0x42,0x31,0x41,0x74,0x6F,0x4A,0x6D,0x6B,0x35, + 0x51,0x47,0x41,0x43,0x4A,0x45,0x63,0x49,0x45,0x36,0x59,0x4D,0x64,0x39,0x62, + 0x42,0x51,0x66,0x4F,0x65,0x6B,0x53,0x68,0x2F,0x79,0x50,0x7A,0x6D,0x4F,0x37, + 0x66,0x2F,0x2F,0x7A,0x33,0x65,0x32,0x73,0x37,0x71,0x75,0x20,0x47,0x52,0x4A, + 0x33,0x67,0x37,0x4B,0x50,0x41,0x6B,0x59,0x42,0x2F,0x30,0x48,0x41,0x70,0x4B, + 0x2B,0x46,0x54,0x70,0x66,0x72,0x37,0x38,0x64,0x37,0x33,0x62,0x7A,0x4F,0x45, + 0x54,0x68,0x64,0x72,0x73,0x68,0x58,0x77,0x4E,0x51,0x79,0x58,0x78,0x57,0x42, + 0x30,0x42,0x30,0x34,0x68,0x36,0x49,0x2F,0x42,0x7A,0x62,0x41,0x4D,0x31,0x44, + 0x32,0x4C,0x73,0x42,0x6A,0x41,0x78,0x77,0x39,0x20,0x77,0x54,0x6B,0x67,0x2F, + 0x38,0x54,0x6F,0x50,0x45,0x56,0x41,0x44,0x75,0x78,0x38,0x2B,0x2B,0x43,0x46, + 0x66,0x50,0x6D,0x2B,0x50,0x49,0x55,0x63,0x49,0x4E,0x50,0x63,0x42,0x64,0x37, + 0x74,0x46,0x50,0x68,0x57,0x72,0x44,0x6B,0x48,0x79,0x72,0x39,0x49,0x77,0x73, + 0x5A,0x31,0x44,0x44,0x6E,0x63,0x7A,0x70,0x74,0x6B,0x41,0x63,0x4C,0x4E,0x6D, + 0x32,0x4C,0x34,0x44,0x69,0x67,0x61,0x20,0x45,0x54,0x45,0x68,0x71,0x69,0x31, + 0x6F,0x46,0x76,0x50,0x51,0x33,0x74,0x38,0x6C,0x73,0x4D,0x42,0x46,0x44,0x72, + 0x68,0x39,0x4E,0x71,0x67,0x69,0x49,0x4D,0x67,0x4C,0x4A,0x54,0x6E,0x41,0x45, + 0x79,0x35,0x6E,0x56,0x72,0x51,0x6B,0x71,0x53,0x55,0x48,0x48,0x6F,0x43,0x6C, + 0x59,0x54,0x77,0x34,0x39,0x31,0x58,0x62,0x67,0x47,0x67,0x5A,0x43,0x76,0x66, + 0x61,0x63,0x6A,0x73,0x44,0x20,0x37,0x38,0x44,0x57,0x74,0x31,0x75,0x68,0x50, + 0x51,0x63,0x4B,0x58,0x45,0x68,0x6A,0x4F,0x41,0x41,0x7A,0x32,0x52,0x45,0x72, + 0x52,0x38,0x74,0x42,0x74,0x42,0x59,0x6B,0x46,0x62,0x38,0x48,0x6B,0x34,0x7A, + 0x4B,0x68,0x34,0x59,0x30,0x52,0x63,0x42,0x72,0x79,0x37,0x2B,0x39,0x61,0x4A, + 0x64,0x36,0x61,0x67,0x64,0x31,0x47,0x59,0x59,0x49,0x62,0x73,0x41,0x6D,0x4F, + 0x54,0x4F,0x77,0x20,0x52,0x53,0x42,0x5A,0x51,0x43,0x42,0x69,0x6A,0x39,0x75, + 0x4B,0x75,0x59,0x55,0x63,0x4F,0x72,0x34,0x48,0x42,0x4E,0x6B,0x4C,0x4C,0x75, + 0x76,0x4E,0x36,0x4F,0x74,0x4A,0x56,0x75,0x46,0x4B,0x7A,0x34,0x78,0x4F,0x57, + 0x39,0x41,0x48,0x42,0x6E,0x2B,0x55,0x6A,0x67,0x4A,0x47,0x41,0x54,0x2F,0x6D, + 0x2F,0x46,0x57,0x39,0x51,0x77,0x43,0x69,0x33,0x41,0x41,0x41,0x41,0x41,0x42, + 0x4A,0x20,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D,0x3D,0x5D, + 0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, + 0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x73, + 0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20,0x72,0x65, + 0x74,0x75,0x72,0x6E,0x20,0x7B,0x20,0x78,0x30,0x20,0x3D,0x20,0x2D,0x31,0x30, + 0x30,0x2C,0x20,0x78,0x20,0x3D,0x20,0x31,0x30,0x30,0x30,0x2C,0x20,0x79,0x20, + 0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29, + 0x20,0x2A,0x20,0x36,0x30,0x30,0x2C,0x20,0x72,0x30,0x20,0x3D,0x20,0x6D,0x61, + 0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x6D, + 0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x32,0x2C,0x20,0x72,0x76,0x20, + 0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29, + 0x20,0x2A,0x20,0x6D,0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x34,0x2C, + 0x20,0x74,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F, + 0x6D,0x28,0x29,0x2C,0x20,0x73,0x63,0x61,0x6C,0x65,0x20,0x3D,0x20,0x73,0x63, + 0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x20,0x3D,0x20,0x73,0x70, + 0x65,0x65,0x64,0x2C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61, + 0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x6E, + 0x75,0x6D,0x5F,0x73,0x74,0x61,0x72,0x73,0x2C,0x20,0x73,0x63,0x61,0x6C,0x65, + 0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, + 0x6C,0x61,0x79,0x65,0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F,0x72,0x20, + 0x69,0x20,0x3D,0x20,0x31,0x2C,0x6E,0x75,0x6D,0x5F,0x73,0x74,0x61,0x72,0x73, + 0x20,0x64,0x6F,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72, + 0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65, + 0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70, + 0x65,0x65,0x64,0x29,0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72, + 0x6E,0x20,0x6C,0x61,0x79,0x65,0x72,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63, + 0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64, + 0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x73,0x29, + 0x20,0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2B,0x20,0x30,0x2E, + 0x31,0x20,0x2A,0x20,0x73,0x2E,0x73,0x70,0x65,0x65,0x64,0x20,0x2A,0x20,0x64, + 0x74,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x73,0x2E,0x74,0x20,0x3E,0x20,0x31, + 0x20,0x64,0x6F,0x20,0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2D, + 0x20,0x31,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77, + 0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, + 0x78,0x20,0x3D,0x20,0x73,0x2E,0x78,0x30,0x20,0x2B,0x20,0x73,0x2E,0x78,0x20, + 0x2A,0x20,0x73,0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D, + 0x20,0x73,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x72,0x20,0x3D,0x20, + 0x73,0x2E,0x72,0x30,0x20,0x2B,0x20,0x73,0x2E,0x72,0x76,0x20,0x2A,0x20,0x73, + 0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x78,0x20,0x3D,0x20,0x73, + 0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x79, + 0x20,0x3D,0x20,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,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,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65, + 0x2C,0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20, + 0x32,0x35,0x35,0x2C,0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C, + 0x65,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63, + 0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x73,0x74,0x61,0x72,0x31,0x2C,0x20,0x78, + 0x2C,0x20,0x79,0x2C,0x20,0x72,0x2C,0x20,0x73,0x78,0x2C,0x20,0x73,0x79,0x2C, + 0x20,0x31,0x36,0x2C,0x20,0x31,0x36,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, + 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70, + 0x64,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72, + 0x28,0x64,0x74,0x2C,0x20,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x66,0x6F,0x72, + 0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28, + 0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61,0x74, + 0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20,0x65, + 0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75, + 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61, + 0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20, + 0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69, + 0x72,0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20,0x64,0x72, + 0x61,0x77,0x5F,0x73,0x74,0x61,0x72,0x28,0x76,0x29,0x20,0x65,0x6E,0x64,0x20, 0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74, - 0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28, - 0x6B,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x78,0x20,0x3D,0x20,0x70,0x6C, - 0x61,0x6E,0x65,0x74,0x2E,0x78,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20, - 0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x61,0x20,0x3D,0x20,0x6B,0x2E,0x70,0x20,0x2B,0x20,0x6B,0x2E,0x74, - 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x68,0x20,0x3D,0x20,0x32,0x32,0x35,0x20, - 0x2B,0x20,0x32,0x30,0x20,0x2A,0x20,0x28,0x31,0x20,0x2B,0x20,0x6D,0x61,0x74, - 0x68,0x2E,0x73,0x69,0x6E,0x28,0x6B,0x2E,0x74,0x30,0x20,0x2B,0x20,0x6B,0x2E, - 0x74,0x29,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69, - 0x63,0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2C, - 0x20,0x78,0x2C,0x20,0x79,0x2C,0x20,0x61,0x2C,0x20,0x2E,0x37,0x35,0x2C,0x20, - 0x2E,0x37,0x35,0x2C,0x20,0x36,0x34,0x2C,0x20,0x68,0x29,0x20,0x65,0x6E,0x64, - 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E, - 0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74, - 0x29,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F, - 0x2E,0x72,0x20,0x2B,0x20,0x64,0x74,0x20,0x69,0x66,0x20,0x6C,0x6F,0x67,0x6F, - 0x2E,0x72,0x20,0x3E,0x20,0x33,0x36,0x30,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C, - 0x6F,0x67,0x6F,0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20, - 0x2D,0x20,0x33,0x36,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x67,0x6F,0x2E, - 0x79,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x65,0x6E, + 0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C, + 0x6C,0x28,0x70,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x7B,0x20,0x70, + 0x20,0x3D,0x20,0x70,0x2C,0x20,0x74,0x30,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68, + 0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x31,0x30,0x2C, + 0x20,0x74,0x20,0x3D,0x20,0x30,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, + 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72, + 0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x6E,0x29,0x20, + 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x74,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F, + 0x72,0x20,0x69,0x20,0x3D,0x20,0x31,0x2C,0x6E,0x20,0x64,0x6F,0x20,0x74,0x61, + 0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x74,0x2C,0x20,0x63, + 0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x28,0x6D,0x61, + 0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x32,0x20,0x2F,0x20,0x6E,0x29,0x20, + 0x2A,0x20,0x69,0x29,0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72, + 0x6E,0x20,0x74,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66, + 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F, + 0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64,0x74,0x2C,0x20,0x6B,0x29,0x20,0x6B,0x2E, + 0x74,0x20,0x3D,0x20,0x6B,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x65,0x6E, 0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x70,0x6C,0x61,0x6E,0x65,0x74, - 0x28,0x64,0x74,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x3D, - 0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20, - 0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x3D,0x20,0x33,0x30,0x30,0x20, - 0x2B,0x20,0x6D,0x61,0x74,0x68,0x2E,0x73,0x69,0x6E,0x28,0x70,0x6C,0x61,0x6E, - 0x65,0x74,0x2E,0x74,0x29,0x2A,0x33,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F, - 0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x62,0x36, - 0x34,0x2C,0x20,0x66,0x69,0x6C,0x65,0x6E,0x61,0x6D,0x65,0x29,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,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,0x62, - 0x36,0x34,0x2C,0x20,0x66,0x69,0x6C,0x65,0x6E,0x61,0x6D,0x65,0x2C,0x20,0x22, - 0x62,0x61,0x73,0x65,0x36,0x34,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x69,0x6D,0x61,0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x20,0x3D,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x69,0x6D,0x61,0x67,0x65,0x2E,0x6E,0x65,0x77,0x49,0x6D,0x61, - 0x67,0x65,0x44,0x61,0x74,0x61,0x28,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74, - 0x61,0x29,0x20,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,0x69,0x6D,0x61,0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x6C,0x6F,0x61,0x64,0x28,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65, - 0x74,0x20,0x3D,0x20,0x7B,0x20,0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20, - 0x79,0x20,0x3D,0x20,0x33,0x30,0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x31,0x32, - 0x38,0x2C,0x20,0x68,0x20,0x3D,0x20,0x31,0x32,0x38,0x2C,0x20,0x74,0x20,0x3D, - 0x20,0x30,0x2C,0x20,0x69,0x6D,0x67,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F, - 0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x70,0x6C,0x61,0x6E,0x65, - 0x74,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x70,0x6C,0x61,0x6E, - 0x65,0x74,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x7D,0x20,0x6C,0x6F,0x67,0x6F, - 0x20,0x3D,0x20,0x7B,0x20,0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79, - 0x20,0x3D,0x20,0x33,0x30,0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x32,0x35,0x36, - 0x2C,0x20,0x68,0x20,0x3D,0x20,0x36,0x34,0x2C,0x20,0x72,0x20,0x3D,0x20,0x30, + 0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x6B,0x29, + 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x78,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E, + 0x65,0x74,0x2E,0x78,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D,0x20, + 0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, + 0x61,0x20,0x3D,0x20,0x6B,0x2E,0x70,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x20,0x6C, + 0x6F,0x63,0x61,0x6C,0x20,0x68,0x20,0x3D,0x20,0x32,0x32,0x35,0x20,0x2B,0x20, + 0x32,0x30,0x20,0x2A,0x20,0x28,0x31,0x20,0x2B,0x20,0x6D,0x61,0x74,0x68,0x2E, + 0x73,0x69,0x6E,0x28,0x6B,0x2E,0x74,0x30,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x29, + 0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, + 0x2E,0x64,0x72,0x61,0x77,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2C,0x20,0x78, + 0x2C,0x20,0x79,0x2C,0x20,0x61,0x2C,0x20,0x2E,0x37,0x35,0x2C,0x20,0x2E,0x37, + 0x35,0x2C,0x20,0x36,0x34,0x2C,0x20,0x68,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C, + 0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75, + 0x70,0x64,0x61,0x74,0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20, + 0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72, + 0x20,0x2B,0x20,0x64,0x74,0x20,0x69,0x66,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72, + 0x20,0x3E,0x20,0x33,0x36,0x30,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x67, + 0x6F,0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x2D,0x20, + 0x33,0x36,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x20, + 0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x65,0x6E,0x64,0x20, + 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, + 0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x70,0x6C,0x61,0x6E,0x65,0x74,0x28,0x64, + 0x74,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x3D,0x20,0x70, + 0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x70,0x6C, + 0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x3D,0x20,0x33,0x30,0x30,0x20,0x2B,0x20, + 0x6D,0x61,0x74,0x68,0x2E,0x73,0x69,0x6E,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74, + 0x2E,0x74,0x29,0x2A,0x33,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x61,0x64, + 0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x62,0x36,0x34,0x2C, + 0x20,0x66,0x69,0x6C,0x65,0x6E,0x61,0x6D,0x65,0x29,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,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,0x62,0x36,0x34, + 0x2C,0x20,0x66,0x69,0x6C,0x65,0x6E,0x61,0x6D,0x65,0x2C,0x20,0x22,0x62,0x61, + 0x73,0x65,0x36,0x34,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x69,0x6D, + 0x61,0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65, + 0x2E,0x69,0x6D,0x61,0x67,0x65,0x2E,0x6E,0x65,0x77,0x49,0x6D,0x61,0x67,0x65, + 0x44,0x61,0x74,0x61,0x28,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,0x29, + 0x20,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,0x69,0x6D,0x61,0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x29,0x20,0x65,0x6E, + 0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65, + 0x2E,0x6C,0x6F,0x61,0x64,0x28,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x20, + 0x3D,0x20,0x7B,0x20,0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20, + 0x3D,0x20,0x33,0x30,0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x31,0x32,0x38,0x2C, + 0x20,0x68,0x20,0x3D,0x20,0x31,0x32,0x38,0x2C,0x20,0x74,0x20,0x3D,0x20,0x30, 0x2C,0x20,0x69,0x6D,0x67,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D, - 0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x6C,0x6F,0x76,0x65,0x5F,0x62,0x61, - 0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x6E,0x67, - 0x22,0x29,0x20,0x7D,0x20,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,0x38,0x2C,0x20,0x31,0x38,0x2C, - 0x20,0x31,0x38,0x29,0x20,0x73,0x74,0x61,0x72,0x31,0x20,0x3D,0x20,0x6C,0x6F, - 0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x73,0x74, - 0x61,0x72,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x73,0x74, - 0x61,0x72,0x31,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x6B,0x6E,0x6F,0x6C,0x6C, - 0x31,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F, - 0x62,0x36,0x34,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65, - 0x36,0x34,0x2C,0x20,0x22,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2E,0x70,0x6E,0x67, - 0x22,0x29,0x20,0x6C,0x61,0x79,0x65,0x72,0x73,0x20,0x3D,0x20,0x7B,0x7D,0x20, - 0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x20,0x3D,0x20,0x63,0x72,0x65,0x61,0x74,0x65, - 0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x31,0x30,0x29,0x20,0x74,0x61,0x62, - 0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72, - 0x73,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F, - 0x6C,0x61,0x79,0x65,0x72,0x28,0x31,0x30,0x30,0x2C,0x20,0x30,0x2E,0x35,0x2C, - 0x20,0x30,0x2E,0x35,0x29,0x29,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E, - 0x73,0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72, - 0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72, - 0x28,0x37,0x30,0x2C,0x20,0x30,0x2E,0x37,0x2C,0x20,0x30,0x2E,0x37,0x29,0x29, - 0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C, - 0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73, - 0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x35,0x30,0x2C,0x20,0x31, - 0x2C,0x20,0x31,0x29,0x29,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64, - 0x6F,0x6D,0x73,0x65,0x65,0x64,0x28,0x6F,0x73,0x2E,0x74,0x69,0x6D,0x65,0x28, - 0x29,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x66,0x6F, - 0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72, - 0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64,0x6F,0x20,0x64,0x72, - 0x61,0x77,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x76, - 0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20, - 0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C, - 0x73,0x29,0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C, - 0x6C,0x28,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67, - 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x70,0x6C, - 0x61,0x6E,0x65,0x74,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65, - 0x74,0x2E,0x78,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x2C,0x20, - 0x30,0x2C,0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74, - 0x2E,0x77,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x68,0x29,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72, - 0x61,0x77,0x28,0x6C,0x6F,0x67,0x6F,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x6C,0x6F, - 0x67,0x6F,0x2E,0x78,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x2C,0x20,0x6C, - 0x6F,0x67,0x6F,0x2E,0x72,0x2C,0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x6C,0x6F, - 0x67,0x6F,0x2E,0x77,0x2F,0x32,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x68,0x2F, - 0x32,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x75,0x70,0x64,0x61,0x74,0x65,0x28,0x64,0x74, - 0x29,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69, - 0x70,0x61,0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64, - 0x6F,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C, - 0x61,0x79,0x65,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64, - 0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70, - 0x61,0x69,0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x29,0x20,0x64,0x6F, - 0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64, - 0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x75,0x70,0x64,0x61,0x74, - 0x65,0x5F,0x70,0x6C,0x61,0x6E,0x65,0x74,0x28,0x64,0x74,0x29,0x20,0x75,0x70, - 0x64,0x61,0x74,0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20,0x65, - 0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x63,0x6F,0x6E,0x66,0x28,0x74,0x29,0x20,0x74,0x2E,0x74,0x69,0x74, - 0x6C,0x65,0x20,0x3D,0x20,0x22,0x4C,0x4F,0x56,0x45,0x20,0x22,0x20,0x2E,0x2E, + 0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x5F, + 0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x70,0x6C,0x61,0x6E,0x65,0x74, + 0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x7D,0x20,0x6C,0x6F,0x67,0x6F,0x20,0x3D, + 0x20,0x7B,0x20,0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D, + 0x20,0x33,0x30,0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x32,0x35,0x36,0x2C,0x20, + 0x68,0x20,0x3D,0x20,0x36,0x34,0x2C,0x20,0x72,0x20,0x3D,0x20,0x30,0x2C,0x20, + 0x69,0x6D,0x67,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67, + 0x65,0x5F,0x62,0x36,0x34,0x28,0x6C,0x6F,0x76,0x65,0x5F,0x62,0x61,0x73,0x65, + 0x36,0x34,0x2C,0x20,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x6E,0x67,0x22,0x29, + 0x20,0x7D,0x20,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,0x38,0x2C,0x20,0x31,0x38,0x2C,0x20,0x31, + 0x38,0x29,0x20,0x73,0x74,0x61,0x72,0x31,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64, + 0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x73,0x74,0x61,0x72, + 0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x73,0x74,0x61,0x72, + 0x31,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x20, + 0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36, + 0x34,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34, + 0x2C,0x20,0x22,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2E,0x70,0x6E,0x67,0x22,0x29, + 0x20,0x6C,0x61,0x79,0x65,0x72,0x73,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x6B,0x6E, + 0x6F,0x6C,0x6C,0x73,0x20,0x3D,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B, + 0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x31,0x30,0x29,0x20,0x74,0x61,0x62,0x6C,0x65, + 0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C, + 0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61, + 0x79,0x65,0x72,0x28,0x31,0x30,0x30,0x2C,0x20,0x30,0x2E,0x35,0x2C,0x20,0x30, + 0x2E,0x35,0x29,0x29,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65, + 0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65,0x61, + 0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x37, + 0x30,0x2C,0x20,0x30,0x2E,0x37,0x2C,0x20,0x30,0x2E,0x37,0x29,0x29,0x20,0x74, + 0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61,0x79, + 0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61, + 0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x35,0x30,0x2C,0x20,0x31,0x2C,0x20, + 0x31,0x29,0x29,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D, + 0x73,0x65,0x65,0x64,0x28,0x6F,0x73,0x2E,0x74,0x69,0x6D,0x65,0x28,0x29,0x29, + 0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x66,0x6F,0x72,0x20, + 0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28, + 0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77, + 0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x76,0x29,0x20, + 0x65,0x6E,0x64,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E, + 0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x29, + 0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28, + 0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61, + 0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x70,0x6C,0x61,0x6E, + 0x65,0x74,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E, + 0x78,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x2C,0x20,0x30,0x2C, + 0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x77, + 0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x68,0x29,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77, + 0x28,0x6C,0x6F,0x67,0x6F,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x6C,0x6F,0x67,0x6F, + 0x2E,0x78,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x2C,0x20,0x6C,0x6F,0x67, + 0x6F,0x2E,0x72,0x2C,0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x6C,0x6F,0x67,0x6F, + 0x2E,0x77,0x2F,0x32,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x68,0x2F,0x32,0x29, + 0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x75,0x70,0x64,0x61,0x74,0x65,0x28,0x64,0x74,0x29,0x20, + 0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61, + 0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64,0x6F,0x20, + 0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79, + 0x65,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x66, + 0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69, + 0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x29,0x20,0x64,0x6F,0x20,0x75, + 0x70,0x64,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64,0x74,0x2C, + 0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F, + 0x70,0x6C,0x61,0x6E,0x65,0x74,0x28,0x64,0x74,0x29,0x20,0x75,0x70,0x64,0x61, + 0x74,0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20,0x65,0x6E,0x64, + 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x63,0x6F,0x6E,0x66,0x28,0x74,0x29,0x20,0x74,0x2E,0x74,0x69,0x74,0x6C,0x65, + 0x20,0x3D,0x20,0x22,0x4C,0x4F,0x56,0x45,0x20,0x22,0x20,0x2E,0x2E,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x5F,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x5F,0x73,0x74, + 0x72,0x69,0x6E,0x67,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, - 0x73,0x74,0x72,0x69,0x6E,0x67,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,0x20,0x74,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x61,0x75, - 0x64,0x69,0x6F,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x20,0x74,0x2E,0x6D, - 0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20, - 0x66,0x61,0x6C,0x73,0x65,0x20,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,0x20,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,0x20,0x65, - 0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x64,0x65, - 0x62,0x75,0x67,0x20,0x3D,0x20,0x64,0x65,0x62,0x75,0x67,0x20,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,0x20,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,0x6D, - 0x73,0x67,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,0x20,0x65, - 0x6E,0x64,0x20,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,0x20, - 0x65,0x72,0x72,0x6F,0x72,0x5F,0x70,0x72,0x69,0x6E,0x74,0x65,0x72,0x28,0x6D, - 0x73,0x67,0x2C,0x20,0x32,0x29,0x20,0x69,0x66,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,0x6F,0x72,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,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E, - 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, - 0x69,0x63,0x73,0x2E,0x72,0x65,0x73,0x65,0x74,0x28,0x29,0x20,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,0x20,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,0x31,0x34,0x29,0x20,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,0x20,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,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70, - 0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x65,0x72,0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x74,0x61, + 0x63,0x6F,0x64,0x65,0x6E,0x61,0x6D,0x65,0x20,0x2E,0x2E,0x20,0x22,0x29,0x22, + 0x20,0x74,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x61,0x75,0x64,0x69, + 0x6F,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x20,0x74,0x2E,0x6D,0x6F,0x64, + 0x75,0x6C,0x65,0x73,0x2E,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20,0x66,0x61, + 0x6C,0x73,0x65,0x20,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,0x20, + 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,0x20,0x65,0x6E,0x64, + 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x64,0x65,0x62,0x75, + 0x67,0x20,0x3D,0x20,0x64,0x65,0x62,0x75,0x67,0x20,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,0x20,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,0x6D,0x73,0x67, + 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,0x20,0x65,0x6E,0x64, + 0x20,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,0x20,0x65,0x72, + 0x72,0x6F,0x72,0x5F,0x70,0x72,0x69,0x6E,0x74,0x65,0x72,0x28,0x6D,0x73,0x67, + 0x2C,0x20,0x32,0x29,0x20,0x69,0x66,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,0x6F, + 0x72,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,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65, + 0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63, + 0x73,0x2E,0x72,0x65,0x73,0x65,0x74,0x28,0x29,0x20,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,0x20,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,0x31,0x34,0x29,0x20,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,0x20,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,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69, + 0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x65,0x72,0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x65,0x72, - 0x72,0x2C,0x20,0x6C,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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,0x20,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,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63, - 0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61, - 0x72,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61, - 0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x63, - 0x61,0x6C,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x77, - 0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64,0x6F,0x20,0x65,0x2C, - 0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x65,0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69,0x74,0x28,0x29,0x20,0x69, - 0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E, - 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20, - 0x65,0x20,0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20,0x61,0x6E,0x64,0x20,0x61, - 0x20,0x3D,0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70,0x65,0x22,0x20,0x74,0x68, - 0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x64, - 0x72,0x61,0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x65, - 0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x28,0x6D,0x73, - 0x67,0x29,0x20,0x70,0x72,0x69,0x6E,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72, - 0x72,0x6F,0x72,0x20,0x68,0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64, - 0x2C,0x20,0x74,0x68,0x65,0x20,0x67,0x61,0x6D,0x65,0x20,0x68,0x61,0x73,0x20, - 0x62,0x65,0x65,0x6E,0x20,0x73,0x74,0x6F,0x70,0x70,0x65,0x64,0x2E,0x22,0x29, - 0x20,0x69,0x66,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,0x6F,0x72,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,0x74,0x68, - 0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65, - 0x74,0x52,0x65,0x6E,0x64,0x65,0x72,0x54,0x61,0x72,0x67,0x65,0x74,0x28,0x29, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E, - 0x73,0x65,0x74,0x53,0x63,0x69,0x73,0x73,0x6F,0x72,0x28,0x29,0x20,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,0x20,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,0x20,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,0x31,0x34,0x29,0x20, + 0x20,0x6C,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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, + 0x20,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,0x20, + 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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, + 0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28, + 0x29,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, + 0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28,0x29,0x20,0x65, + 0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C, + 0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x77,0x68,0x69, + 0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64,0x6F,0x20,0x65,0x2C,0x20,0x61, + 0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65, + 0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69,0x74,0x28,0x29,0x20,0x69,0x66,0x20, + 0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x65,0x20, + 0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20,0x61,0x6E,0x64,0x20,0x61,0x20,0x3D, + 0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70,0x65,0x22,0x20,0x74,0x68,0x65,0x6E, + 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61, + 0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E, + 0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x65,0x6C,0x65, + 0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x28,0x6D,0x73,0x67,0x29, + 0x20,0x70,0x72,0x69,0x6E,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72,0x6F, + 0x72,0x20,0x68,0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x2C,0x20, + 0x74,0x68,0x65,0x20,0x67,0x61,0x6D,0x65,0x20,0x68,0x61,0x73,0x20,0x62,0x65, + 0x65,0x6E,0x20,0x73,0x74,0x6F,0x70,0x70,0x65,0x64,0x2E,0x22,0x29,0x20,0x69, + 0x66,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,0x6F,0x72,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,0x74,0x68,0x65,0x6E, + 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x52, + 0x65,0x6E,0x64,0x65,0x72,0x54,0x61,0x72,0x67,0x65,0x74,0x28,0x29,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x72,0x65, + 0x73,0x65,0x74,0x28,0x29,0x20,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,0x20,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,0x31,0x34, + 0x29,0x20,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,0x20, 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,0x20,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,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72, - 0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x72,0x72,0x20,0x3D,0x20, - 0x7B,0x7D,0x20,0x70,0x20,0x3D,0x20,0x73,0x74,0x72,0x69,0x6E,0x67,0x2E,0x66, - 0x6F,0x72,0x6D,0x61,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72,0x6F,0x72, - 0x20,0x68,0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x20,0x74,0x68, - 0x61,0x74,0x20,0x63,0x61,0x75,0x73,0x65,0x64,0x20,0x25,0x73,0x20,0x74,0x6F, - 0x20,0x73,0x74,0x6F,0x70,0x5C,0x6E,0x79,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20, - 0x6E,0x6F,0x74,0x69,0x66,0x79,0x20,0x25,0x73,0x20,0x61,0x62,0x6F,0x75,0x74, - 0x20,0x74,0x68,0x69,0x73,0x2E,0x22,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F, - 0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20,0x6F, - 0x72,0x20,0x22,0x74,0x68,0x69,0x73,0x20,0x67,0x61,0x6D,0x65,0x22,0x2C,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x61, - 0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x22,0x74,0x68,0x65,0x20,0x61, - 0x75,0x74,0x68,0x6F,0x72,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63, - 0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E, - 0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20, - 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20, - 0x63,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64,0x6F, - 0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69,0x74,0x28, - 0x29,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20, - 0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20,0x61,0x6E, - 0x64,0x20,0x61,0x20,0x3D,0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70,0x65,0x22, + 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,0x20,0x6C,0x6F, + 0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65, + 0x61,0x72,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x72,0x72,0x20, + 0x3D,0x20,0x7B,0x7D,0x20,0x70,0x20,0x3D,0x20,0x73,0x74,0x72,0x69,0x6E,0x67, + 0x2E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72, + 0x6F,0x72,0x20,0x68,0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x20, + 0x74,0x68,0x61,0x74,0x20,0x63,0x61,0x75,0x73,0x65,0x64,0x20,0x25,0x73,0x20, + 0x74,0x6F,0x20,0x73,0x74,0x6F,0x70,0x2E,0x5C,0x6E,0x59,0x6F,0x75,0x20,0x63, + 0x61,0x6E,0x20,0x6E,0x6F,0x74,0x69,0x66,0x79,0x20,0x25,0x73,0x20,0x61,0x62, + 0x6F,0x75,0x74,0x20,0x74,0x68,0x69,0x73,0x25,0x73,0x2E,0x22,0x2C,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x74,0x69, + 0x74,0x6C,0x65,0x20,0x6F,0x72,0x20,0x22,0x74,0x68,0x69,0x73,0x20,0x67,0x61, + 0x6D,0x65,0x22,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65, + 0x61,0x73,0x65,0x2E,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x22, + 0x74,0x68,0x65,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x22,0x2C,0x20,0x6C,0x6F, + 0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75,0x72,0x6C, + 0x20,0x61,0x6E,0x64,0x20,0x22,0x20,0x61,0x74,0x20,0x22,0x20,0x2E,0x2E,0x20, + 0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75, + 0x72,0x6C,0x20,0x6F,0x72,0x20,0x22,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C, + 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28, + 0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, + 0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73, + 0x65,0x6E,0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28, + 0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62, + 0x2C,0x20,0x63,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20, + 0x64,0x6F,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D, + 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69, + 0x74,0x28,0x29,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22, 0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E, - 0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E, - 0x64,0x20,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,0x20,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,0x65,0x6E,0x64,0x20,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,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72, - 0x72,0x68,0x61,0x6E,0x64,0x29,0x20,0x69,0x66,0x20,0x6E,0x6F,0x74,0x20,0x72, + 0x64,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20, + 0x61,0x6E,0x64,0x20,0x61,0x20,0x3D,0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70, + 0x65,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20, + 0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20, + 0x65,0x6E,0x64,0x20,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,0x20,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,0x65,0x6E,0x64,0x20,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,0x72,0x75,0x6E,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F, - 0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E, - 0x64,0x20,0x6F,0x72,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68,0x61, - 0x6E,0x64,0x29,0x20,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, - 0x65,0x6E,0x64, + 0x6F,0x76,0x65,0x2E,0x69,0x6E,0x69,0x74,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F, + 0x76,0x65,0x2E,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61, + 0x6E,0x64,0x20,0x6F,0x72,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68, + 0x61,0x6E,0x64,0x29,0x20,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,0x65,0x6E,0x64,0x20,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,0x72,0x75,0x6E,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65, + 0x6C,0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x20, + 0x6F,0x72,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68,0x61,0x6E,0x64, + 0x29,0x20,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,0x65,0x6E, + 0x64, }; // [/boot.lua] From eb90e08b0d5a3a5564cbbf23078ac094d1e34fb4 Mon Sep 17 00:00:00 2001 From: vrld Date: Mon, 30 May 2011 14:26:28 +0200 Subject: [PATCH 045/384] Update 0.8.0 changelog (Color class is internal only) --- changes.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/changes.txt b/changes.txt index 437e6d875..75d3e812b 100644 --- a/changes.txt +++ b/changes.txt @@ -6,7 +6,6 @@ LOVE 0.8.0 [Name pending] * Added framebuffer:clear(r, g, b, a). * Added love.graphics.arc. * Added seek and tell to Source objects. - * Added Color class. * Added color interpolation to ParticleSystem. * Added alpha masking. * Added automatic PO2 padding. From 30d6968ef978d01c617272907598b789f2a81bbc Mon Sep 17 00:00:00 2001 From: vrld Date: Mon, 30 May 2011 14:45:33 +0200 Subject: [PATCH 046/384] Rename 'defineMask' to 'newMask'. Add inverted mask (issue #226). --- src/modules/graphics/opengl/Graphics.cpp | 4 ++-- src/modules/graphics/opengl/Graphics.h | 4 +++- src/modules/graphics/opengl/wrap_Graphics.cpp | 19 +++++++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index ce76d5426..fa94a7853 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -437,9 +437,9 @@ namespace opengl glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); } - void Graphics::useMask() + void Graphics::useMask(bool invert) { - glStencilFunc(GL_EQUAL, 1, 1); + glStencilFunc(GL_EQUAL, (int)(!invert), 1); // invert ? 0 : 1 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index 8be7661f2..ee1c09fc6 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -242,8 +242,10 @@ namespace opengl /** * 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 useMask(); + void useMask(bool invert = false); /** * Disables the stencil buffer diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 4983116b2..8fdb63f64 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -144,7 +144,7 @@ namespace opengl return instance->getScissor(L); } - int w_defineMask(lua_State * L) + int w_newMask(lua_State * L) { // just return the function if (!lua_isfunction(L, 1)) @@ -153,7 +153,7 @@ namespace opengl return 1; } - int w_setMask(lua_State * L) + static int setMask(lua_State * L, bool invert) { // no argument -> clear mask if (lua_isnoneornil(L, 1)) { @@ -166,11 +166,21 @@ namespace opengl instance->defineMask(); lua_call(L, lua_gettop(L) - 1, 0); // call mask(...) - instance->useMask(); + instance->useMask(invert); return 0; } + int w_setMask(lua_State * L) + { + return setMask(L, false); + } + + int w_setInvertedMask(lua_State * L) + { + return setMask(L, true); + } + int w_newImage(lua_State * L) { // Convert to File, if necessary. @@ -1047,8 +1057,9 @@ namespace opengl { "setScissor", w_setScissor }, { "getScissor", w_getScissor }, - { "defineMask", w_defineMask }, + { "newMask", w_newMask }, { "setMask", w_setMask }, + { "setInvertedMask", w_setInvertedMask }, { "point", w_point }, { "line", w_line }, From c981d835d3343a926459ea2f250233f64942d83b Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 3 Jun 2011 16:43:33 -0500 Subject: [PATCH 047/384] Cleaned up/updated love.graphics doc comments. --- src/modules/graphics/opengl/Graphics.h | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index ee1c09fc6..ccde3ff85 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -259,7 +259,7 @@ namespace opengl Image * newImage(love::image::ImageData * data); /** - * Creates a Frame + * Creates a Quad object. **/ Quad * newQuad(int x, int y, int w, int h, int sw, int sh); @@ -276,6 +276,7 @@ namespace opengl /** * Sets the foreground color. + * @param c The new foreground color. **/ void setColor(const Color& c); @@ -291,13 +292,12 @@ namespace opengl /** * Gets the current background color. - * @param c Array of size 3 (r,g,b). **/ Color getBackgroundColor(); /** * Sets the current font. - * @parm font A Font object. + * @param font A Font object. **/ void setFont(Font * font); /** @@ -417,8 +417,8 @@ namespace opengl /** * Draws a series of lines connecting the given vertices. * @param coords Vertex components (x1, y1, x2, y2, etc.) - * @param count Coord array size - * @param looping Wether the line is joining itself + * @param count Number of coordinates in the array. + * @param looping Whether the line joins up with itself. **/ void polyline(const float* coords, size_t count, bool looping = false); @@ -463,10 +463,20 @@ namespace opengl * @param x X-coordinate. * @param y Y-coordinate. * @param radius Radius of the circle. - * @param points Amount of points to use to draw 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); /** @@ -479,7 +489,7 @@ namespace opengl /** * Creates a screenshot of the view and saves it to the default folder. - * @param file The file to write the screenshot to. + * @param image The love.image module. **/ love::image::ImageData * newScreenshot(love::image::Image * image); From 09ed781f6623dbbfdfe1ab0a6c57d51b03c8a7d9 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 3 Jun 2011 17:04:35 -0500 Subject: [PATCH 048/384] tabs for indentation, not spaces (dammit Xcode) --- src/modules/graphics/opengl/Graphics.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index ccde3ff85..6e0e1ae92 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -477,7 +477,7 @@ namespace opengl * @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); + 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. From 1d5fca6f466717905cee1e8ccaad17556c3ecc40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Grzywacz?= Date: Wed, 8 Jun 2011 16:54:35 +0200 Subject: [PATCH 049/384] Multiple thread backends. --- platform/unix/exclude | 3 + src/common/delay.cpp | 41 ++++ .../thread/ThreadModule.h => common/delay.h} | 26 +-- src/common/runtime.cpp | 13 +- src/love.cpp | 4 +- src/modules/audio/openal/Audio.cpp | 50 +++-- src/modules/audio/openal/Audio.h | 28 ++- src/modules/audio/openal/Pool.cpp | 55 ++--- src/modules/audio/openal/Pool.h | 3 +- src/modules/thread/{sdl => }/Thread.cpp | 64 +++--- src/modules/thread/{sdl => }/Thread.h | 37 ++-- src/modules/thread/posix/threads.cpp | 196 +++++++++++++++++ src/modules/thread/posix/threads.h | 103 +++++++++ src/modules/thread/sdl/threads.cpp | 164 ++++++++++++++ src/modules/thread/sdl/threads.h | 104 +++++++++ src/modules/thread/threads.cpp | 49 +++++ src/modules/thread/threads.h | 82 +++++++ src/modules/thread/win32/threads.cpp | 202 ++++++++++++++++++ src/modules/thread/win32/threads.h | 106 +++++++++ src/modules/thread/{sdl => }/wrap_Thread.cpp | 3 - src/modules/thread/{sdl => }/wrap_Thread.h | 4 +- src/modules/timer/sdl/Timer.cpp | 3 +- 22 files changed, 1208 insertions(+), 132 deletions(-) create mode 100644 src/common/delay.cpp rename src/{modules/thread/ThreadModule.h => common/delay.h} (72%) rename src/modules/thread/{sdl => }/Thread.cpp (88%) rename src/modules/thread/{sdl => }/Thread.h (89%) create mode 100644 src/modules/thread/posix/threads.cpp create mode 100644 src/modules/thread/posix/threads.h create mode 100644 src/modules/thread/sdl/threads.cpp create mode 100644 src/modules/thread/sdl/threads.h create mode 100644 src/modules/thread/threads.cpp create mode 100644 src/modules/thread/threads.h create mode 100644 src/modules/thread/win32/threads.cpp create mode 100644 src/modules/thread/win32/threads.h rename src/modules/thread/{sdl => }/wrap_Thread.cpp (99%) rename src/modules/thread/{sdl => }/wrap_Thread.h (98%) diff --git a/platform/unix/exclude b/platform/unix/exclude index 230e16968..1b3e4f3d6 100644 --- a/platform/unix/exclude +++ b/platform/unix/exclude @@ -21,3 +21,6 @@ ./modules/native/tcc/libtcc/stab.h ./libraries/luasocket/libluasocket/wsocket.* ./modules/sound/lullaby/FLACDecoder.* +./modules/thread/sdl/* +./modules/thread/win32/* +./modules/thread/posix/* diff --git a/src/common/delay.cpp b/src/common/delay.cpp new file mode 100644 index 000000000..ff2e95c2d --- /dev/null +++ b/src/common/delay.cpp @@ -0,0 +1,41 @@ +/** +* 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. +**/ + + +#include "delay.h" + +namespace love { + + void delay(unsigned int ms) { +#if LOVE_THREADS == LOVE_THREADS_POSIX + struct timespec ts1, ts2; + + ts1.tv_sec = ms / 1000; + ts1.tv_nsec = (ms % 1000) * 1000000; + // FIXME: handle signals + nanosleep(&ts1, &ts2); +#elif LOVE_THREADS == LOVE_THREADS_WIN32 + Sleep(ms); +#elif LOVE_THREADS == LOVE_THREADS_SDL + SDL_Delay(ms); +#endif + } + +} // namespace love diff --git a/src/modules/thread/ThreadModule.h b/src/common/delay.h similarity index 72% rename from src/modules/thread/ThreadModule.h rename to src/common/delay.h index e914ed46c..8a70ff42b 100644 --- a/src/modules/thread/ThreadModule.h +++ b/src/common/delay.h @@ -18,24 +18,16 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_THREAD_THREAD_H -#define LOVE_THREAD_THREAD_H +#ifndef DELAY_H_ +#define DELAY_H_ -#include -#include +#include -namespace love -{ -namespace thread -{ - class ThreadModule : public Module - { - public: - virtual ~ThreadModule(){}; - virtual void unregister(const std::string & name) = 0; - }; // ThreadModule -} // thread -} // love +namespace love { -#endif // LOVE_THREAD_THREAD_H + void delay(unsigned int ms); + +}; // namespace love + +#endif /* DELAY_H_ */ diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index 95e9df64d..039573da8 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -25,17 +25,15 @@ #include "Object.h" #include "Reference.h" #include "StringMap.h" +#include // STD #include -// SDL -#include -#include namespace love { - static SDL_mutex *gcmutex = 0; + static thread::Mutex *gcmutex = 0; void *_gcmutex = 0; unsigned int _gcthread = 0; /** @@ -46,17 +44,16 @@ namespace love { if (!gcmutex) { - gcmutex = SDL_CreateMutex(); + gcmutex = new thread::Mutex(); _gcmutex = (void*) gcmutex; } Proxy * p = (Proxy *)lua_touserdata(L, 1); Object * t = (Object *)p->data; if(p->own) { - SDL_mutexP(gcmutex); - _gcthread = (unsigned int) SDL_ThreadID(); + thread::Lock lock(gcmutex); + _gcthread = thread::ThreadBase::threadId(); t->release(); - SDL_mutexV(gcmutex); } return 0; } diff --git a/src/love.cpp b/src/love.cpp index 38e34d392..f875b486b 100644 --- a/src/love.cpp +++ b/src/love.cpp @@ -52,7 +52,7 @@ #include #include #include -#include +#include // Libraries. #include "libraries/luasocket/luasocket.h" @@ -77,7 +77,7 @@ static const luaL_Reg modules[] = { { "love.physics", love::physics::box2d::luaopen_love_physics }, { "love.sound", love::sound::luaopen_love_sound }, { "love.timer", love::timer::sdl::luaopen_love_timer }, - { "love.thread", love::thread::sdl::luaopen_love_thread }, + { "love.thread", love::thread::luaopen_love_thread }, { 0, 0 } }; diff --git a/src/modules/audio/openal/Audio.cpp b/src/modules/audio/openal/Audio.cpp index ab29346b8..dc31597e4 100644 --- a/src/modules/audio/openal/Audio.cpp +++ b/src/modules/audio/openal/Audio.cpp @@ -19,6 +19,7 @@ **/ #include "Audio.h" +#include #include @@ -28,8 +29,34 @@ namespace audio { namespace openal { + Audio::PoolThread::PoolThread(Pool* pool) + : pool(pool), finish(false) { + + } + + void Audio::PoolThread::main() + { + 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() - : finish(false) { // Passing zero for default device. device = alcOpenDevice(0); @@ -67,15 +94,16 @@ namespace openal // pool must be allocated after AL context. pool = new Pool(); - thread = SDL_CreateThread(Audio::run, (void*)this); + poolThread = new PoolThread(pool); + poolThread->start(); } Audio::~Audio() { - finish = true; - - SDL_WaitThread(thread, 0); + poolThread->setFinish(); + poolThread->wait(); + delete poolThread; delete pool; alcMakeContextCurrent(0); @@ -84,18 +112,6 @@ namespace openal alcCloseDevice(device); } - int Audio::run(void * d) - { - Audio * instance = (Audio*)d; - - while(!instance->finish) - { - instance->pool->update(); - SDL_Delay(5); - } - - return 0; - } const char * Audio::getName() const { diff --git a/src/modules/audio/openal/Audio.h b/src/modules/audio/openal/Audio.h index 0a71e20a9..2479ceb5d 100644 --- a/src/modules/audio/openal/Audio.h +++ b/src/modules/audio/openal/Audio.h @@ -37,6 +37,7 @@ #include "Source.h" #include "Pool.h" +#include // OpenAL #ifdef LOVE_MACOSX @@ -66,17 +67,30 @@ namespace openal // The OpenAL context. ALCcontext * context; - SDL_Thread * thread; - // The Pool. Pool * pool; - // Set this to true when the thread should finish. - // Main thread will write to this value, and Audio::run - // will read from it. - bool finish; - static int run(void * unused); + class PoolThread: public thread::ThreadBase { + 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; + + virtual void main(); + + public: + PoolThread(Pool* pool); + void setFinish(); + }; + + PoolThread* poolThread; public: diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index 74a6f3fe4..80a419602 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -44,7 +44,7 @@ namespace openal alGenSources(NUM_SOURCES, sources); // Create the mutex. - mutex = SDL_CreateMutex(); + mutex = new thread::Mutex(); if(alGetError() != AL_NO_ERROR) throw love::Exception("Could not generate sources."); @@ -58,7 +58,7 @@ namespace openal { stop(); - SDL_DestroyMutex(mutex); + delete mutex; // Free all sources. alDeleteSources(NUM_SOURCES, sources); @@ -67,28 +67,30 @@ namespace openal bool Pool::isAvailable() const { bool has = false; - LOCK(mutex); - has = !available.empty(); - UNLOCK(mutex); + { + thread::Lock lock(mutex); + has = !available.empty(); + } return has; } bool Pool::isPlaying(Source * s) { bool p = false; - LOCK(mutex); - for(std::map::iterator i = playing.begin(); i != playing.end(); i++) { - if(i->first == s) - p = true; + thread::Lock lock(mutex); + for(std::map::iterator i = playing.begin(); i != playing.end(); i++) + { + if(i->first == s) + p = true; + } } - UNLOCK(mutex); return p; } void Pool::update() { - LOCK(mutex); + thread::Lock lock(mutex); std::map::iterator i = playing.begin(); @@ -107,8 +109,6 @@ namespace openal i++; } } - - UNLOCK(mutex); } int Pool::getNumSources() const @@ -126,7 +126,7 @@ namespace openal bool ok; out = 0; - LOCK(mutex); + thread::Lock lock(mutex); bool alreadyPlaying = findSource(source, out); @@ -160,14 +160,12 @@ namespace openal ok = true; } - UNLOCK(mutex); - return ok; } void Pool::stop() { - LOCK(mutex); + thread::Lock lock(mutex); for(std::map::iterator i = playing.begin(); i != playing.end(); i++) { i->first->stopAtomic(); @@ -175,66 +173,57 @@ namespace openal } playing.clear(); - - UNLOCK(mutex); } void Pool::stop(Source * source) { - LOCK(mutex); + thread::Lock lock(mutex); removeSource(source); - UNLOCK(mutex); } void Pool::pause() { - LOCK(mutex); + thread::Lock lock(mutex); for(std::map::iterator i = playing.begin(); i != playing.end(); i++) i->first->pauseAtomic(); - UNLOCK(mutex); } void Pool::pause(Source * source) { - LOCK(mutex); + thread::Lock lock(mutex); ALuint out; if(findSource(source, out)) source->pauseAtomic(); - UNLOCK(mutex); } void Pool::resume() { - LOCK(mutex); + thread::Lock lock(mutex); for(std::map::iterator i = playing.begin(); i != playing.end(); i++) i->first->resumeAtomic(); - UNLOCK(mutex); } void Pool::resume(Source * source) { - LOCK(mutex); + thread::Lock lock(mutex); ALuint out; if(findSource(source, out)) source->resumeAtomic(); - UNLOCK(mutex); } void Pool::rewind() { - LOCK(mutex); + thread::Lock lock(mutex); for(std::map::iterator i = playing.begin(); i != playing.end(); i++) i->first->rewindAtomic(); - UNLOCK(mutex); } void Pool::rewind(Source * source) { - LOCK(mutex); + thread::Lock lock(mutex); ALuint out; if(findSource(source, out)) source->rewindAtomic(); - UNLOCK(mutex); } void Pool::release(Source * source) diff --git a/src/modules/audio/openal/Pool.h b/src/modules/audio/openal/Pool.h index f83b5002d..02f0eae27 100644 --- a/src/modules/audio/openal/Pool.h +++ b/src/modules/audio/openal/Pool.h @@ -33,6 +33,7 @@ // LOVE #include #include +#include // OpenAL #ifdef LOVE_MACOSX @@ -70,7 +71,7 @@ namespace openal // Only one thread can access this object at the same time. This mutex will // make sure of that. - SDL_mutex * mutex; + thread::Mutex* mutex; public: diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/Thread.cpp similarity index 88% rename from src/modules/thread/sdl/Thread.cpp rename to src/modules/thread/Thread.cpp index e44e2738f..9c273e337 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/Thread.cpp @@ -31,10 +31,14 @@ namespace love { namespace thread { -namespace sdl -{ - int threadfunc(ThreadData *comm) + + Thread::ThreadThread::ThreadThread(ThreadData* comm) + : comm(comm) { + + } + + void Thread::ThreadThread::main() { lua_State * L = lua_open(); luaL_openlibs(L); #ifdef LOVE_BUILD_STANDALONE @@ -53,17 +57,18 @@ namespace sdl lua_setfield(L, -2, "_curthread"); if(luaL_dostring(L, comm->getCode()) == 1) { - SDL_mutexP((SDL_mutex*) comm->mutex); - ThreadVariant *v = new ThreadVariant(lua_tostring(L, -1), lua_strlen(L, -1)); - comm->setValue("error", v); - v->release(); - SDL_mutexV((SDL_mutex*) comm->mutex); - SDL_CondBroadcast((SDL_cond*) comm->cond); + { + Lock lock((Mutex*) comm->mutex); + ThreadVariant *v = new ThreadVariant(lua_tostring(L, -1), lua_strlen(L, -1)); + comm->setValue("error", v); + v->release(); + } + ((Conditional*) comm->cond)->broadcast(); } lua_close(L); - return 0; } + ThreadVariant::ThreadVariant(bool boolean) { type = BOOLEAN; @@ -183,8 +188,8 @@ namespace sdl this->data = new char[len+1]; memset(this->data, 0, len+1); memcpy(this->data, data->getData(), len); - mutex = SDL_CreateMutex(); - cond = SDL_CreateCond(); + mutex = new Mutex(); + cond = new Conditional(); comm = new ThreadData(name.c_str(), name.length(), this->data, mutex, cond); } @@ -192,8 +197,8 @@ namespace sdl : handle(0), module(module), name(name), data(0), isThread(false) { module->retain(); - mutex = SDL_CreateMutex(); - cond = SDL_CreateCond(); + mutex = new Mutex(); + cond = new Conditional(); comm = new ThreadData(name.c_str(), name.length(), NULL, mutex, cond); } @@ -203,25 +208,27 @@ namespace sdl delete[] data; delete comm; module->unregister(name); - SDL_DestroyMutex(mutex); - SDL_DestroyCond(cond); + delete mutex; + delete cond; module->release(); } void Thread::start() { - if (!handle && isThread) - handle = SDL_CreateThread((int (*)(void*)) threadfunc, (void*) comm); + if (!handle && isThread) { + handle = new ThreadThread(comm); + handle->start(); + } } void Thread::kill() { if (handle) { - SDL_mutexP((SDL_mutex *) _gcmutex); - SDL_KillThread(handle); + Lock lock((Mutex *) _gcmutex); + handle->kill(); + delete handle; handle = 0; - SDL_mutexV((SDL_mutex *) _gcmutex); } } @@ -229,19 +236,20 @@ namespace sdl { if (handle) { - SDL_WaitThread(handle, NULL); + handle->wait(); + delete handle; handle = 0; } } void Thread::lock() { - SDL_mutexP(mutex); + mutex->lock(); } void Thread::unlock() { - SDL_mutexV(mutex); + mutex->unlock(); } std::string Thread::getName() @@ -264,7 +272,7 @@ namespace sdl { if (comm->getValue("error")) return 0; - SDL_CondWait(cond, mutex); + cond->wait(mutex); v = comm->getValue(name); } v->retain(); @@ -281,7 +289,7 @@ namespace sdl lock(); //this function explicitly locks comm->setValue(name, v); //because we need unlock(); //it to unlock here for the cond - SDL_CondBroadcast(cond); + cond->broadcast(); } ThreadModule::ThreadModule() @@ -294,6 +302,7 @@ namespace sdl for (threadlist_t::iterator i = threads.begin(); i != threads.end(); i++) { i->second->kill(); + delete i->second; } } @@ -333,6 +342,7 @@ namespace sdl if (threads.count(name) == 0) return; threadlist_t::iterator i = threads.find(name); + // FIXME: shouldn't the thread be deleted? threads.erase(i); } @@ -340,6 +350,6 @@ namespace sdl { return "love.thread.sdl"; } -} // sdl + } // thread } // love diff --git a/src/modules/thread/sdl/Thread.h b/src/modules/thread/Thread.h similarity index 89% rename from src/modules/thread/sdl/Thread.h rename to src/modules/thread/Thread.h index a6a706c77..2d1d5ace9 100644 --- a/src/modules/thread/sdl/Thread.h +++ b/src/modules/thread/Thread.h @@ -21,25 +21,24 @@ #ifndef LOVE_THREAD_SDL_THREAD_H #define LOVE_THREAD_SDL_THREAD_H -// SDL -#include -#include - // STL #include #include // LOVE -#include #include #include +#include +#include + namespace love { namespace thread { -namespace sdl -{ + + class ThreadModule; + enum ThreadVariantType { UNKNOWN = 0, @@ -98,15 +97,28 @@ namespace sdl class Thread : public love::Object { private: - SDL_Thread *handle; - love::thread::ThreadModule *module; + class ThreadThread: public ThreadBase { + private: + ThreadData* comm; + + protected: + virtual void main(); + + public: + ThreadThread(ThreadData* comm); + }; + + ThreadThread *handle; + + ThreadModule *module; ThreadData *comm; std::string name; char *data; - SDL_mutex *mutex; - SDL_cond *cond; + Mutex *mutex; + Conditional *cond; bool isThread; + public: Thread(love::thread::ThreadModule *module, const std::string & name, love::Data *data); Thread(love::thread::ThreadModule *module, const std::string & name); @@ -125,7 +137,7 @@ namespace sdl typedef std::map threadlist_t; - class ThreadModule : public love::thread::ThreadModule + class ThreadModule : public love::Module { private: threadlist_t threads; @@ -140,7 +152,6 @@ namespace sdl void unregister(const std::string & name); const char *getName() const; }; // ThreadModule -} // sdl } // thread } // love diff --git a/src/modules/thread/posix/threads.cpp b/src/modules/thread/posix/threads.cpp new file mode 100644 index 000000000..b4eee8af9 --- /dev/null +++ b/src/modules/thread/posix/threads.cpp @@ -0,0 +1,196 @@ +/** +* 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. +**/ + +#include "threads.h" + +namespace love +{ +namespace thread +{ + + Mutex::Mutex() { + pthread_create_mutex(&mutex, NULL); + } + + Mutex::~Mutex() { + pthread_mutex_destroy(&mutex); + } + + void Mutex::lock() { + pthread_mutex_lock(&mutex); + } + + void Mutex::unlock() { + pthread_mutex_unlock(&mutex); + } + + + + + void* ThreadBase::thread_runner(void* param) { + ThreadBase* thread = (ThreadBase*)param; + thread->main(); + return NULL; + } + + + + ThreadBase::ThreadBase() : running(false) { + pthread_t thread; + } + + + + ThreadBase::~ThreadBase() { + if (running) { + wait(); + } + } + + + + bool ThreadBase::start() { + if (pthread_create(&thread, NULL, thread_runner, this)) { + return false; + } else { + running = true; + return true; + } + } + + + void ThreadBase::wait() { + pthread_join(thread, NULL); + running = false; + } + + + void ThreadBase::kill() { + // FIXME: I'm not sure about that one. + pthread_kill(thread, 9); + running = false; + } + + unsigned int ThreadBase::threadId() { + return (unsigned int)((size_t)pthread_self()); + } + + Semaphore::Semaphore(unsigned int initial_value) { + sem_init(&sem, 0, initial_value); + } + + Semaphore::~Semaphore() { + sem_destroy(&sem); + } + + unsigned int Semaphore::value() { + int val = 0; + if (sem_getvalue(&sem, &val)) { + return 0; + } else { + return val; + } + } + + void Semaphore::post() { + sem_post(&sem); + } + + bool Semaphore::wait(int timeout) { + if (timeout < 0) { + if (sem_wait(&sem)) { + return false; + } else { + return true; + } + } else if (timeout == 0) { + if (sem_trywait(&sem)) { + return false; + } else { + return true; + } + } else { + struct timespec ts; + ts.tv_sec = timeout/1000; + ts.tv_nsec = (timeout % 1000) * 1000000; + if (sem_timedwait(&sem, &ts)) { + return false; // either timeout or error... + } else { + return true; + } + } + } + + + bool Semaphore::tryWait() { + if (sem_trywait(&sem)) { + return false; + } else { + return true; + } + } + + + + + Conditional::Conditional() { + pthread_cond_init(&cond, NULL); + } + + Conditional::~Conditional() { + pthread_cond_destroy(&cond); + } + + void Conditional::signal() { + pthread_cond_signal(&cond); + } + + void Conditional::broadcast() { + pthread_cond_broadcast(&cond); + } + + bool Conditional::wait(Mutex* mutex, int timeout) { + if (timeout < 0) { + if (pthread_cond_wait(cond, mutex->mutex)) { + return false; + } else { + return true; + } + } else { + struct timespec ts; + int ret; + + ts.tv_sec = timeout / 1000; + ts.tv_nsec = (timeout % 1000) * 1000000; + + ret = pthread_cond_timedwait(&cond, mutex->mutex, &ts); + if (ret == ETIMEDOUT) { + return false; + } else if (ret == 0) { + return true; + } else { + // something bad happend! + return false; + } + } + } +} // namespace thread +} // namespace love + diff --git a/src/modules/thread/posix/threads.h b/src/modules/thread/posix/threads.h new file mode 100644 index 000000000..352dfbe65 --- /dev/null +++ b/src/modules/thread/posix/threads.h @@ -0,0 +1,103 @@ +/** +* 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_PLATFORM_POSIX_THREADS_H_ +#define LOVE_PLATFORM_POSIX_THREADS_H_ + +#include +#include + +namespace love +{ +namespace thread +{ + + class Mutex { + private: + pthread_mutex_t mutex; + Mutex(const Mutex& mutex) {} + + friend class Conditional; + + public: + Mutex(); + ~Mutex(); + + void lock(); + void unlock(); + }; + + + class ThreadBase { + private: + pthread_t thread; + ThreadBase(ThreadBase& thread) {} + + static void* thread_runner(void* param); + + protected: + + virtual void main() = 0; + + public: + ThreadBase(); + virtual ~ThreadBase(); + + bool start(); + void wait(); + void kill(); + + static unsigned int threadId(); + }; + + class Semaphore { + private: + Semaphore(const Semaphore& sem) {} + sem_t semaphore; + + public: + Semaphore(unsigned int initial_value); + ~Semaphore(); + + unsigned int value(); + void post(); + bool wait(int timeout = -1); + bool tryWait(); + }; + + // Should conditional inherit from mutex? + class Conditional { + private: + pthread_cond_t cond; + + public: + Conditional(); + ~Conditional(); + + void signal(); + void broadcast(); + bool wait(Mutex* mutex, int timeout=-1); + }; + +} // namespace thread +} // namespace love + + +#endif // !LOVE_PLATFORM_POSIX_THREADS_H_ diff --git a/src/modules/thread/sdl/threads.cpp b/src/modules/thread/sdl/threads.cpp new file mode 100644 index 000000000..fc4e5dbf8 --- /dev/null +++ b/src/modules/thread/sdl/threads.cpp @@ -0,0 +1,164 @@ +/** +* 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. +**/ + +#include "threads.h" + +namespace love +{ +namespace thread +{ + + Mutex::Mutex() { + mutex = SDL_CreateMutex(); + } + + Mutex::~Mutex() { + SDL_DestroyMutex(mutex); + } + + void Mutex::lock() { + SDL_mutexP(mutex); + } + + void Mutex::unlock() { + SDL_mutexV(mutex); + } + + + + int ThreadBase::thread_runner(void* param) { + ThreadBase* thread = (ThreadBase*)param; + thread->main(); + return 0; + } + + ThreadBase::ThreadBase() : running(false) { + SDL_Thread* thread; + } + + ThreadBase::~ThreadBase() { + if (running) { + wait(); + } + } + + bool ThreadBase::start() { + thread = SDL_CreateThread(thread_runner, this); + if (thread == NULL) { + return false; + } else { + running = true; + return true; + } + } + + void ThreadBase::wait() { + SDL_WaitThread(thread, NULL); + running = false; + } + + void ThreadBase::kill() { + SDL_KillThread(thread); + running = false; + } + + unsigned int ThreadBase::threadId() { + return (unsigned int)SDL_ThreadID(); + } + + Semaphore::Semaphore(unsigned int initial_value) { + semaphore = SDL_CreateSemaphore(initial_value); + } + + Semaphore::~Semaphore() { + SDL_DestroySemaphore(semaphore); + } + + unsigned int Semaphore::value() { + return SDL_SemValue(semaphore); + } + + void Semaphore::post() { + SDL_SemPost(semaphore); + } + + bool Semaphore::wait(int timeout) { + if (timeout < 0) { + return SDL_SemWait(semaphore) ? false : true; + } else if (timeout == 0) { + return SDL_SemTryWait(semaphore) ? false : true; + } else { + int ret = SDL_SemWaitTimeout(semaphore, timeout); + if (ret == SDL_MUTEX_TIMEDOUT) { + return false; + } else if (ret == 0) { + return true; + } else { + // some nasty error + return false; + } + } + } + + bool Semaphore::tryWait() { + return SDL_SemTryWait(semaphore) ? false : true; + } + + + + 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(Mutex* mutex, int timeout) { + if (timeout < 0) { + if (SDL_CondWait(cond, mutex->mutex)) { + // error + return false; + } else { + return true; + } + } else { + int ret = SDL_CondWaitTimeout(cond, mutex->mutex, timeout); + if (ret == SDL_MUTEX_TIMEDOUT) { + return false; + } else if (ret == 0) { + return true; + } else { + // some bad error + return false; + } + } + } + +} // namespace thread +} // namespace love diff --git a/src/modules/thread/sdl/threads.h b/src/modules/thread/sdl/threads.h new file mode 100644 index 000000000..a4e7e03e8 --- /dev/null +++ b/src/modules/thread/sdl/threads.h @@ -0,0 +1,104 @@ +/** +* 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_PLATFORM_SDL_THREADS_H_ +#define LOVE_PLATFORM_SDL_THREADS_H_ + +#include "SDL.h" + +namespace love +{ +namespace thread +{ + + class Mutex { + private: + SDL_mutex* mutex; + Mutex(const Mutex& mutex) {} + + friend class Conditional; + + public: + Mutex(); + ~Mutex(); + + void lock(); + void unlock(); + }; + + + + class ThreadBase { + private: + SDL_Thread* thread; + ThreadBase(ThreadBase& thread) {} + bool running; + + static int thread_runner(void* param); + + protected: + + virtual void main() = 0; + + public: + ThreadBase(); + virtual ~ThreadBase(); + + bool start(); + void wait(); + void kill(); // FIXME: not supported by SDL (SDL's kill is probably cancel)? + + static unsigned int threadId(); + }; + + class Semaphore { + private: + Semaphore(const Semaphore& sem) {} + SDL_sem* semaphore; + + public: + Semaphore(unsigned int initial_value); + ~Semaphore(); + + unsigned int value(); + void post(); + bool wait(int timeout = -1); + bool tryWait(); + }; + + // Should conditional inherit from mutex? + class Conditional { + private: + SDL_cond* cond; + + public: + Conditional(); + ~Conditional(); + + void signal(); + void broadcast(); + bool wait(Mutex* mutex, int timeout=-1); + }; + +} // namespace thread +} // namespace love + + +#endif // !LOVE_PLATFORM_SDL_THREADS_H_ diff --git a/src/modules/thread/threads.cpp b/src/modules/thread/threads.cpp new file mode 100644 index 000000000..bc4a9fed2 --- /dev/null +++ b/src/modules/thread/threads.cpp @@ -0,0 +1,49 @@ +/** +* 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. +**/ + +#include "threads.h" + +#if LOVE_THREADS == LOVE_THREADS_POSIX +# include "posix/threads.cpp" +#elif LOVE_THREADS == LOVE_THREADS_WIN32 +# include "win32/threads.cpp" +#elif LOVE_THREADS == LOVE_THREADS_SDL +# include "sdl/threads.cpp" +#endif + +namespace love +{ +namespace thread +{ + + const char* threadAPI() { +#if LOVE_THREADS == LOVE_THREADS_POSIX + return "posix"; +#elif LOVE_THREADS == LOVE_THREADS_WIN32 + return "win32"; +#elif LOVE_THREADS == LOVE_THREADS_SDL + return "sdl"; +#else + return "unknown"; // ?!?!?! +#endif + } + +} // namespace thread +} // namespace love diff --git a/src/modules/thread/threads.h b/src/modules/thread/threads.h new file mode 100644 index 000000000..fbe68eb20 --- /dev/null +++ b/src/modules/thread/threads.h @@ -0,0 +1,82 @@ +/** +* 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_THREADS_H_ +#define LOVE_THREADS_H_ + +#define LOVE_THREADS_SDL 0 +#define LOVE_THREADS_WIN32 1 +#define LOVE_THREADS_POSIX 2 + +// Choose correct threads API. +// Headless love uses either windows threads or posix threads. +// Headed (standard) love uses SDL threads. +#ifdef LOVE_HEADLESS +# ifdef WIN32 +# define LOVE_THREADS LOVE_THREADS_WIN32 +# else +# define LOVE_THREADS LOVE_THREADS_POSIX +# endif +#else +# define LOVE_THREADS LOVE_THREADS_SDL +#endif + + +// include the correct header +#if LOVE_THREADS == LOVE_THREADS_POSIX +# include "posix/threads.h" +#elif LOVE_THREADS == LOVE_THREADS_WIN32 +# include "win32/threads.h" +#elif LOVE_THREADS == LOVE_THREADS_SDL +# include "sdl/threads.h" +#endif + + +namespace love +{ +namespace thread +{ + + const char* threadAPI(); + + class Lock { + private: + Mutex* mutex; + + Lock(Lock& lock) {} + + public: + Lock(Mutex* m): mutex(m) { + mutex->lock(); + } + + Lock(Mutex& m): mutex(&m) { + mutex->lock(); + } + + ~Lock() { + mutex->unlock(); + } + }; + +} // namespace thread +} // namespace love + +#endif /* LOVE_THREADS_H_ */ diff --git a/src/modules/thread/win32/threads.cpp b/src/modules/thread/win32/threads.cpp new file mode 100644 index 000000000..087a61cd2 --- /dev/null +++ b/src/modules/thread/win32/threads.cpp @@ -0,0 +1,202 @@ +/** +* 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. +**/ + +#include "threads.h" + +namespace love +{ +namespace thread +{ + + Mutex::Mutex() { + InitializeCriticalSection(&mutex); + } + + + + Mutex::~Mutex() { + DeleteCriticalSection(&mutex); + } + + + + void Mutex::lock() { + EnterCriticalSection(&mutex); + } + + + + void Mutex::unlock() { + LeaveCriticalSection(&mutex); + } + + + + + int ThreadBase::thread_runner(void* param) { + ThreadBase* thread = (ThreadBase*)param; + thread->main(); + return 0; + } + + ThreadBase::ThreadBase() : running(false) { + HANDLE thread; + } + + + + ThreadBase::~ThreadBase() { + if (running) { + wait(); + } + } + + + + bool ThreadBase::start() { + thread = CreateThread(NULL, 0, run_thread, rd, NULL); + if (thread == NULL) { + return false; + } else { + running = true; + return true; + } + } + + void ThreadBase::wait() { + WaitForSingleObject(thread, INFINITE); + CloseHandle(thread); + running = false; + } + + void ThreadBase::kill() { + TerminateThread(thread, FALSE); + running = false; + } + + unsigned int ThreadBase::threadId() { + return (unsigned int)GetCurrentThreadId(); + } + + + + + Semaphore::Semaphore(unsigned int initial_value) + : count(initial_value) { + semaphore = CreateSemaphore(NULL, initial_value, 65535, NULL); + } + + Semaphore::~Semaphore() { + CloseHandle(semaphore); + } + + unsigned int Semaphore::value() { + return count; + } + + void Semaphore::post() { + InterlockedIncrement(&count); + if (ReleaseSemaphore(semaphore, 1, NULL) == FALSE) { + InterlockedDecrement(&count); + } + } + + bool Semaphore::wait(int timeout) { + int result; + + result = WaitForSingleObject(semaphore, timeout < 0 ? INFINITE : timeout); + if (result == WAIT_OBJECT_0) { + InterlockedDecrement(&count); + return true; + } else if (result == WAIT_TIMEOUT) { + return false; + } else { + // error + return false; + } + } + + bool Semaphore::tryWait() { + return wait(0); + } + + + // Conditional variable implementation based on semaphores. + // Vista+ builds should probably use CONDITIONAL_VARIABLE. + // + // based on http://www.cs.wustl.edu/~schmidt/win32-cv-2.html and ACE + + + Conditional::Conditional() + : waiting(0), signals(0) { + + } + + Conditional::~Conditional() { + + } + + void Conditional::signal() { + mutex.lock(); + if (waiting > signals) { + signals++; + sem.post(); + mutex.unlock(); + done.wait(); + } else { + mutex.unlock(); + } + } + + void Conditional::broadcast() { + mutex.lock(); + if (waiting > signals) { + int num = waiting - signals; + signals = waiting; + for(int i = 0; i < num; i++) sem.post(); + mutex.unlock(); + for(int i = 0; i < num; i++) done.wait(); + } else { + mutex.unlock(); + } + } + + bool Conditional::wait(Mutex* cmutex, int timeout) { + mutex.lock(); + waiting++; + mutex.unlock(); + + cmutex->unlock(); + bool ret = sem.wait(timeout); + + + mutex.lock(); + if (signals > 0) { + if (!ret) sem.wait(); + done.post(); + signals--; + } + waiting--; + mutex.unlock(); + cmutex->lock(); + } + +} // namespace thread +} // namespace love diff --git a/src/modules/thread/win32/threads.h b/src/modules/thread/win32/threads.h new file mode 100644 index 000000000..5b197d30f --- /dev/null +++ b/src/modules/thread/win32/threads.h @@ -0,0 +1,106 @@ +/** +* 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_PLATFROM_WIN32_THREADS_H_ +#define LOVE_PLATFROM_WIN32_THREADS_H_ + +#include + + +namespace love +{ +namespace thread +{ + + class Mutex { + private: + CRITICAL_SECTION mutex; + Mutex(const Mutex& mutex) {} + + public: + Mutex(); + ~Mutex(); + + void lock(); + void unlock(); + }; + + class ThreadBase { + private: + HANDLE thread; + ThreadBase(ThreadBase& thread) {} + bool running; + + static int thread_runner(void* param); + + protected: + + virtual void main() = 0; + + public: + ThreadBase(); + virtual ~ThreadBase(); + + bool start(); + void wait(); + void kill(); + + static unsigned int threadId(); + }; + + + class Semaphore { + private: + Semaphore(const Semaphore& sem) {} + HANDLE semaphore; + unsigned int count; + + public: + Semaphore(unsigned int initial_value); + ~Semaphore(); + + unsigned int value(); + void post(); + bool wait(int timeout = -1); + bool tryWait(); + }; + + + // Should conditional inherit from mutex? + class Conditional { + private: + Mutex mutex; + int waiting; + int signals; + Semaphore sem; + Semaphore done; + + public: + Conditional(); + ~Conditional(); + + void signal(); + void broadcast(); + bool wait(Mutex* cmutex, int timeout=-1); + }; +} // namespace thread +} // namespace love + +#endif /* LOVE_PLATFROM_WIN32_THREADS_H_ */ diff --git a/src/modules/thread/sdl/wrap_Thread.cpp b/src/modules/thread/wrap_Thread.cpp similarity index 99% rename from src/modules/thread/sdl/wrap_Thread.cpp rename to src/modules/thread/wrap_Thread.cpp index 37cd75f1f..5e149cd0c 100644 --- a/src/modules/thread/sdl/wrap_Thread.cpp +++ b/src/modules/thread/wrap_Thread.cpp @@ -35,8 +35,6 @@ namespace namespace love { namespace thread -{ -namespace sdl { Thread *luax_checkthread(lua_State *L, int idx) { @@ -390,4 +388,3 @@ namespace sdl } } } -} diff --git a/src/modules/thread/sdl/wrap_Thread.h b/src/modules/thread/wrap_Thread.h similarity index 98% rename from src/modules/thread/sdl/wrap_Thread.h rename to src/modules/thread/wrap_Thread.h index 186f92140..4a9af3131 100644 --- a/src/modules/thread/sdl/wrap_Thread.h +++ b/src/modules/thread/wrap_Thread.h @@ -29,8 +29,6 @@ namespace love { extern StringMap types; namespace thread -{ -namespace sdl { Thread *luax_checkthread(lua_State *L, int idx); int w_Thread_start(lua_State *L); @@ -49,7 +47,7 @@ namespace sdl int w_getThread(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_thread(lua_State * L); -} // sdl + } // thread } // love diff --git a/src/modules/timer/sdl/Timer.cpp b/src/modules/timer/sdl/Timer.cpp index 49234d046..ec6aa57bc 100644 --- a/src/modules/timer/sdl/Timer.cpp +++ b/src/modules/timer/sdl/Timer.cpp @@ -19,6 +19,7 @@ **/ #include +#include #ifdef LOVE_WINDOWS # include @@ -81,7 +82,7 @@ namespace sdl void Timer::sleep(int ms) { if(ms > 0) - SDL_Delay(ms); + delay(ms); } float Timer::getDelta() const From 3460bf918cb157f18d35d2c6d5ab7a5585ddb6c7 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 17:14:41 +0200 Subject: [PATCH 050/384] Enabled headless build in autotools --- configure.in | 3 +++ src/common/config.h | 6 ++++++ src/modules/thread/Thread.h | 1 + 3 files changed, 10 insertions(+) diff --git a/configure.in b/configure.in index d2a393dca..e88aa3f95 100644 --- a/configure.in +++ b/configure.in @@ -39,6 +39,9 @@ AC_SEARCH_LIBS([ModPlug_Load], [modplug], [], AC_MSG_ERROR([Can't LÖVE without 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],[])) AC_SEARCH_LIBS([ov_open], [vorbisfile], [], AC_MSG_ERROR([Can't LÖVE without VorbisFile])) +AC_ARG_ENABLE([headless], + [ --enable-headless Build with less SDL], + AC_DEFINE([LOVE_HEADLESS], [], [Build with less SDL]), []) AC_CONFIG_FILES([ Makefile src/Makefile diff --git a/src/common/config.h b/src/common/config.h index fec797d6a..bfd8f80c7 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -68,4 +68,10 @@ # define NOMINMAX #endif +// Autotools config.h +#ifdef HAVE_CONFIG_H +# include <../config.h> +# undef VERSION +#endif + #endif // LOVE_CONFIG_H diff --git a/src/modules/thread/Thread.h b/src/modules/thread/Thread.h index 2d1d5ace9..85ee791a8 100644 --- a/src/modules/thread/Thread.h +++ b/src/modules/thread/Thread.h @@ -24,6 +24,7 @@ // STL #include #include +#include // LOVE #include From 6e28c49a2040766a00d6707a71006596b7ba7d54 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 21:44:21 +0200 Subject: [PATCH 051/384] Map box2d asserts to love::Exception and catch them in constructors Should be added to other functions commonly failing sometime. --- .../physics/box2d/Source/Common/b2Settings.h | 8 +- src/modules/physics/box2d/wrap_Physics.cpp | 85 ++++++++++++------- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/src/modules/physics/box2d/Source/Common/b2Settings.h b/src/modules/physics/box2d/Source/Common/b2Settings.h index 22866b0ef..2ba53255e 100644 --- a/src/modules/physics/box2d/Source/Common/b2Settings.h +++ b/src/modules/physics/box2d/Source/Common/b2Settings.h @@ -19,13 +19,13 @@ #ifndef B2_SETTINGS_H #define B2_SETTINGS_H -#include -//#include +//#include +#include #include #define B2_NOT_USED(x) x -#define b2Assert(A) assert(A) -//#define b2Assert(A) {if(!(A)) throw love::Exception("Box2D error: " #A);} +//#define b2Assert(A) assert(A) +#define b2Assert(A) {if(!(A)) throw love::Exception(#A);} // need to include NDS jtypes.h instead of diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index e94bf1e2b..90bb8250b 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -66,24 +66,31 @@ namespace box2d Body * body = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); int top = lua_gettop(L); - if(top == 2) + try { - float radius = (float)luaL_checknumber(L, 2); - CircleShape * shape = instance->newCircleShape(body, radius); - luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); - return 1; + if(top == 2) + { + float radius = (float)luaL_checknumber(L, 2); + CircleShape * shape = instance->newCircleShape(body, radius); + luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); + return 1; + } + else if(top == 4) + { + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float radius = (float)luaL_checknumber(L, 4); + CircleShape * shape = instance->newCircleShape(body, x, y, radius); + luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); + return 1; + } + else + return luaL_error(L, "Incorrect number of parameters"); } - else if(top == 4) + catch (love::Exception e) { - float x = (float)luaL_checknumber(L, 2); - float y = (float)luaL_checknumber(L, 3); - float radius = (float)luaL_checknumber(L, 4); - CircleShape * shape = instance->newCircleShape(body, x, y, radius); - luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); - return 1; + return luaL_error(L, "Box2D error: %s", e.what()); } - else - return luaL_error(L, "Incorrect number of parameters"); } int w_newRectangleShape(lua_State * L) @@ -91,32 +98,46 @@ namespace box2d Body * body = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); int top = lua_gettop(L); - if(top == 3) + try { - float w = (float)luaL_checknumber(L, 2); - float h = (float)luaL_checknumber(L, 3); - PolygonShape * shape = instance->newRectangleShape(body, w, h); - luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); - return 1; + if(top == 3) + { + float w = (float)luaL_checknumber(L, 2); + float h = (float)luaL_checknumber(L, 3); + PolygonShape * shape = instance->newRectangleShape(body, w, h); + luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); + return 1; + } + else if(top == 5 || top == 6) + { + 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); + float angle = (float)luaL_optnumber(L, 6, 0); + PolygonShape * shape = instance->newRectangleShape(body, x, y, w, h, angle); + luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); + return 1; + } + else + return luaL_error(L, "Incorrect number of parameters"); } - else if(top == 5 || top == 6) + catch (love::Exception e) { - 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); - float angle = (float)luaL_optnumber(L, 6, 0); - PolygonShape * shape = instance->newRectangleShape(body, x, y, w, h, angle); - luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); - return 1; + return luaL_error(L, "Box2D error: %s", e.what()); } - else - return luaL_error(L, "Incorrect number of parameters"); } int w_newPolygonShape(lua_State * L) { - return instance->newPolygonShape(L); + try + { + return instance->newPolygonShape(L); + } + catch (love::Exception e) + { + return luaL_error(L, "Box2D error: %s", e.what()); + } } int w_newDistanceJoint(lua_State * L) From b7d3054f6b313d9f9f5f9253b9772cc4f3e75085 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 21:55:23 +0200 Subject: [PATCH 052/384] Make platform/unix/automagic nicer --- platform/unix/automagic | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/platform/unix/automagic b/platform/unix/automagic index b2de67e12..d885ea03b 100755 --- a/platform/unix/automagic +++ b/platform/unix/automagic @@ -1,10 +1,25 @@ #!/bin/bash -if ! sh platform/unix/gen-makefile; then - echo "You should be doing this from the root directory of the project." - exit 1 + +automagic() { + if ! sh platform/unix/gen-makefile; then + echo "You should be doing this from the root directory of the project." + exit 1 + fi + autoheader 2>&1 || return 1 # Gimmie config.h.in + libtoolize --force 2>&1 || return 1 + aclocal 2>&1 || return 1 + autoconf 2>&1 || return 1 + automake -a 2>&1 || return 1 +} + +if [[ $1 == "-d" ]]; then + automagic +else + automagic > /dev/null +fi +if [ $? -eq 1 ]; then + echo "Failed, please contact the developers." + exit 1 +else + echo "Success, carry on configuring." fi -autoheader # Gimmie config.h.in -libtoolize --force -aclocal -autoconf -automake -a From 0179b53bb69123ab4d520000fa4544c023965f28 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 21:58:59 +0200 Subject: [PATCH 053/384] Add compilation instructions to the readme --- readme.txt | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/readme.txt b/readme.txt index 20ff14f06..3a05a7c05 100644 --- a/readme.txt +++ b/readme.txt @@ -1,12 +1,4 @@ - -! WARNING ! ------------ - -This software is not complete. This is just a preview. Don't expect to find any -interface consistencies between releases at all. With each release, everything -you once knew and loved may be brutally murdered. By which I mean removed and/or -changed. - +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. RUNNING GAMES ------------- @@ -22,4 +14,24 @@ Examples: * love mygame.love * love /home/hax/ultragame -Remember that what you are trying to run at least should contain the file "main.lua". \ No newline at end of file +Remember that what you are trying to run at least should contain the file "main.lua". + +Compilation +----------- + +Windows: + Use the project files for Visual C++ 2008 or 2010 (2010 preferred) located in the platform dir. +*nix: + Run platform/unix/automagic, then run ./configure and make. +OSX: + Use the XCode project in platform/macosx. + + +! WARNING ! +----------- + +This software is not complete. This is just a preview. Don't expect to find any +interface consistencies between releases at all. With each release, everything +you once knew and loved may be brutally murdered. By which I mean removed and/or +changed. + From efb8efb45e5abb789ebd7d5362474ab528a3e1a0 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 22:45:28 +0200 Subject: [PATCH 054/384] Prevent overflows and underflows in love.graphics.push and love.graphics.pop (bug #118) Maximum is hardware maximum - 5, so the engine itself has a few matrices. --- src/modules/graphics/opengl/Graphics.cpp | 13 ++++++++++- src/modules/graphics/opengl/Graphics.h | 2 ++ src/modules/graphics/opengl/wrap_Graphics.cpp | 22 +++++++++++++++---- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index fa94a7853..a404423a9 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -37,7 +37,7 @@ namespace opengl { Graphics::Graphics() - : currentFont(0), lineWidth(1) + : currentFont(0), lineWidth(1), matrixLimit(0), userMatrices(0) { // Indicates that there is no screen // created yet. @@ -279,6 +279,11 @@ namespace opengl // Restore the display state. restoreState(tempState); + + // Get the maximum number of matrices + // subtract a few to give the engine some room. + glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &matrixLimit); + matrixLimit -= 5; return true; } @@ -984,12 +989,18 @@ namespace opengl void Graphics::push() { + if (userMatrices == matrixLimit) + throw Exception("Maximum stack depth reached."); glPushMatrix(); + ++userMatrices; } void Graphics::pop() { + if (userMatrices < 1) + throw Exception("Minimum stack depth reached. (More pops than pushes?)"); glPopMatrix(); + --userMatrices; } void Graphics::rotate(float r) diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index 6e0e1ae92..7f1b88e09 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -115,6 +115,8 @@ namespace opengl DisplayMode currentMode; float lineWidth; + GLint matrixLimit; + GLint userMatrices; public: diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 8fdb63f64..078f6c2a5 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -950,15 +950,29 @@ namespace opengl return 0; } - int w_push(lua_State *) + int w_push(lua_State *L) { - instance->push(); + try + { + instance->push(); + } + catch (love::Exception e) + { + return luaL_error(L, e.what()); + } return 0; } - int w_pop(lua_State *) + int w_pop(lua_State *L) { - instance->pop(); + try + { + instance->pop(); + } + catch (love::Exception e) + { + return luaL_error(L, e.what()); + } return 0; } From 43a6357b549d74ee37c3cb5316b3dd4828f3f9ac Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 23:17:32 +0200 Subject: [PATCH 055/384] Use correct height for y correction in set/getScissor (bug #234) --- src/modules/graphics/opengl/Framebuffer.cpp | 10 ++++++++++ src/modules/graphics/opengl/Framebuffer.h | 3 +++ src/modules/graphics/opengl/Graphics.cpp | 11 +++++++++-- src/modules/graphics/opengl/Graphics.h | 2 ++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/opengl/Framebuffer.cpp b/src/modules/graphics/opengl/Framebuffer.cpp index c1df8a113..54185909b 100644 --- a/src/modules/graphics/opengl/Framebuffer.cpp +++ b/src/modules/graphics/opengl/Framebuffer.cpp @@ -372,6 +372,16 @@ namespace opengl strategy->deleteFBO(fbo, depthbuffer, img); } + int Framebuffer::getWidth() + { + return width; + } + + int Framebuffer::getHeight() + { + return height; + } + } // opengl } // graphics } // love diff --git a/src/modules/graphics/opengl/Framebuffer.h b/src/modules/graphics/opengl/Framebuffer.h index 50f2f1e3d..b59697c4b 100644 --- a/src/modules/graphics/opengl/Framebuffer.h +++ b/src/modules/graphics/opengl/Framebuffer.h @@ -41,6 +41,9 @@ namespace opengl void setWrap(const Image::Wrap &w); Image::Wrap getWrap() const; + int getWidth(); + int getHeight(); + bool loadVolatile(); void unloadVolatile(); diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index a404423a9..90191e3e8 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -365,6 +365,13 @@ namespace opengl return currentMode.height; } + int Graphics::getRenderHeight() + { + if (Framebuffer::current) + return Framebuffer::current->getHeight(); + return currentMode.height; + } + bool Graphics::isCreated() { return (currentMode.width > 0) || (currentMode.height > 0); @@ -409,7 +416,7 @@ namespace opengl void Graphics::setScissor(int x, int y, int width, int height) { glEnable(GL_SCISSOR_TEST); - glScissor(x, getHeight() - (y + height), width, height); // Compensates for the fact that our y-coordinate is reverse of OpenGLs. + glScissor(x, getRenderHeight() - (y + height), width, height); // Compensates for the fact that our y-coordinate is reverse of OpenGLs. } void Graphics::setScissor() @@ -426,7 +433,7 @@ namespace opengl glGetIntegerv(GL_SCISSOR_BOX, scissor); lua_pushnumber(L, scissor[0]); - lua_pushnumber(L, getHeight() - (scissor[1] + scissor[3])); // Compensates for the fact that our y-coordinate is reverse of OpenGLs. + lua_pushnumber(L, getRenderHeight() - (scissor[1] + scissor[3])); // Compensates for the fact that our y-coordinate is reverse of OpenGLs. lua_pushnumber(L, scissor[2]); lua_pushnumber(L, scissor[3]); diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index 7f1b88e09..503c40961 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -118,6 +118,8 @@ namespace opengl GLint matrixLimit; GLint userMatrices; + int getRenderHeight(); + public: Graphics(); From a372dcaec805f5d304dee7c911afd56c9e1d8009 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 23:37:01 +0200 Subject: [PATCH 056/384] Some audio fixes (no more mp3 clicking and popping?) (issue #217) --- src/modules/audio/openal/Source.cpp | 8 ++++---- src/modules/sound/lullaby/Mpg123Decoder.cpp | 1 + src/modules/sound/lullaby/VorbisDecoder.cpp | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 241c2b7c5..49a47c387 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -169,8 +169,8 @@ namespace openal offsetSamples += (curOffsetSamples - newOffsetSamples); offsetSeconds += (curOffsetSecs - newOffsetSecs); - if(streamAtomic(buffer, decoder) > 0) - alSourceQueueBuffers(source, 1, &buffer); + streamAtomic(buffer, decoder); + alSourceQueueBuffers(source, 1, &buffer); } } } @@ -349,7 +349,7 @@ namespace openal { int decoded = streamAtomic(buffers[i], decoder); ++usedBuffers; - if(decoded < decoder->getSize()) + if(decoder->isFinished()) break; } @@ -466,7 +466,7 @@ namespace openal if(decoded > 0 && fmt != 0) alBufferData(buffer, fmt, d->getBuffer(), decoded, d->getSampleRate()); - if(decoded < d->getSize() && isLooping()) { + if(decoder->isFinished() && isLooping()) { offsetSamples = 0; offsetSeconds = 0; d->rewind(); diff --git a/src/modules/sound/lullaby/Mpg123Decoder.cpp b/src/modules/sound/lullaby/Mpg123Decoder.cpp index 6cd151a4e..928e168c5 100644 --- a/src/modules/sound/lullaby/Mpg123Decoder.cpp +++ b/src/modules/sound/lullaby/Mpg123Decoder.cpp @@ -129,6 +129,7 @@ namespace lullaby continue; case MPG123_NEED_MORE: { + size += numbytes; int v = feed(8192); switch(v) diff --git a/src/modules/sound/lullaby/VorbisDecoder.cpp b/src/modules/sound/lullaby/VorbisDecoder.cpp index 292dfc075..074a8485d 100644 --- a/src/modules/sound/lullaby/VorbisDecoder.cpp +++ b/src/modules/sound/lullaby/VorbisDecoder.cpp @@ -193,14 +193,14 @@ namespace lullaby else if(result <= OV_EREAD) return -1; else if(result == 0) + { + eof = true; break; + } else if(result > 0) size += result; } - if(oggFile.dataSize - oggFile.dataRead == 0) - eof = true; - return size; } From 5312e54e48f420e8283c0a4012ac48f21a1de8a9 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 8 Jun 2011 23:43:58 +0200 Subject: [PATCH 057/384] Update changelog --- changes.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changes.txt b/changes.txt index 75d3e812b..9b44ea3f5 100644 --- a/changes.txt +++ b/changes.txt @@ -10,10 +10,14 @@ LOVE 0.8.0 [Name pending] * Added alpha masking. * Added automatic PO2 padding. * Added UTF-8 support for fonts. + * Added box2d error handling for some commonly failing functions. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. * Fixed tracebacks not showing filenames. + * Fixed love.graphics.push/pop capable of causing overflows/underflows. + * Fixed setScissor on framebuffers. + * Fixed several issues with audio, e.g. clicks and pops in mp3s. * Updated love.joystick to be 1-indexed. * Updated love.thread to use get/set instead of send/receive. From f9ec21619a981df4eb5b7025aa706e947e6ad657 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 9 Jun 2011 10:26:47 +0200 Subject: [PATCH 058/384] More audio fixes (bug #217) --- src/modules/audio/openal/Source.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 49a47c387..60a857c99 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -137,7 +137,7 @@ namespace openal // Looping mode could have changed. alSourcei(source, AL_LOOPING, isLooping() ? AL_TRUE : AL_FALSE); } - else if(valid && type == TYPE_STREAM) + else if(valid && type == TYPE_STREAM && !(!isLooping() && isFinished())) { // Number of processed buffers. ALint processed; @@ -463,7 +463,7 @@ namespace openal int fmt = getFormat(d->getChannels(), d->getBits()); - if(decoded > 0 && fmt != 0) + if(fmt != 0) alBufferData(buffer, fmt, d->getBuffer(), decoded, d->getSampleRate()); if(decoder->isFinished() && isLooping()) { From 709263b03227051d6a8955186f254223281056f2 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 9 Jun 2011 10:56:13 +0200 Subject: [PATCH 059/384] Some fixes for the new threading backends --- src/modules/thread/Thread.cpp | 4 +- src/modules/thread/posix/threads.cpp | 149 ++++++++++++--------------- src/modules/thread/posix/threads.h | 23 +++-- src/modules/thread/sdl/threads.cpp | 126 +++++++++++----------- src/modules/thread/sdl/threads.h | 10 +- src/modules/thread/threads.cpp | 5 +- src/modules/thread/threads.h | 13 +-- src/modules/thread/win32/threads.cpp | 126 ++++++++++++---------- src/modules/thread/win32/threads.h | 23 +++-- 9 files changed, 242 insertions(+), 237 deletions(-) diff --git a/src/modules/thread/Thread.cpp b/src/modules/thread/Thread.cpp index 9c273e337..2b437ebbf 100644 --- a/src/modules/thread/Thread.cpp +++ b/src/modules/thread/Thread.cpp @@ -35,10 +35,10 @@ namespace thread Thread::ThreadThread::ThreadThread(ThreadData* comm) : comm(comm) { - } - void Thread::ThreadThread::main() { + void Thread::ThreadThread::main() + { lua_State * L = lua_open(); luaL_openlibs(L); #ifdef LOVE_BUILD_STANDALONE diff --git a/src/modules/thread/posix/threads.cpp b/src/modules/thread/posix/threads.cpp index b4eee8af9..0ee146107 100644 --- a/src/modules/thread/posix/threads.cpp +++ b/src/modules/thread/posix/threads.cpp @@ -24,83 +24,83 @@ namespace love { namespace thread { - - Mutex::Mutex() { + Mutex::Mutex() + { pthread_create_mutex(&mutex, NULL); } - Mutex::~Mutex() { + Mutex::~Mutex() + { pthread_mutex_destroy(&mutex); } - void Mutex::lock() { + void Mutex::lock() + { pthread_mutex_lock(&mutex); } - void Mutex::unlock() { + void Mutex::unlock() + { pthread_mutex_unlock(&mutex); } - - - - void* ThreadBase::thread_runner(void* param) { + void* ThreadBase::thread_runner(void* param) + { ThreadBase* thread = (ThreadBase*)param; thread->main(); return NULL; } - - - ThreadBase::ThreadBase() : running(false) { + ThreadBase::ThreadBase() + : running(false) + { pthread_t thread; } - - - ThreadBase::~ThreadBase() { - if (running) { + ThreadBase::~ThreadBase() + { + if (running) + { wait(); } } - - - bool ThreadBase::start() { - if (pthread_create(&thread, NULL, thread_runner, this)) { + bool ThreadBase::start() + { + if (pthread_create(&thread, NULL, thread_runner, this)) return false; - } else { - running = true; - return true; - } + return (running = true); } - - void ThreadBase::wait() { + void ThreadBase::wait() + { pthread_join(thread, NULL); running = false; } - - void ThreadBase::kill() { - // FIXME: I'm not sure about that one. + void ThreadBase::kill() + { pthread_kill(thread, 9); running = false; } - unsigned int ThreadBase::threadId() { + unsigned int ThreadBase::threadId() + { return (unsigned int)((size_t)pthread_self()); } - Semaphore::Semaphore(unsigned int initial_value) { + Semaphore::Semaphore(unsigned int initial_value) + { sem_init(&sem, 0, initial_value); } - Semaphore::~Semaphore() { + Semaphore::~Semaphore() + { sem_destroy(&sem); } - unsigned int Semaphore::value() { + unsigned int Semaphore::value() + { int val = 0; if (sem_getvalue(&sem, &val)) { return 0; @@ -109,71 +109,57 @@ namespace thread } } - void Semaphore::post() { + void Semaphore::post() + { sem_post(&sem); } - bool Semaphore::wait(int timeout) { - if (timeout < 0) { - if (sem_wait(&sem)) { - return false; - } else { - return true; - } - } else if (timeout == 0) { - if (sem_trywait(&sem)) { - return false; - } else { - return true; - } - } else { + bool Semaphore::wait(int timeout) + { + if (timeout < 0) + return !sem_wait(&sem); + else if (timeout == 0) + return !sem_trywait(&sem); + else + { struct timespec ts; ts.tv_sec = timeout/1000; ts.tv_nsec = (timeout % 1000) * 1000000; - if (sem_timedwait(&sem, &ts)) { - return false; // either timeout or error... - } else { - return true; - } + return !sem_timedwait(&sem, &ts); } } - - bool Semaphore::tryWait() { - if (sem_trywait(&sem)) { - return false; - } else { - return true; - } + bool Semaphore::tryWait() + { + return !sem_trywait(&sem); } - - - - Conditional::Conditional() { + Conditional::Conditional() + { pthread_cond_init(&cond, NULL); } - Conditional::~Conditional() { + Conditional::~Conditional() + { pthread_cond_destroy(&cond); } - void Conditional::signal() { + void Conditional::signal() + { pthread_cond_signal(&cond); } - void Conditional::broadcast() { + void Conditional::broadcast() + { pthread_cond_broadcast(&cond); } - bool Conditional::wait(Mutex* mutex, int timeout) { - if (timeout < 0) { - if (pthread_cond_wait(cond, mutex->mutex)) { - return false; - } else { - return true; - } - } else { + bool Conditional::wait(Mutex* mutex, int timeout) + { + if (timeout < 0) + return !pthread_cond_wait(cond, mutex->mutex); + else + { struct timespec ts; int ret; @@ -181,16 +167,9 @@ namespace thread ts.tv_nsec = (timeout % 1000) * 1000000; ret = pthread_cond_timedwait(&cond, mutex->mutex, &ts); - if (ret == ETIMEDOUT) { - return false; - } else if (ret == 0) { - return true; - } else { - // something bad happend! - return false; - } + return (ret == 0); } } -} // namespace thread -} // namespace love +} // thread +} // love diff --git a/src/modules/thread/posix/threads.h b/src/modules/thread/posix/threads.h index 352dfbe65..07291cec0 100644 --- a/src/modules/thread/posix/threads.h +++ b/src/modules/thread/posix/threads.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_PLATFORM_POSIX_THREADS_H_ -#define LOVE_PLATFORM_POSIX_THREADS_H_ +#ifndef LOVE_THREAD_POSIX_THREADS_H +#define LOVE_THREAD_POSIX_THREADS_H #include #include @@ -28,8 +28,8 @@ namespace love { namespace thread { - - class Mutex { + class Mutex + { private: pthread_mutex_t mutex; Mutex(const Mutex& mutex) {} @@ -45,7 +45,8 @@ namespace thread }; - class ThreadBase { + class ThreadBase + { private: pthread_t thread; ThreadBase(ThreadBase& thread) {} @@ -67,7 +68,8 @@ namespace thread static unsigned int threadId(); }; - class Semaphore { + class Semaphore + { private: Semaphore(const Semaphore& sem) {} sem_t semaphore; @@ -83,7 +85,8 @@ namespace thread }; // Should conditional inherit from mutex? - class Conditional { + class Conditional + { private: pthread_cond_t cond; @@ -96,8 +99,8 @@ namespace thread bool wait(Mutex* mutex, int timeout=-1); }; -} // namespace thread -} // namespace love +} // thread +} // love -#endif // !LOVE_PLATFORM_POSIX_THREADS_H_ +#endif // LOVE_THREAD_POSIX_THREADS_H diff --git a/src/modules/thread/sdl/threads.cpp b/src/modules/thread/sdl/threads.cpp index fc4e5dbf8..f359132b7 100644 --- a/src/modules/thread/sdl/threads.cpp +++ b/src/modules/thread/sdl/threads.cpp @@ -24,141 +24,137 @@ namespace love { namespace thread { - - Mutex::Mutex() { + Mutex::Mutex() + { mutex = SDL_CreateMutex(); } - Mutex::~Mutex() { + Mutex::~Mutex() + { SDL_DestroyMutex(mutex); } - void Mutex::lock() { + void Mutex::lock() + { SDL_mutexP(mutex); } - void Mutex::unlock() { + void Mutex::unlock() + { SDL_mutexV(mutex); } - - - int ThreadBase::thread_runner(void* param) { + int ThreadBase::thread_runner(void* param) + { ThreadBase* thread = (ThreadBase*)param; thread->main(); return 0; } - ThreadBase::ThreadBase() : running(false) { - SDL_Thread* thread; + ThreadBase::ThreadBase() + : running(false) + { } - ThreadBase::~ThreadBase() { - if (running) { + ThreadBase::~ThreadBase() + { + if (running) + { wait(); } } - bool ThreadBase::start() { + bool ThreadBase::start() + { thread = SDL_CreateThread(thread_runner, this); - if (thread == NULL) { + if (thread == NULL) return false; - } else { - running = true; - return true; - } + else + return (running = true); } - void ThreadBase::wait() { + void ThreadBase::wait() + { SDL_WaitThread(thread, NULL); running = false; } - void ThreadBase::kill() { + void ThreadBase::kill() + { SDL_KillThread(thread); running = false; } - unsigned int ThreadBase::threadId() { + unsigned int ThreadBase::threadId() + { return (unsigned int)SDL_ThreadID(); } - Semaphore::Semaphore(unsigned int initial_value) { + Semaphore::Semaphore(unsigned int initial_value) + { semaphore = SDL_CreateSemaphore(initial_value); } - Semaphore::~Semaphore() { + Semaphore::~Semaphore() + { SDL_DestroySemaphore(semaphore); } - unsigned int Semaphore::value() { + unsigned int Semaphore::value() + { return SDL_SemValue(semaphore); } - void Semaphore::post() { + void Semaphore::post() + { SDL_SemPost(semaphore); } - bool Semaphore::wait(int timeout) { - if (timeout < 0) { + bool Semaphore::wait(int timeout) + { + if (timeout < 0) return SDL_SemWait(semaphore) ? false : true; - } else if (timeout == 0) { + else if (timeout == 0) return SDL_SemTryWait(semaphore) ? false : true; - } else { + else + { int ret = SDL_SemWaitTimeout(semaphore, timeout); - if (ret == SDL_MUTEX_TIMEDOUT) { - return false; - } else if (ret == 0) { - return true; - } else { - // some nasty error - return false; - } + return (ret == 0); } } - bool Semaphore::tryWait() { + bool Semaphore::tryWait() + { return SDL_SemTryWait(semaphore) ? false : true; } - - - Conditional::Conditional() { + Conditional::Conditional() + { cond = SDL_CreateCond(); } - Conditional::~Conditional() { + Conditional::~Conditional() + { SDL_DestroyCond(cond); } - void Conditional::signal() { + void Conditional::signal() + { SDL_CondSignal(cond); } - void Conditional::broadcast() { + void Conditional::broadcast() + { SDL_CondBroadcast(cond); } - bool Conditional::wait(Mutex* mutex, int timeout) { - if (timeout < 0) { - if (SDL_CondWait(cond, mutex->mutex)) { - // error - return false; - } else { - return true; - } - } else { - int ret = SDL_CondWaitTimeout(cond, mutex->mutex, timeout); - if (ret == SDL_MUTEX_TIMEDOUT) { - return false; - } else if (ret == 0) { - return true; - } else { - // some bad error - return false; - } - } + bool Conditional::wait(Mutex* mutex, int timeout) + { + if (timeout < 0) + return !SDL_CondWait(cond, mutex->mutex); + else + return (SDL_CondWaitTimeout(cond, mutex->mutex, timeout) == 0); } -} // namespace thread -} // namespace love +} // thread +} // love diff --git a/src/modules/thread/sdl/threads.h b/src/modules/thread/sdl/threads.h index a4e7e03e8..0b73f8e88 100644 --- a/src/modules/thread/sdl/threads.h +++ b/src/modules/thread/sdl/threads.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_PLATFORM_SDL_THREADS_H_ -#define LOVE_PLATFORM_SDL_THREADS_H_ +#ifndef LOVE_THREAD_SDL_THREADS_H +#define LOVE_THREAD_SDL_THREADS_H #include "SDL.h" @@ -97,8 +97,8 @@ namespace thread bool wait(Mutex* mutex, int timeout=-1); }; -} // namespace thread -} // namespace love +} // thread +} // love -#endif // !LOVE_PLATFORM_SDL_THREADS_H_ +#endif // LOVE_THREAD_SDL_THREADS_H diff --git a/src/modules/thread/threads.cpp b/src/modules/thread/threads.cpp index bc4a9fed2..0ac8d6c3a 100644 --- a/src/modules/thread/threads.cpp +++ b/src/modules/thread/threads.cpp @@ -32,8 +32,8 @@ namespace love { namespace thread { - - const char* threadAPI() { + const char* threadAPI() + { #if LOVE_THREADS == LOVE_THREADS_POSIX return "posix"; #elif LOVE_THREADS == LOVE_THREADS_WIN32 @@ -44,6 +44,5 @@ namespace thread return "unknown"; // ?!?!?! #endif } - } // namespace thread } // namespace love diff --git a/src/modules/thread/threads.h b/src/modules/thread/threads.h index fbe68eb20..0dcefd42f 100644 --- a/src/modules/thread/threads.h +++ b/src/modules/thread/threads.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_THREADS_H_ -#define LOVE_THREADS_H_ +#ifndef LOVE_THREAD_THREADS_H +#define LOVE_THREAD_THREADS_H #define LOVE_THREADS_SDL 0 #define LOVE_THREADS_WIN32 1 @@ -56,7 +56,8 @@ namespace thread const char* threadAPI(); - class Lock { + class Lock + { private: Mutex* mutex; @@ -76,7 +77,7 @@ namespace thread } }; -} // namespace thread -} // namespace love +} // thread +} // love -#endif /* LOVE_THREADS_H_ */ +#endif /* LOVE_THREAD_THREADS_H */ diff --git a/src/modules/thread/win32/threads.cpp b/src/modules/thread/win32/threads.cpp index 087a61cd2..228aa671a 100644 --- a/src/modules/thread/win32/threads.cpp +++ b/src/modules/thread/win32/threads.cpp @@ -25,53 +25,48 @@ namespace love namespace thread { - Mutex::Mutex() { + Mutex::Mutex() + { InitializeCriticalSection(&mutex); } - - - Mutex::~Mutex() { + Mutex::~Mutex() + { DeleteCriticalSection(&mutex); } - - - void Mutex::lock() { + void Mutex::lock() + { EnterCriticalSection(&mutex); } - - - void Mutex::unlock() { + void Mutex::unlock() + { LeaveCriticalSection(&mutex); } - - - - int ThreadBase::thread_runner(void* param) { + int ThreadBase::thread_runner(void* param) + { ThreadBase* thread = (ThreadBase*)param; thread->main(); return 0; } - ThreadBase::ThreadBase() : running(false) { - HANDLE thread; + ThreadBase::ThreadBase() + : running(false) + { } - - - ThreadBase::~ThreadBase() { + ThreadBase::~ThreadBase() + { if (running) { wait(); } } - - - bool ThreadBase::start() { - thread = CreateThread(NULL, 0, run_thread, rd, NULL); + bool ThreadBase::start() + { + thread = CreateThread(NULL, 0, thread_runner, this, NULL); if (thread == NULL) { return false; } else { @@ -80,60 +75,76 @@ namespace thread } } - void ThreadBase::wait() { + void ThreadBase::wait() + { WaitForSingleObject(thread, INFINITE); CloseHandle(thread); running = false; } - void ThreadBase::kill() { + void ThreadBase::kill() + { TerminateThread(thread, FALSE); running = false; } - unsigned int ThreadBase::threadId() { + unsigned int ThreadBase::threadId() + { return (unsigned int)GetCurrentThreadId(); } - - + Semaphore::Semaphore() + : Semaphore(0) + { + } Semaphore::Semaphore(unsigned int initial_value) - : count(initial_value) { + : count(initial_value) + { semaphore = CreateSemaphore(NULL, initial_value, 65535, NULL); } - Semaphore::~Semaphore() { + Semaphore::~Semaphore() + { CloseHandle(semaphore); } - unsigned int Semaphore::value() { + unsigned int Semaphore::value() + { return count; } - void Semaphore::post() { + void Semaphore::post() + { InterlockedIncrement(&count); if (ReleaseSemaphore(semaphore, 1, NULL) == FALSE) { InterlockedDecrement(&count); } } - bool Semaphore::wait(int timeout) { + bool Semaphore::wait(int timeout) + { int result; result = WaitForSingleObject(semaphore, timeout < 0 ? INFINITE : timeout); - if (result == WAIT_OBJECT_0) { + if (result == WAIT_OBJECT_0) + { InterlockedDecrement(&count); return true; - } else if (result == WAIT_TIMEOUT) { + } + else if (result == WAIT_TIMEOUT) + { return false; - } else { + } + else + { // error return false; } } - bool Semaphore::tryWait() { + bool Semaphore::tryWait() + { return wait(0); } @@ -145,40 +156,49 @@ namespace thread Conditional::Conditional() - : waiting(0), signals(0) { - + : waiting(0), signals(0) + { } - Conditional::~Conditional() { - + Conditional::~Conditional() + { } - void Conditional::signal() { + void Conditional::signal() + { mutex.lock(); - if (waiting > signals) { + if (waiting > signals) + { signals++; sem.post(); mutex.unlock(); done.wait(); - } else { + } + else + { mutex.unlock(); } } - void Conditional::broadcast() { + void Conditional::broadcast() + { mutex.lock(); - if (waiting > signals) { + if (waiting > signals) + { int num = waiting - signals; signals = waiting; for(int i = 0; i < num; i++) sem.post(); mutex.unlock(); for(int i = 0; i < num; i++) done.wait(); - } else { + } + else + { mutex.unlock(); } } - bool Conditional::wait(Mutex* cmutex, int timeout) { + bool Conditional::wait(Mutex* cmutex, int timeout) + { mutex.lock(); waiting++; mutex.unlock(); @@ -188,8 +208,10 @@ namespace thread mutex.lock(); - if (signals > 0) { - if (!ret) sem.wait(); + if (signals > 0) + { + if (!ret) + sem.wait(); done.post(); signals--; } @@ -198,5 +220,5 @@ namespace thread cmutex->lock(); } -} // namespace thread -} // namespace love +} // thread +} // love diff --git a/src/modules/thread/win32/threads.h b/src/modules/thread/win32/threads.h index 5b197d30f..c19349c59 100644 --- a/src/modules/thread/win32/threads.h +++ b/src/modules/thread/win32/threads.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_PLATFROM_WIN32_THREADS_H_ -#define LOVE_PLATFROM_WIN32_THREADS_H_ +#ifndef LOVE_THREAD_WIN32_THREADS_H +#define LOVE_THREAD_WIN32_THREADS_H #include @@ -29,7 +29,8 @@ namespace love namespace thread { - class Mutex { + class Mutex + { private: CRITICAL_SECTION mutex; Mutex(const Mutex& mutex) {} @@ -42,7 +43,8 @@ namespace thread void unlock(); }; - class ThreadBase { + class ThreadBase + { private: HANDLE thread; ThreadBase(ThreadBase& thread) {} @@ -66,13 +68,15 @@ namespace thread }; - class Semaphore { + class Semaphore + { private: Semaphore(const Semaphore& sem) {} HANDLE semaphore; unsigned int count; public: + Semaphore(); Semaphore(unsigned int initial_value); ~Semaphore(); @@ -84,7 +88,8 @@ namespace thread // Should conditional inherit from mutex? - class Conditional { + class Conditional + { private: Mutex mutex; int waiting; @@ -100,7 +105,7 @@ namespace thread void broadcast(); bool wait(Mutex* cmutex, int timeout=-1); }; -} // namespace thread -} // namespace love +} // thread +} // love -#endif /* LOVE_PLATFROM_WIN32_THREADS_H_ */ +#endif /* LOVE_THREAD_WIN32_THREADS_H */ From 994ad74e2262d46e266eaa74409c708d368cee84 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 9 Jun 2011 11:01:11 +0200 Subject: [PATCH 060/384] Additional cleanup --- src/modules/thread/threads.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/modules/thread/threads.cpp b/src/modules/thread/threads.cpp index 0ac8d6c3a..a7f94a70b 100644 --- a/src/modules/thread/threads.cpp +++ b/src/modules/thread/threads.cpp @@ -40,9 +40,7 @@ namespace thread return "win32"; #elif LOVE_THREADS == LOVE_THREADS_SDL return "sdl"; -#else - return "unknown"; // ?!?!?! #endif } -} // namespace thread -} // namespace love +} // thread +} // love From da4c199467151123c39a3d03fc665d1aed95b84f Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 9 Jun 2011 12:23:11 +0200 Subject: [PATCH 061/384] Hopefully the last fixes to the win32 thread backend --- src/modules/thread/win32/threads.cpp | 39 ++++++++++------------------ src/modules/thread/win32/threads.h | 7 +++-- 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/modules/thread/win32/threads.cpp b/src/modules/thread/win32/threads.cpp index 228aa671a..fea2ac40e 100644 --- a/src/modules/thread/win32/threads.cpp +++ b/src/modules/thread/win32/threads.cpp @@ -59,20 +59,17 @@ namespace thread ThreadBase::~ThreadBase() { - if (running) { + if (running) wait(); - } } bool ThreadBase::start() { - thread = CreateThread(NULL, 0, thread_runner, this, NULL); - if (thread == NULL) { + thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) thread_runner, this, 0, NULL); + if (thread == NULL) return false; - } else { - running = true; - return true; - } + else + return (running = true); } void ThreadBase::wait() @@ -93,15 +90,10 @@ namespace thread return (unsigned int)GetCurrentThreadId(); } - Semaphore::Semaphore() - : Semaphore(0) - { - } - Semaphore::Semaphore(unsigned int initial_value) : count(initial_value) { - semaphore = CreateSemaphore(NULL, initial_value, 65535, NULL); + semaphore = CreateSemaphore(NULL, initial_value, UINT_MAX, NULL); } Semaphore::~Semaphore() @@ -117,9 +109,8 @@ namespace thread void Semaphore::post() { InterlockedIncrement(&count); - if (ReleaseSemaphore(semaphore, 1, NULL) == FALSE) { + if (ReleaseSemaphore(semaphore, 1, NULL) == FALSE) InterlockedDecrement(&count); - } } bool Semaphore::wait(int timeout) @@ -132,15 +123,8 @@ namespace thread InterlockedDecrement(&count); return true; } - else if (result == WAIT_TIMEOUT) - { - return false; - } else - { - // error return false; - } } bool Semaphore::tryWait() @@ -187,9 +171,11 @@ namespace thread { int num = waiting - signals; signals = waiting; - for(int i = 0; i < num; i++) sem.post(); + for (int i = 0; i < num; i++) + sem.post(); mutex.unlock(); - for(int i = 0; i < num; i++) done.wait(); + for (int i = 0; i < num; i++) + done.wait(); } else { @@ -206,7 +192,6 @@ namespace thread cmutex->unlock(); bool ret = sem.wait(timeout); - mutex.lock(); if (signals > 0) { @@ -218,6 +203,8 @@ namespace thread waiting--; mutex.unlock(); cmutex->lock(); + + return true; } } // thread diff --git a/src/modules/thread/win32/threads.h b/src/modules/thread/win32/threads.h index c19349c59..19595b78d 100644 --- a/src/modules/thread/win32/threads.h +++ b/src/modules/thread/win32/threads.h @@ -22,7 +22,7 @@ #define LOVE_THREAD_WIN32_THREADS_H #include - +#include namespace love { @@ -50,7 +50,7 @@ namespace thread ThreadBase(ThreadBase& thread) {} bool running; - static int thread_runner(void* param); + static int WINAPI thread_runner(void* param); protected: @@ -76,8 +76,7 @@ namespace thread unsigned int count; public: - Semaphore(); - Semaphore(unsigned int initial_value); + Semaphore(unsigned int initial_value = 0); ~Semaphore(); unsigned int value(); From fafe0d703955fbc02f79c9e4f1e1d7dc55ba759d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 10 Jun 2011 14:03:56 +0200 Subject: [PATCH 062/384] Wait until the end of a physics update before destroying bodies (issue #193) --- src/modules/physics/box2d/Body.cpp | 5 +++++ src/modules/physics/box2d/Body.h | 5 +++++ src/modules/physics/box2d/World.cpp | 13 +++++++++++++ src/modules/physics/box2d/World.h | 10 ++++++++++ src/modules/physics/box2d/wrap_Body.cpp | 2 +- 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 5487414c8..97109029c 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -329,6 +329,11 @@ namespace box2d return 2; } + void Body::destroy() + { + world->destroyBody(this); + } + } // box2d } // physics } // love diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 9444a39d5..a60e514a5 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -346,6 +346,11 @@ namespace box2d * Get the World this Body resides in. */ World * getWorld() const; + + /** + * Mark the body for destruction + **/ + void destroy(); private: /** diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 87594530f..c25753471 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -123,6 +123,14 @@ namespace box2d persist.process(); remove.process(); result.process(); + + // Really destroy all marked bodies. + for (std::vector::iterator i = destructBodies.begin(); i < destructBodies.end(); i++) + { + Body * b = *i; + b->release(); + } + destructBodies.clear(); } void World::Add(const b2ContactPoint* point) @@ -272,6 +280,11 @@ namespace box2d t.upperBound = scaleUp(aabb.upperBound); return t; } + + void World::destroyBody(Body * b) + { + destructBodies.push_back(b); + } } // box2d } // physics diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index af3f84ce5..86acdb8bd 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -40,6 +40,7 @@ namespace box2d { class Contact; + class Body; /** * The World is the "God" container class, @@ -83,6 +84,9 @@ namespace box2d // The length of one meter in pixels. int meter; + + // The list of to be destructed bodies. + std::vector destructBodies; public: @@ -241,6 +245,12 @@ namespace box2d * @return The scaled AABB. **/ b2AABB scaleUp(const b2AABB & aabb); + + /** + * Mark a body for destruction. + * To be called from Body + **/ + void destroyBody(Body * b); }; diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index 2d97f4c74..165d73505 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -462,7 +462,7 @@ namespace box2d p->own = false; Body * t = (Body *)p->data; - t->release(); + t->destroy(); return 0; } From bd158faaaad86472efa09ed9c6dd6f13293d65dc Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 10 Jun 2011 14:40:37 +0200 Subject: [PATCH 063/384] Revise spritebatch locking (binding now) (issue #231) --- src/modules/graphics/opengl/SpriteBatch.cpp | 2 ++ src/modules/graphics/opengl/wrap_SpriteBatch.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index ca5762f13..1b32cdc1d 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -161,11 +161,13 @@ namespace opengl glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); lockp = (vertex *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE); + glBindBuffer(GL_ARRAY_BUFFER, 0); return lockp; } void SpriteBatch::unlock() { + glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); glUnmapBuffer(GL_ARRAY_BUFFER); lockp = 0; glBindBuffer(GL_ARRAY_BUFFER, 0); diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp index f9f6122b2..5214b8442 100644 --- a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp @@ -67,14 +67,14 @@ namespace opengl return 0; } - int w_SpriteBatch_lock(lua_State * L) + int w_SpriteBatch_bind(lua_State * L) { SpriteBatch * t = luax_checkspritebatch(L, 1); - lua_pushlightuserdata(L, t->lock()); - return 1; + t->lock(); + return 0; } - int w_SpriteBatch_unlock(lua_State * L) + int w_SpriteBatch_unbind(lua_State * L) { SpriteBatch * t = luax_checkspritebatch(L, 1); t->unlock(); @@ -93,8 +93,8 @@ namespace opengl { "add", w_SpriteBatch_add }, { "addq", w_SpriteBatch_addq }, { "clear", w_SpriteBatch_clear }, - { "lock", w_SpriteBatch_lock }, - { "unlock", w_SpriteBatch_unlock }, + { "bind", w_SpriteBatch_bind }, + { "unbind", w_SpriteBatch_unbind }, { "setImage", w_SpriteBatch_setImage }, { 0, 0 } }; From 03a368c190db5522ca82c17f1058d3e79c79cb18 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 10 Jun 2011 14:43:23 +0200 Subject: [PATCH 064/384] Update changelog --- changes.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changes.txt b/changes.txt index 9b44ea3f5..8938e49ea 100644 --- a/changes.txt +++ b/changes.txt @@ -18,6 +18,10 @@ LOVE 0.8.0 [Name pending] * Fixed love.graphics.push/pop capable of causing overflows/underflows. * Fixed setScissor on framebuffers. * 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. + + * Renamed SpriteBatch's lock/unlock to bind/unbind. * Updated love.joystick to be 1-indexed. * Updated love.thread to use get/set instead of send/receive. From d613505a776c1cfd07a5b35fe0421a29288d73ae Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 10 Jun 2011 15:03:27 +0200 Subject: [PATCH 065/384] Only pad when needed --- src/modules/graphics/opengl/Image.cpp | 35 ++++++++++++++++++++++++++- src/modules/graphics/opengl/Image.h | 3 +++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index b4f9459dd..53256507b 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -29,7 +29,6 @@ namespace graphics { namespace opengl { - Image::Image(love::image::ImageData * data) : width((float)(data->getWidth())), height((float)(data->getHeight())), texture(0) { @@ -276,6 +275,14 @@ namespace opengl } bool Image::loadVolatile() + { + if (GLEE_ARB_texture_non_power_of_two) + return loadVolatileNPOT(); + else + return loadVolatilePOT(); + } + + bool Image::loadVolatilePOT() { glGenTextures(1,(GLuint*)&texture); glBindTexture(GL_TEXTURE_2D, texture); @@ -321,6 +328,32 @@ namespace opengl return true; } + bool Image::loadVolatileNPOT() + { + glGenTextures(1,(GLuint*)&texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA8, + (GLsizei)width, + (GLsizei)height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + data->getData()); + + setFilter(settings.filter); + setWrap(settings.wrap); + + return true; + } + void Image::unloadVolatile() { settings.filter = getFilter(); diff --git a/src/modules/graphics/opengl/Image.h b/src/modules/graphics/opengl/Image.h index 3a2456efa..3d8b24149 100644 --- a/src/modules/graphics/opengl/Image.h +++ b/src/modules/graphics/opengl/Image.h @@ -69,6 +69,9 @@ namespace opengl Image::Wrap wrap; } settings; + bool loadVolatilePOT(); + bool loadVolatileNPOT(); + public: /** From fc5cda36e25567428a7885b444d39f26f7cf141b Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 15 Jun 2011 13:09:32 +0200 Subject: [PATCH 066/384] Allow merged games marked as 'release' to have their save dir directly in the appdata dir --- src/modules/filesystem/physfs/Filesystem.cpp | 25 +- src/modules/filesystem/physfs/Filesystem.h | 11 +- .../filesystem/physfs/wrap_Filesystem.cpp | 9 + .../filesystem/physfs/wrap_Filesystem.h | 1 + src/scripts/boot.lua | 11 +- src/scripts/boot.lua.h | 3732 +++++++++-------- 6 files changed, 1918 insertions(+), 1871 deletions(-) diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 4aea7bd0a..3c4cc8f63 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -34,7 +34,7 @@ namespace filesystem namespace physfs { Filesystem::Filesystem() - : open_count(0), buffer(0), isInited(false) + : open_count(0), buffer(0), isInited(false), release(false), releaseSet(false) { } @@ -59,6 +59,14 @@ namespace physfs isInited = true; } + void Filesystem::setRelease(bool release) + { + if (releaseSet) + return; + this->release = release; + releaseSet = true; + } + bool Filesystem::setIdentity( const char * ident ) { if(!isInited) @@ -68,11 +76,14 @@ namespace physfs save_identity = std::string(ident); // Generate the relative path to the game save folder. - save_path_relative = std::string(LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR) + save_identity; + 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); - save_path_full += save_path_relative; + if (release) + 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 @@ -120,7 +131,13 @@ namespace physfs return false; // Create the save folder. (We're now "at" %APPDATA%). - if(!mkdir(save_path_relative.c_str())) + bool success = false; + if (release) + success = mkdir(save_identity.c_str()); + else + success = mkdir(save_path_relative.c_str()); + + if(!success) { PHYSFS_setWriteDir(0); // Clear the write directory in case of error. return false; diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index 36383c59f..327022886 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -46,6 +46,7 @@ // 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 "/" @@ -56,7 +57,8 @@ # elif defined(LOVE_LINUX) # define LOVE_APPDATA_FOLDER "love" # else -# define LOVE_APPDATA_FOLDER ".love" +# define LOVE_APPDATA_PREFIX "." +# define LOVE_APPDATA_FOLDER "love" # endif # define LOVE_PATH_SEPARATOR "/" # define LOVE_MAX_PATH MAXPATHLEN @@ -99,6 +101,11 @@ namespace physfs // Workaround for machines without PhysFS 2.0 bool isInited; + // Allow saving outside of the LOVE_APPDATA_FOLDER + // for release 'builds' + bool release; + bool releaseSet; + protected: public: @@ -111,6 +118,8 @@ namespace physfs void init(const char * arg0); + void setRelease(bool release); + /** * This sets up the save directory. If the * it is already set up, nothing happens. diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index 9d1c2c15c..105ca93fe 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -52,6 +52,14 @@ namespace physfs return 0; } + int w_setRelease(lua_State * L) + { + // no error checking needed, everything, even nothing + // can be converted to a boolean + instance->setRelease(lua_toboolean(L, 1)); + return 0; + } + int w_setIdentity(lua_State * L) { const char * arg = luaL_checkstring(L, 1); @@ -290,6 +298,7 @@ namespace physfs // List of functions to wrap. static const luaL_Reg functions[] = { { "init", w_init }, + { "setRelease", w_setRelease }, { "setIdentity", w_setIdentity }, { "setSource", w_setSource }, { "newFile", w_newFile }, diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.h b/src/modules/filesystem/physfs/wrap_Filesystem.h index 30d3e9b99..a7307e355 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.h +++ b/src/modules/filesystem/physfs/wrap_Filesystem.h @@ -34,6 +34,7 @@ namespace physfs { bool hack_setupWriteDirectory(); int w_init(lua_State * L); + int w_setRelease(lua_State * L); int w_setIdentity(lua_State * L); int w_setSource(lua_State * L); int w_newFile(lua_State * L); diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 68fc86618..c0f8d8d55 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -182,6 +182,8 @@ function love.createhandlers() end +local is_fused_game = false + -- This can't be overriden. function love.boot() @@ -198,6 +200,7 @@ function love.boot() -- Is this one of those fancy "fused" games? local can_has_game = pcall(love.filesystem.setSource, arg0) + is_fused_game = can_has_game if not can_has_game and o.game.set and o.game.arg[1] then local full_source = love.path.getfull(o.game.arg[1]) @@ -297,9 +300,11 @@ function love.init() love.graphics.setCaption(c.title) end - if love.filesystem and c.identity then love.filesystem.setIdentity(c.identity) end - - if love.filesystem and love.filesystem.exists("main.lua") then require("main.lua") end + if love.filesystem then + love.filesystem.setRelease(c.release and is_fused_game) + if c.identity then love.filesystem.setIdentity(c.identity) end + if love.filesystem.exists("main.lua") then require("main.lua") 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") diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 35775e393..1d9bbaeaa 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -170,1829 +170,1763 @@ const unsigned char boot_lua[] = 0x6F,0x76,0x65,0x2E,0x66,0x6F,0x63,0x75,0x73,0x28,0x66,0x29,0x20,0x65,0x6E, 0x64,0x20,0x65,0x6E,0x64,0x2C,0x20,0x71,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63, 0x74,0x69,0x6F,0x6E,0x20,0x28,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20, - 0x65,0x6E,0x64,0x2C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63, - 0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x62,0x6F,0x6F,0x74,0x28, - 0x29,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x6C,0x6F,0x76,0x65, - 0x22,0x29,0x20,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,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6C, - 0x6C,0x5F,0x73,0x6F,0x75,0x72,0x63,0x65,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x70,0x61,0x74,0x68,0x2E,0x67,0x65,0x74,0x66,0x75,0x6C,0x6C,0x28,0x6F, - 0x2E,0x67,0x61,0x6D,0x65,0x2E,0x61,0x72,0x67,0x5B,0x31,0x5D,0x29,0x20,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,0x20,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,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,0x66,0x75,0x6C,0x6C,0x5F,0x73,0x6F,0x75,0x72,0x63,0x65,0x29,0x20, - 0x65,0x6E,0x64,0x20,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,0x20,0x6E,0x6F,0x5F,0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65, - 0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20, - 0x6E,0x6F,0x74,0x20,0x63,0x61,0x6E,0x5F,0x68,0x61,0x73,0x5F,0x67,0x61,0x6D, - 0x65,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x6E,0x6F,0x67, - 0x61,0x6D,0x65,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x69,0x6E, - 0x69,0x74,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x63,0x20,0x3D,0x20, - 0x7B,0x20,0x74,0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x22,0x55,0x6E,0x74,0x69, - 0x74,0x6C,0x65,0x64,0x22,0x2C,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x3D, - 0x20,0x22,0x55,0x6E,0x6E,0x61,0x6D,0x65,0x64,0x22,0x2C,0x20,0x76,0x65,0x72, - 0x73,0x69,0x6F,0x6E,0x20,0x3D,0x20,0x30,0x2C,0x20,0x73,0x63,0x72,0x65,0x65, - 0x6E,0x20,0x3D,0x20,0x7B,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3D,0x20,0x38, - 0x30,0x30,0x2C,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x20,0x36,0x30, - 0x30,0x2C,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x3D, - 0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x76,0x73,0x79,0x6E,0x63,0x20,0x3D, - 0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x66,0x73,0x61,0x61,0x20,0x3D,0x20,0x30, - 0x2C,0x20,0x7D,0x2C,0x20,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x20,0x3D,0x20, - 0x7B,0x20,0x65,0x76,0x65,0x6E,0x74,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, - 0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x20,0x3D,0x20,0x74,0x72,0x75, - 0x65,0x2C,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65, - 0x2C,0x20,0x74,0x69,0x6D,0x65,0x72,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, - 0x20,0x6A,0x6F,0x79,0x73,0x74,0x69,0x63,0x6B,0x20,0x3D,0x20,0x74,0x72,0x75, - 0x65,0x2C,0x20,0x69,0x6D,0x61,0x67,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65, - 0x2C,0x20,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x3D,0x20,0x74,0x72, - 0x75,0x65,0x2C,0x20,0x61,0x75,0x64,0x69,0x6F,0x20,0x3D,0x20,0x74,0x72,0x75, - 0x65,0x2C,0x20,0x70,0x68,0x79,0x73,0x69,0x63,0x73,0x20,0x3D,0x20,0x74,0x72, - 0x75,0x65,0x2C,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20,0x74,0x72,0x75, - 0x65,0x2C,0x20,0x66,0x6F,0x6E,0x74,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, - 0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, - 0x20,0x7D,0x2C,0x20,0x63,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x20,0x3D,0x20,0x66, - 0x61,0x6C,0x73,0x65,0x2C,0x20,0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20, - 0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x72,0x65,0x6C,0x65,0x61,0x73, - 0x65,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x7D,0x20,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,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x63,0x6F, - 0x6E,0x66,0x2E,0x6C,0x75,0x61,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x63,0x6F,0x6E,0x66,0x20,0x74,0x68,0x65,0x6E, - 0x20,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,0x20,0x69,0x66,0x20,0x6E,0x6F,0x74,0x20,0x6F, - 0x6B,0x20,0x74,0x68,0x65,0x6E,0x20,0x70,0x72,0x69,0x6E,0x74,0x28,0x65,0x72, - 0x72,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x63, - 0x2E,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x3D,0x20, - 0x7B,0x20,0x74,0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x63,0x2E,0x74,0x69,0x74, - 0x6C,0x65,0x20,0x7E,0x3D,0x20,0x22,0x55,0x6E,0x74,0x69,0x74,0x6C,0x65,0x64, - 0x22,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20,0x6F, - 0x72,0x20,0x6E,0x69,0x6C,0x2C,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x3D, - 0x20,0x63,0x2E,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x7E,0x3D,0x20,0x22,0x55, - 0x6E,0x6E,0x61,0x6D,0x65,0x64,0x22,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x61, - 0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x6E,0x69,0x6C,0x2C,0x20,0x75, - 0x72,0x6C,0x20,0x3D,0x20,0x63,0x2E,0x75,0x72,0x6C,0x20,0x7D,0x20,0x65,0x6E, - 0x64,0x20,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,0x20,0x63,0x2E,0x63,0x6F,0x6E,0x73, - 0x6F,0x6C,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20, - 0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x70,0x61,0x69,0x72, - 0x73,0x28,0x63,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x29,0x20,0x64,0x6F, - 0x20,0x69,0x66,0x20,0x76,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x71,0x75, - 0x69,0x72,0x65,0x28,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x22,0x20,0x2E,0x2E,0x20, - 0x6B,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x20,0x74,0x68,0x65,0x6E,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x63,0x72,0x65,0x61,0x74,0x65,0x68,0x61,0x6E,0x64, - 0x6C,0x65,0x72,0x73,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x63, - 0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x6D, - 0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, - 0x20,0x74,0x68,0x65,0x6E,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67, - 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x68,0x65,0x63,0x6B,0x4D,0x6F, + 0x65,0x6E,0x64,0x2C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, + 0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x62,0x6F,0x6F,0x74,0x28,0x29,0x20, + 0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x6C,0x6F,0x76,0x65,0x22,0x29, + 0x20,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,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6C,0x6C,0x5F,0x73, + 0x6F,0x75,0x72,0x63,0x65,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x61, + 0x74,0x68,0x2E,0x67,0x65,0x74,0x66,0x75,0x6C,0x6C,0x28,0x6F,0x2E,0x67,0x61, + 0x6D,0x65,0x2E,0x61,0x72,0x67,0x5B,0x31,0x5D,0x29,0x20,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,0x20,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,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,0x66, + 0x75,0x6C,0x6C,0x5F,0x73,0x6F,0x75,0x72,0x63,0x65,0x29,0x20,0x65,0x6E,0x64, + 0x20,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,0x20, + 0x6E,0x6F,0x5F,0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65,0x20,0x3D,0x20, + 0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6E,0x6F,0x74, + 0x20,0x63,0x61,0x6E,0x5F,0x68,0x61,0x73,0x5F,0x67,0x61,0x6D,0x65,0x20,0x74, + 0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x6E,0x6F,0x67,0x61,0x6D,0x65, + 0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63, + 0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x69,0x6E,0x69,0x74,0x28, + 0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x63,0x20,0x3D,0x20,0x7B,0x20,0x74, + 0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x22,0x55,0x6E,0x74,0x69,0x74,0x6C,0x65, + 0x64,0x22,0x2C,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x3D,0x20,0x22,0x55, + 0x6E,0x6E,0x61,0x6D,0x65,0x64,0x22,0x2C,0x20,0x76,0x65,0x72,0x73,0x69,0x6F, + 0x6E,0x20,0x3D,0x20,0x30,0x2C,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x3D, + 0x20,0x7B,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3D,0x20,0x38,0x30,0x30,0x2C, + 0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x20,0x36,0x30,0x30,0x2C,0x20, + 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x3D,0x20,0x66,0x61, + 0x6C,0x73,0x65,0x2C,0x20,0x76,0x73,0x79,0x6E,0x63,0x20,0x3D,0x20,0x74,0x72, + 0x75,0x65,0x2C,0x20,0x66,0x73,0x61,0x61,0x20,0x3D,0x20,0x30,0x2C,0x20,0x7D, + 0x2C,0x20,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x20,0x3D,0x20,0x7B,0x20,0x65, + 0x76,0x65,0x6E,0x74,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x6B,0x65, + 0x79,0x62,0x6F,0x61,0x72,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, + 0x6D,0x6F,0x75,0x73,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x74, + 0x69,0x6D,0x65,0x72,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x6A,0x6F, + 0x79,0x73,0x74,0x69,0x63,0x6B,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, + 0x69,0x6D,0x61,0x67,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x67, + 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, + 0x20,0x61,0x75,0x64,0x69,0x6F,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, + 0x70,0x68,0x79,0x73,0x69,0x63,0x73,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, + 0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, + 0x66,0x6F,0x6E,0x74,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x74,0x68, + 0x72,0x65,0x61,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x7D,0x2C, + 0x20,0x63,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73, + 0x65,0x2C,0x20,0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20,0x3D,0x20,0x66, + 0x61,0x6C,0x73,0x65,0x2C,0x20,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x3D, + 0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x7D,0x20,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, + 0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x63,0x6F,0x6E,0x66,0x2E, + 0x6C,0x75,0x61,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F, + 0x76,0x65,0x2E,0x63,0x6F,0x6E,0x66,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x20,0x69,0x66,0x20,0x6E,0x6F,0x74,0x20,0x6F,0x6B,0x20,0x74, + 0x68,0x65,0x6E,0x20,0x70,0x72,0x69,0x6E,0x74,0x28,0x65,0x72,0x72,0x29,0x20, + 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x63,0x2E,0x72,0x65, + 0x6C,0x65,0x61,0x73,0x65,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65, + 0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x3D,0x20,0x7B,0x20,0x74, + 0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x63,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20, + 0x7E,0x3D,0x20,0x22,0x55,0x6E,0x74,0x69,0x74,0x6C,0x65,0x64,0x22,0x20,0x61, + 0x6E,0x64,0x20,0x63,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20,0x6F,0x72,0x20,0x6E, + 0x69,0x6C,0x2C,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x3D,0x20,0x63,0x2E, + 0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x7E,0x3D,0x20,0x22,0x55,0x6E,0x6E,0x61, + 0x6D,0x65,0x64,0x22,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x61,0x75,0x74,0x68, + 0x6F,0x72,0x20,0x6F,0x72,0x20,0x6E,0x69,0x6C,0x2C,0x20,0x75,0x72,0x6C,0x20, + 0x3D,0x20,0x63,0x2E,0x75,0x72,0x6C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x63,0x2E,0x63,0x6F,0x6E,0x73,0x6F,0x6C,0x65, + 0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20,0x66,0x6F,0x72, + 0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x70,0x61,0x69,0x72,0x73,0x28,0x63, + 0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x29,0x20,0x64,0x6F,0x20,0x69,0x66, + 0x20,0x76,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65, + 0x28,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x22,0x20,0x2E,0x2E,0x20,0x6B,0x29,0x20, + 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65, + 0x2E,0x65,0x76,0x65,0x6E,0x74,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x63,0x72,0x65,0x61,0x74,0x65,0x68,0x61,0x6E,0x64,0x6C,0x65,0x72, + 0x73,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x63,0x2E,0x73,0x63, + 0x72,0x65,0x65,0x6E,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x6D,0x6F,0x64,0x75, + 0x6C,0x65,0x73,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68, + 0x65,0x6E,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70, + 0x68,0x69,0x63,0x73,0x2E,0x63,0x68,0x65,0x63,0x6B,0x4D,0x6F,0x64,0x65,0x28, + 0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64,0x74,0x68,0x2C, + 0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x68,0x65,0x69,0x67,0x68, + 0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x66,0x75,0x6C, + 0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x29,0x20,0x6F,0x72,0x20,0x28,0x63,0x2E, + 0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64,0x74,0x68,0x20,0x3D,0x3D, + 0x20,0x30,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E, + 0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x3D,0x20,0x30,0x29,0x20,0x74, + 0x68,0x65,0x6E,0x20,0x61,0x73,0x73,0x65,0x72,0x74,0x28,0x6C,0x6F,0x76,0x65, + 0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x4D,0x6F, 0x64,0x65,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64, 0x74,0x68,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x68,0x65, 0x69,0x67,0x68,0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E, - 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x29,0x20,0x6F,0x72,0x20, - 0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64,0x74,0x68, - 0x20,0x3D,0x3D,0x20,0x30,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x73,0x63,0x72, - 0x65,0x65,0x6E,0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x3D,0x20,0x30, - 0x29,0x20,0x74,0x68,0x65,0x6E,0x20,0x61,0x73,0x73,0x65,0x72,0x74,0x28,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65, - 0x74,0x4D,0x6F,0x64,0x65,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E, - 0x77,0x69,0x64,0x74,0x68,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E, - 0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65, - 0x65,0x6E,0x2E,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x2C,0x20, - 0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x76,0x73,0x79,0x6E,0x63,0x2C, - 0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x66,0x73,0x61,0x61,0x29, - 0x2C,0x20,0x22,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65, - 0x74,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x22,0x29, - 0x20,0x65,0x6C,0x73,0x65,0x20,0x65,0x72,0x72,0x6F,0x72,0x28,0x22,0x43,0x6F, - 0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x73,0x63,0x72, - 0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x22,0x29,0x20,0x65,0x6E,0x64,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73, - 0x65,0x74,0x43,0x61,0x70,0x74,0x69,0x6F,0x6E,0x28,0x63,0x2E,0x74,0x69,0x74, - 0x6C,0x65,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x66,0x69,0x6C,0x65,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x61,0x6E,0x64, - 0x20,0x63,0x2E,0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20,0x74,0x68,0x65, - 0x6E,0x20,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,0x29,0x20,0x65,0x6E,0x64, - 0x20,0x69,0x66,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,0x6D,0x61,0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x6D,0x61, - 0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66, - 0x20,0x6E,0x6F,0x5F,0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65,0x20,0x74, - 0x68,0x65,0x6E,0x20,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,0x20, - 0x65,0x6E,0x64,0x20,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,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x5F,0x6F,0x70,0x65,0x6E,0x43,0x6F,0x6E,0x73,0x6F,0x6C, - 0x65,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E, - 0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x75,0x6E,0x28, - 0x29,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x64,0x74,0x20,0x3D,0x20,0x30,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72, - 0x75,0x65,0x20,0x64,0x6F,0x20,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,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,0x20,0x65,0x6E,0x64,0x20,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,0x69,0x66,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68,0x65,0x6E, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E, - 0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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,0x20,0x65,0x6E,0x64, - 0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x20, - 0x74,0x68,0x65,0x6E,0x20,0x66,0x6F,0x72,0x20,0x65,0x2C,0x61,0x2C,0x62,0x2C, - 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,0x20,0x69,0x66,0x20,0x65, - 0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x20,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,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64, - 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x68,0x61,0x6E,0x64,0x6C, - 0x65,0x72,0x73,0x5B,0x65,0x5D,0x28,0x61,0x2C,0x62,0x2C,0x63,0x29,0x20,0x65, - 0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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,0x31,0x29, + 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x2C,0x20,0x63,0x2E,0x73, + 0x63,0x72,0x65,0x65,0x6E,0x2E,0x76,0x73,0x79,0x6E,0x63,0x2C,0x20,0x63,0x2E, + 0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x66,0x73,0x61,0x61,0x29,0x2C,0x20,0x22, + 0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x73, + 0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x22,0x29,0x20,0x65,0x6C, + 0x73,0x65,0x20,0x65,0x72,0x72,0x6F,0x72,0x28,0x22,0x43,0x6F,0x75,0x6C,0x64, + 0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x73,0x63,0x72,0x65,0x65,0x6E, + 0x20,0x6D,0x6F,0x64,0x65,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x43, + 0x61,0x70,0x74,0x69,0x6F,0x6E,0x28,0x63,0x2E,0x74,0x69,0x74,0x6C,0x65,0x29, + 0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x66,0x69, + 0x6C,0x65,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x66,0x69,0x6C,0x65,0x73,0x79,0x73,0x74,0x65,0x6D,0x2E, + 0x73,0x65,0x74,0x52,0x65,0x6C,0x65,0x61,0x73,0x65,0x28,0x63,0x2E,0x72,0x65, + 0x6C,0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x69,0x73,0x5F,0x66,0x75, + 0x73,0x65,0x64,0x5F,0x67,0x61,0x6D,0x65,0x29,0x20,0x69,0x66,0x20,0x63,0x2E, + 0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x29,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x72,0x65,0x71,0x75, + 0x69,0x72,0x65,0x28,0x22,0x6D,0x61,0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29, + 0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6E,0x6F,0x5F, + 0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65,0x20,0x74,0x68,0x65,0x6E,0x20, + 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,0x20,0x65,0x6E,0x64,0x20, + 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,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x5F,0x6F,0x70,0x65,0x6E,0x43,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x28,0x29,0x20, + 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, + 0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x75,0x6E,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x64,0x74,0x20,0x3D, + 0x20,0x30,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64, + 0x6F,0x20,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,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,0x20,0x65,0x6E,0x64,0x20,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,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, 0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73, - 0x65,0x6E,0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x65, - 0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x6E,0x6F,0x67,0x61,0x6D,0x65,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34, - 0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x43,0x37,0x6D,0x6C,0x44,0x51,0x31, - 0x42,0x4A,0x51,0x30,0x4D,0x67,0x55,0x48,0x4A,0x76,0x5A,0x6D,0x6C,0x73,0x5A, - 0x51,0x41,0x41,0x20,0x65,0x41,0x47,0x46,0x56,0x4D,0x39,0x72,0x45,0x30,0x45, - 0x55,0x2F,0x6A,0x5A,0x75,0x71,0x64,0x41,0x69,0x43,0x46,0x70,0x72,0x44,0x72, - 0x4A,0x34,0x6B,0x43,0x4A,0x4A,0x57,0x61,0x74,0x6F,0x52,0x64,0x51,0x32,0x2F, - 0x52,0x46,0x69,0x61,0x77,0x7A,0x62,0x48,0x37,0x5A,0x46,0x6B,0x47,0x51,0x7A, - 0x53,0x64,0x5A,0x75,0x4E,0x75,0x76,0x75,0x4A,0x72,0x57,0x6C,0x69,0x4F,0x54, - 0x69,0x20,0x30,0x53,0x72,0x65,0x52,0x65,0x32,0x68,0x42,0x2F,0x2B,0x41,0x48, - 0x6E,0x72,0x77,0x5A,0x43,0x39,0x4B,0x68,0x56,0x70,0x46,0x4B,0x4E,0x36,0x72, - 0x4B,0x47,0x4B,0x68,0x46,0x79,0x33,0x78,0x7A,0x57,0x35,0x4D,0x74,0x71,0x58, - 0x71,0x77,0x4D,0x35,0x2B,0x38,0x39,0x34,0x33,0x37,0x33,0x31,0x76,0x64,0x74, - 0x38,0x41,0x44,0x58,0x4C,0x53,0x4E,0x50,0x57,0x41,0x42,0x4F,0x51,0x4E,0x20, - 0x78,0x31,0x4B,0x69,0x45,0x57,0x6C,0x73,0x66,0x45,0x4A,0x71,0x2F,0x49,0x67, - 0x41,0x6A,0x71,0x49,0x4A,0x51,0x54,0x51,0x6C,0x56,0x64,0x76,0x73,0x54,0x69, - 0x51,0x47,0x51,0x59,0x4E,0x7A,0x2B,0x58,0x76,0x6E,0x32,0x48,0x6F,0x50,0x67, - 0x56,0x74,0x57,0x77,0x33,0x76,0x37,0x64,0x37,0x4A,0x33,0x72,0x5A,0x72,0x53, - 0x74,0x70,0x6F,0x48,0x68,0x50,0x31,0x41,0x34,0x45,0x65,0x61,0x20,0x32,0x53, - 0x71,0x77,0x37,0x78,0x64,0x78,0x43,0x6C,0x6B,0x53,0x41,0x6F,0x67,0x38,0x33, - 0x36,0x45,0x70,0x78,0x33,0x51,0x49,0x33,0x2B,0x50,0x59,0x38,0x75,0x79,0x50, - 0x4F,0x55,0x35,0x35,0x65,0x4D,0x47,0x31,0x44,0x79,0x73,0x39,0x78,0x46,0x6B, - 0x69,0x66,0x45,0x41,0x31,0x4C,0x63,0x35,0x2F,0x54,0x62,0x68,0x54,0x7A,0x53, - 0x58,0x54,0x51,0x49,0x4E,0x49,0x4F,0x4A,0x54,0x31,0x20,0x63,0x56,0x49,0x2B, - 0x6E,0x4E,0x65,0x4C,0x6C,0x4E,0x63,0x64,0x42,0x32,0x6C,0x75,0x5A,0x73,0x62, - 0x49,0x45,0x4C,0x31,0x50,0x6B,0x4B,0x61,0x37,0x7A,0x4F,0x36,0x72,0x59,0x71, - 0x47,0x63,0x54,0x76,0x59,0x4F,0x6B,0x4C,0x32,0x64,0x39,0x48,0x35,0x4F,0x73, - 0x39,0x34,0x2B,0x77,0x69,0x48,0x43,0x43,0x78,0x6D,0x74,0x50,0x30,0x61,0x34, - 0x6A,0x5A,0x37,0x31,0x6A,0x4E,0x55,0x2F,0x20,0x34,0x6D,0x48,0x68,0x70,0x4F, - 0x62,0x45,0x68,0x6A,0x30,0x63,0x47,0x44,0x58,0x30,0x2B,0x47,0x41,0x56,0x74, - 0x78,0x71,0x70,0x2B,0x44,0x58,0x43,0x46,0x46,0x38,0x51,0x54,0x53,0x65,0x69, - 0x56,0x48,0x48,0x5A,0x4C,0x67,0x33,0x78,0x6D,0x4B,0x37,0x39,0x56,0x76,0x4A, - 0x4B,0x67,0x6E,0x43,0x51,0x4F,0x4D,0x70,0x6B,0x59,0x59,0x42,0x7A,0x57,0x6B, - 0x68,0x50,0x31,0x30,0x78,0x75,0x20,0x2B,0x4C,0x71,0x48,0x42,0x58,0x30,0x6D, - 0x31,0x78,0x4F,0x76,0x34,0x6E,0x64,0x57,0x55,0x65,0x46,0x35,0x6A,0x78,0x4E, - 0x6E,0x33,0x74,0x54,0x64,0x37,0x30,0x58,0x61,0x41,0x71,0x38,0x77,0x44,0x68, - 0x30,0x4D,0x47,0x67,0x79,0x61,0x44,0x55,0x68,0x51,0x45,0x45,0x55,0x45,0x59, - 0x5A,0x69,0x77,0x55,0x45,0x43,0x47,0x50,0x42,0x6F,0x78,0x4E,0x4C,0x4A,0x79, - 0x50,0x79,0x4F,0x72,0x20,0x42,0x68,0x75,0x54,0x65,0x7A,0x4A,0x31,0x4A,0x47, - 0x71,0x37,0x64,0x47,0x4A,0x45,0x73,0x55,0x46,0x37,0x4E,0x74,0x77,0x39,0x74, - 0x31,0x47,0x6B,0x33,0x54,0x7A,0x2B,0x4B,0x43,0x4A,0x78,0x6C,0x45,0x4F,0x31, - 0x43,0x4A,0x4C,0x38,0x51,0x66,0x34,0x71,0x72,0x38,0x6C,0x50,0x35,0x58,0x6E, - 0x35,0x79,0x31,0x79,0x77,0x32,0x46,0x62,0x33,0x6C,0x4B,0x32,0x62,0x6D,0x72, - 0x72,0x79,0x20,0x34,0x44,0x76,0x46,0x35,0x5A,0x6D,0x35,0x47,0x68,0x37,0x58, - 0x30,0x38,0x6A,0x6A,0x63,0x30,0x31,0x65,0x66,0x4A,0x58,0x55,0x64,0x70,0x4E, - 0x58,0x52,0x35,0x61,0x73,0x65,0x58,0x71,0x38,0x6D,0x75,0x77,0x61,0x50,0x2B, - 0x78,0x58,0x6C,0x7A,0x48,0x6D,0x67,0x6A,0x57,0x50,0x78,0x48,0x4F,0x77,0x2B, - 0x2F,0x45,0x74,0x58,0x35,0x58,0x4D,0x6C,0x79,0x6D,0x4D,0x46,0x4D,0x58,0x6A, - 0x20,0x56,0x66,0x50,0x71,0x53,0x34,0x52,0x31,0x57,0x6A,0x45,0x33,0x33,0x35, - 0x39,0x73,0x66,0x7A,0x73,0x39,0x34,0x69,0x37,0x50,0x4C,0x72,0x58,0x57,0x63, - 0x36,0x32,0x4A,0x69,0x7A,0x64,0x57,0x6D,0x35,0x64,0x6E,0x2F,0x57,0x70,0x49, - 0x2B,0x2B,0x36,0x71,0x76,0x4A,0x50,0x6D,0x56,0x66,0x6C,0x50,0x58,0x76,0x58, - 0x78,0x2F,0x47,0x66,0x4E,0x78,0x47,0x50,0x69,0x4B,0x54,0x45,0x6D,0x20,0x64, - 0x6F,0x72,0x6E,0x49,0x59,0x6D,0x58,0x78,0x53,0x37,0x78,0x6B,0x74,0x68,0x4C, - 0x71,0x77,0x76,0x69,0x59,0x47,0x33,0x48,0x43,0x4A,0x32,0x56,0x68,0x69,0x6E, - 0x53,0x62,0x5A,0x48,0x36,0x4A,0x4E,0x56,0x67,0x59,0x4A,0x71,0x38,0x39,0x53, - 0x39,0x64,0x50,0x31,0x74,0x34,0x76,0x55,0x5A,0x2F,0x44,0x50,0x56,0x52,0x6C, - 0x42,0x6E,0x4D,0x30,0x6C,0x53,0x4A,0x39,0x33,0x2F,0x43,0x20,0x4B,0x6D,0x51, - 0x30,0x6E,0x62,0x6B,0x4F,0x62,0x2F,0x71,0x50,0x32,0x38,0x66,0x38,0x46,0x2B, - 0x54,0x33,0x69,0x75,0x65,0x66,0x4B,0x41,0x49,0x76,0x62,0x4F,0x44,0x49,0x6D, - 0x62,0x70,0x74,0x55,0x33,0x48,0x76,0x45,0x4B,0x46,0x6C,0x70,0x57,0x35,0x7A, - 0x72,0x67,0x49,0x58,0x76,0x39,0x46,0x39,0x38,0x4C,0x5A,0x75,0x61,0x36,0x4E, - 0x2B,0x4F,0x50,0x77,0x45,0x57,0x44,0x79,0x72,0x20,0x46,0x71,0x31,0x53,0x4E, - 0x5A,0x38,0x67,0x76,0x41,0x45,0x63,0x64,0x6F,0x64,0x36,0x48,0x75,0x67,0x70, - 0x6D,0x4E,0x4F,0x57,0x6C,0x73,0x30,0x35,0x55,0x6F,0x63,0x73,0x6E,0x35,0x4F, - 0x36,0x36,0x63,0x70,0x69,0x55,0x73,0x78,0x51,0x32,0x30,0x4E,0x53,0x55,0x74, - 0x63,0x6C,0x31,0x32,0x56,0x4C,0x46,0x72,0x4F,0x5A,0x56,0x57,0x4C,0x70,0x64, - 0x74,0x69,0x5A,0x30,0x78,0x31,0x75,0x20,0x48,0x4B,0x45,0x35,0x51,0x76,0x66, - 0x45,0x70,0x30,0x70,0x6C,0x6B,0x2F,0x71,0x76,0x38,0x52,0x47,0x77,0x2F,0x62, - 0x42,0x53,0x2B,0x66,0x6D,0x73,0x55,0x74,0x6C,0x2B,0x54,0x68,0x72,0x57,0x67, - 0x5A,0x66,0x36,0x62,0x38,0x43,0x38,0x2F,0x55,0x58,0x41,0x65,0x49,0x75,0x4A, - 0x41,0x41,0x41,0x41,0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73, - 0x54,0x41,0x41,0x41,0x4C,0x20,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x41, - 0x41,0x41,0x4B,0x45,0x45,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x62, - 0x61,0x32,0x77,0x55,0x31,0x78,0x58,0x48,0x7A,0x2B,0x79,0x75,0x71,0x59,0x33, - 0x42,0x59,0x4F,0x4D,0x51,0x61,0x48,0x69,0x6B,0x78,0x6A,0x7A,0x69,0x4E,0x70, - 0x41,0x55,0x4D,0x49,0x4B,0x6B,0x77,0x71,0x56,0x53,0x68,0x49,0x54,0x55,0x79, - 0x6C,0x58,0x56,0x20,0x56,0x71,0x6F,0x71,0x52,0x61,0x71,0x45,0x43,0x46,0x43, - 0x70,0x4C,0x53,0x4A,0x53,0x50,0x79,0x56,0x52,0x50,0x30,0x51,0x69,0x55,0x6C, - 0x73,0x56,0x62,0x45,0x64,0x52,0x50,0x31,0x53,0x4B,0x2B,0x69,0x47,0x4B,0x57, - 0x74,0x52,0x55,0x53,0x47,0x33,0x56,0x68,0x78,0x49,0x6C,0x63,0x62,0x7A,0x47, - 0x45,0x46,0x4A,0x6B,0x31,0x6D,0x76,0x41,0x42,0x76,0x78,0x65,0x76,0x4C,0x62, - 0x58,0x20,0x33,0x76,0x55,0x2B,0x35,0x2F,0x62,0x63,0x54,0x55,0x31,0x32,0x5A, - 0x32,0x62,0x78,0x47,0x74,0x74,0x6E,0x7A,0x39,0x72,0x6E,0x66,0x74,0x6D,0x39, - 0x64,0x2B,0x37,0x4D,0x4F,0x66,0x64,0x2F,0x66,0x6E,0x76,0x75,0x7A,0x4A,0x32, - 0x37,0x68,0x6C,0x49,0x4B,0x70,0x43,0x78,0x66,0x42,0x56,0x7A,0x4C,0x64,0x2B, - 0x67,0x79,0x63,0x71,0x32,0x41,0x41,0x4C,0x44,0x4D,0x4F,0x52,0x41,0x41,0x20, - 0x42,0x49,0x42,0x6C,0x72,0x73,0x41,0x79,0x48,0x37,0x35,0x6B,0x41,0x41,0x46, - 0x67,0x6D,0x53,0x75,0x77,0x7A,0x49,0x63,0x76,0x47,0x55,0x41,0x41,0x57,0x4F, - 0x59,0x4B,0x4C,0x50,0x50,0x68,0x65,0x35,0x62,0x79,0x2B,0x4E,0x73,0x37,0x6D, - 0x7A,0x65,0x59,0x62,0x6E,0x67,0x65,0x46,0x4F,0x77,0x46,0x51,0x32,0x30,0x48, - 0x4D,0x4A,0x37,0x45,0x38,0x64,0x59,0x41,0x71,0x45,0x72,0x38,0x20,0x7A,0x43, - 0x77,0x39,0x65,0x43,0x79,0x49,0x37,0x64,0x63,0x4D,0x4D,0x47,0x34,0x72,0x55, - 0x33,0x6E,0x4E,0x31,0x66,0x45,0x50,0x44,0x32,0x37,0x36,0x2B,0x58,0x52,0x6D, - 0x70,0x36,0x58,0x34,0x33,0x56,0x68,0x4B,0x4B,0x34,0x47,0x74,0x66,0x62,0x38, - 0x70,0x63,0x30,0x2B,0x56,0x4E,0x49,0x4C,0x68,0x4F,0x71,0x49,0x4D,0x4F,0x41, - 0x78,0x4B,0x31,0x63,0x34,0x76,0x61,0x45,0x59,0x48,0x20,0x43,0x76,0x51,0x2B, - 0x77,0x6E,0x4F,0x70,0x66,0x75,0x66,0x70,0x66,0x38,0x2F,0x76,0x57,0x6A,0x7A, - 0x50,0x58,0x68,0x49,0x41,0x65,0x50,0x31,0x4E,0x6A,0x57,0x44,0x43,0x6A,0x7A, - 0x48,0x6F,0x6A,0x59,0x73,0x6C,0x4D,0x32,0x61,0x47,0x43,0x57,0x57,0x6F,0x64, - 0x38,0x42,0x30,0x76,0x58,0x56,0x67,0x31,0x30,0x73,0x64,0x69,0x32,0x57,0x48, - 0x2B,0x72,0x70,0x46,0x44,0x59,0x43,0x33,0x20,0x75,0x2B,0x57,0x59,0x53,0x70, - 0x6E,0x6E,0x77,0x49,0x41,0x36,0x59,0x75,0x48,0x65,0x4D,0x31,0x50,0x47,0x6D, - 0x59,0x4E,0x31,0x4A,0x32,0x38,0x53,0x32,0x31,0x31,0x77,0x63,0x30,0x55,0x4A, - 0x51,0x4B,0x76,0x2F,0x66,0x4C,0x31,0x62,0x75,0x56,0x37,0x48,0x31,0x31,0x68, - 0x48,0x46,0x6C,0x79,0x52,0x75,0x56,0x33,0x77,0x37,0x52,0x56,0x75,0x38,0x38, - 0x79,0x7A,0x74,0x54,0x38,0x4E,0x20,0x7A,0x4F,0x30,0x30,0x50,0x72,0x32,0x4C, - 0x43,0x6F,0x42,0x57,0x2F,0x35,0x74,0x50,0x75,0x4D,0x33,0x55,0x2B,0x58,0x78, - 0x54,0x66,0x53,0x49,0x56,0x68,0x39,0x42,0x30,0x45,0x4D,0x4C,0x78,0x45,0x45, - 0x53,0x54,0x59,0x59,0x67,0x6C,0x6F,0x68,0x42,0x4C,0x52,0x69,0x46,0x70,0x4A, - 0x72,0x49,0x69,0x38,0x43,0x56,0x50,0x47,0x58,0x68,0x63,0x48,0x6C,0x69,0x35, - 0x59,0x6A,0x57,0x55,0x20,0x65,0x6B,0x71,0x68,0x76,0x48,0x51,0x74,0x72,0x43, - 0x6D,0x74,0x41,0x73,0x50,0x49,0x37,0x79,0x6E,0x5A,0x41,0x47,0x68,0x4A,0x6C, - 0x63,0x66,0x50,0x46,0x4F,0x4E,0x4E,0x59,0x39,0x45,0x41,0x34,0x4F,0x31,0x71, - 0x4F,0x61,0x48,0x41,0x62,0x4D,0x6D,0x4B,0x6E,0x45,0x4E,0x6C,0x4F,0x68,0x47, - 0x47,0x2B,0x31,0x4D,0x44,0x45,0x49,0x79,0x4D,0x77,0x48,0x51,0x38,0x37,0x4E, - 0x41,0x6A,0x20,0x76,0x79,0x59,0x64,0x2F,0x41,0x6F,0x45,0x6F,0x57,0x72,0x6C, - 0x65,0x6C,0x68,0x58,0x76,0x68,0x45,0x38,0x37,0x70,0x4A,0x5A,0x54,0x6A,0x53, - 0x36,0x58,0x59,0x5A,0x36,0x61,0x66,0x2B,0x4F,0x55,0x2F,0x2B,0x61,0x70,0x53, - 0x4F,0x72,0x77,0x2B,0x77,0x42,0x2B,0x4C,0x54,0x33,0x74,0x32,0x74,0x6A,0x30, - 0x5A,0x49,0x57,0x6E,0x4F,0x64,0x2F,0x2B,0x44,0x44,0x6C,0x67,0x70,0x46,0x68, - 0x20,0x36,0x42,0x2F,0x76,0x67,0x58,0x41,0x73,0x39,0x4C,0x42,0x75,0x6A,0x33, - 0x51,0x4D,0x62,0x77,0x43,0x68,0x73,0x72,0x77,0x61,0x4E,0x6C,0x64,0x75,0x68, - 0x37,0x4B,0x53,0x56,0x62,0x4E,0x64,0x34,0x34,0x30,0x44,0x4F,0x30,0x2B,0x39, - 0x50,0x46,0x73,0x6E,0x4C,0x73,0x64,0x5A,0x41,0x2B,0x44,0x74,0x75,0x72,0x41, - 0x50,0x38,0x2F,0x41,0x66,0x63,0x4D,0x2F,0x4B,0x56,0x33,0x4D,0x4A,0x20,0x4E, - 0x68,0x55,0x64,0x68,0x7A,0x76,0x42,0x4C,0x70,0x69,0x4D,0x54,0x65,0x54,0x71, - 0x73,0x6D,0x44,0x74,0x47,0x6F,0x54,0x71,0x56,0x52,0x73,0x52,0x68,0x46,0x70, - 0x59,0x67,0x56,0x4E,0x46,0x72,0x6F,0x4C,0x39,0x50,0x6F,0x34,0x4D,0x42,0x67, - 0x34,0x33,0x4E,0x4C,0x79,0x53,0x7A,0x4E,0x57,0x48,0x53,0x7A,0x74,0x62,0x41, - 0x44,0x37,0x78,0x58,0x57,0x67,0x77,0x4D,0x50,0x67,0x6F,0x20,0x31,0x46,0x59, - 0x6E,0x73,0x58,0x53,0x71,0x76,0x78,0x76,0x30,0x77,0x31,0x69,0x45,0x2F,0x76, - 0x37,0x4C,0x5A,0x62,0x68,0x68,0x51,0x38,0x56,0x6D,0x65,0x47,0x4A,0x4E,0x44, - 0x62,0x6A,0x64,0x4F,0x64,0x62,0x53,0x46,0x4C,0x52,0x35,0x56,0x45,0x6E,0x6A, - 0x33,0x71,0x65,0x4F,0x44,0x7A,0x72,0x35,0x7A,0x36,0x57,0x4E,0x4A,0x51,0x44, - 0x74,0x2F,0x71,0x5A,0x76,0x6D,0x51,0x72,0x65,0x20,0x51,0x5A,0x48,0x57,0x4F, - 0x51,0x6E,0x56,0x50,0x33,0x34,0x4C,0x2B,0x73,0x5A,0x75,0x34,0x77,0x4A,0x66, - 0x59,0x62,0x65,0x7A,0x6C,0x62,0x68,0x4B,0x59,0x4E,0x76,0x36,0x70,0x32,0x46, - 0x74,0x57,0x62,0x57,0x54,0x6D,0x35,0x69,0x38,0x6A,0x4B,0x74,0x4A,0x74,0x2B, - 0x76,0x6F,0x6F,0x57,0x30,0x6E,0x52,0x68,0x77,0x37,0x4D,0x47,0x6A,0x4D,0x37, - 0x7A,0x61,0x58,0x30,0x46,0x47,0x64,0x20,0x39,0x70,0x55,0x79,0x33,0x6B,0x61, - 0x54,0x74,0x75,0x41,0x6E,0x55,0x77,0x6D,0x34,0x4D,0x64,0x51,0x42,0x39,0x38, - 0x5A,0x75,0x46,0x54,0x7A,0x34,0x57,0x70,0x49,0x45,0x50,0x6B,0x33,0x34,0x68, - 0x71,0x36,0x67,0x50,0x39,0x31,0x59,0x73,0x38,0x4F,0x49,0x71,0x36,0x7A,0x50, - 0x75,0x68,0x4F,0x70,0x39,0x33,0x52,0x66,0x72,0x6F,0x56,0x56,0x42,0x76,0x6A, - 0x34,0x31,0x70,0x76,0x72,0x20,0x33,0x63,0x6E,0x55,0x2B,0x79,0x6A,0x57,0x4C, - 0x71,0x74,0x67,0x73,0x65,0x51,0x30,0x42,0x76,0x38,0x79,0x52,0x42,0x4D,0x38, - 0x6C,0x2B,0x65,0x72,0x79,0x68,0x2B,0x44,0x37,0x59,0x2F,0x74,0x79,0x66,0x48, - 0x6F,0x61,0x44,0x51,0x66,0x32,0x48,0x6E,0x79,0x6C,0x48,0x56,0x4D,0x48,0x4F, - 0x71,0x73,0x4D,0x6F,0x41,0x6E,0x61,0x56,0x35,0x30,0x43,0x76,0x35,0x30,0x59, - 0x67,0x71,0x75,0x20,0x39,0x37,0x65,0x78,0x44,0x62,0x34,0x4F,0x5A,0x44,0x41, - 0x63,0x67,0x42,0x75,0x44,0x6C,0x79,0x47,0x6C,0x55,0x67,0x35,0x78,0x56,0x53, - 0x66,0x62,0x2F,0x45,0x30,0x43,0x67,0x49,0x4D,0x79,0x44,0x35,0x72,0x61,0x75, - 0x70,0x72,0x4F,0x34,0x5A,0x78,0x2B,0x36,0x45,0x48,0x44,0x2F,0x37,0x39,0x45, - 0x45,0x78,0x48,0x6F,0x48,0x47,0x6A,0x48,0x64,0x42,0x75,0x33,0x48,0x6D,0x4A, - 0x58,0x20,0x44,0x38,0x58,0x47,0x6F,0x57,0x76,0x34,0x43,0x72,0x36,0x44,0x4D, - 0x75,0x32,0x2B,0x4B,0x62,0x6A,0x51,0x37,0x6D,0x75,0x32,0x6A,0x63,0x2F,0x65, - 0x6B,0x62,0x61,0x46,0x52,0x51,0x62,0x34,0x70,0x4C,0x76,0x35,0x4B,0x52,0x7A, - 0x32,0x57,0x65,0x76,0x51,0x39,0x55,0x71,0x65,0x62,0x37,0x67,0x6A,0x50,0x64, - 0x64,0x61,0x6A,0x33,0x47,0x74,0x68,0x36,0x62,0x48,0x34,0x47,0x62,0x67,0x20, - 0x76,0x34,0x37,0x75,0x6D,0x51,0x62,0x4D,0x75,0x70,0x44,0x6C,0x65,0x4F,0x49, - 0x69,0x4E,0x72,0x49,0x41,0x77,0x47,0x58,0x43,0x37,0x2B,0x31,0x6A,0x56,0x4E, - 0x41,0x64,0x75,0x4D,0x59,0x36,0x37,0x64,0x74,0x39,0x2F,0x72,0x78,0x6C,0x4E, - 0x49,0x79,0x4C,0x55,0x6D,0x4E,0x4F,0x37,0x34,0x6E,0x55,0x62,0x71,0x2B,0x2F, - 0x2B,0x58,0x79,0x75,0x38,0x77,0x72,0x52,0x58,0x6E,0x41,0x41,0x20,0x63,0x71, - 0x58,0x2B,0x65,0x79,0x69,0x67,0x2F,0x6A,0x55,0x56,0x61,0x2B,0x6E,0x44,0x56, - 0x63,0x6C,0x51,0x31,0x4F,0x34,0x2F,0x50,0x68,0x6D,0x63,0x31,0x68,0x74,0x56, - 0x75,0x49,0x79,0x72,0x6F,0x41,0x43,0x38,0x43,0x2B,0x2B,0x36,0x63,0x64,0x58, - 0x73,0x75,0x46,0x57,0x4D,0x53,0x52,0x52,0x75,0x59,0x4C,0x7A,0x58,0x32,0x6C, - 0x78,0x55,0x64,0x62,0x31,0x47,0x6F,0x61,0x63,0x43,0x20,0x70,0x35,0x74,0x43, - 0x33,0x4B,0x58,0x45,0x4A,0x67,0x73,0x55,0x46,0x49,0x43,0x74,0x76,0x68,0x46, - 0x39,0x34,0x37,0x63,0x6D,0x4F,0x37,0x49,0x4B,0x65,0x6B,0x5A,0x76,0x73,0x48, - 0x6A,0x4F,0x7A,0x2F,0x5A,0x72,0x37,0x72,0x55,0x34,0x76,0x6E,0x6E,0x73,0x78, - 0x7A,0x55,0x4C,0x65,0x31,0x48,0x66,0x61,0x2F,0x56,0x64,0x65,0x4E,0x72,0x65, - 0x54,0x74,0x39,0x53,0x55,0x41,0x44,0x77,0x20,0x6F,0x66,0x6B,0x6E,0x31,0x69, - 0x45,0x50,0x68,0x2B,0x35,0x42,0x4A,0x44,0x35,0x6C,0x62,0x53,0x37,0x61,0x2B, - 0x6D,0x44,0x6F,0x4C,0x74,0x37,0x48,0x52,0x47,0x7A,0x2B,0x75,0x38,0x46,0x34, - 0x7A,0x64,0x5A,0x59,0x67,0x49,0x61,0x43,0x41,0x64,0x44,0x6D,0x61,0x7A,0x70, - 0x75,0x2F,0x66,0x58,0x72,0x78,0x36,0x66,0x2B,0x69,0x5A,0x34,0x43,0x79,0x4C, - 0x42,0x34,0x4A,0x76,0x57,0x59,0x20,0x50,0x6C,0x38,0x70,0x7A,0x4C,0x61,0x68, - 0x39,0x7A,0x52,0x30,0x64,0x50,0x35,0x75,0x53,0x33,0x59,0x72,0x66,0x61,0x31, - 0x67,0x41,0x42,0x67,0x47,0x76,0x47,0x67,0x64,0x37,0x73,0x68,0x6B,0x48,0x38, - 0x53,0x54,0x4D,0x57,0x74,0x7A,0x30,0x64,0x65,0x44,0x59,0x64,0x79,0x62,0x67, - 0x43,0x2B,0x76,0x72,0x43,0x58,0x70,0x39,0x76,0x7A,0x43,0x32,0x6B,0x5A,0x64, - 0x7A,0x2F,0x45,0x71,0x20,0x61,0x33,0x48,0x64,0x61,0x4F,0x31,0x73,0x72,0x6E, - 0x57,0x35,0x34,0x61,0x44,0x56,0x79,0x73,0x44,0x45,0x48,0x57,0x74,0x54,0x56, - 0x6E,0x33,0x6E,0x78,0x75,0x64,0x67,0x30,0x37,0x71,0x76,0x34,0x55,0x61,0x4E, - 0x44,0x54,0x41,0x53,0x75,0x67,0x6B,0x39,0x67,0x58,0x59,0x59,0x47,0x50,0x4E, - 0x6E,0x39,0x58,0x6E,0x55,0x79,0x75,0x71,0x79,0x4B,0x74,0x69,0x31,0x38,0x54, - 0x42,0x73,0x20,0x71,0x74,0x71,0x4E,0x64,0x2B,0x39,0x44,0x30,0x44,0x64,0x36, - 0x48,0x61,0x39,0x2F,0x46,0x59,0x47,0x30,0x70,0x2B,0x2B,0x35,0x32,0x74,0x41, - 0x33,0x68,0x49,0x4F,0x68,0x58,0x71,0x68,0x5A,0x5A,0x33,0x32,0x72,0x72,0x62, - 0x36,0x4E,0x31,0x2F,0x72,0x5A,0x58,0x4B,0x2B,0x33,0x6B,0x50,0x30,0x4C,0x38, - 0x69,0x37,0x41,0x32,0x39,0x56,0x30,0x46,0x6C,0x2B,0x64,0x6E,0x4D,0x73,0x63, - 0x20,0x53,0x43,0x67,0x61,0x68,0x45,0x35,0x63,0x53,0x6E,0x55,0x71,0x4B,0x7A, - 0x77,0x72,0x34,0x62,0x76,0x31,0x72,0x38,0x48,0x6A,0x46,0x54,0x74,0x73,0x68, - 0x2B,0x2F,0x65,0x76,0x77,0x4B,0x58,0x50,0x6E,0x31,0x6A,0x58,0x6F,0x48,0x61, - 0x58,0x39,0x4D,0x49,0x68,0x33,0x61,0x38,0x61,0x4C,0x74,0x32,0x4E,0x42,0x47, - 0x43,0x76,0x33,0x2F,0x32,0x61,0x2B,0x68,0x46,0x45,0x4F,0x5A,0x62,0x20,0x33, - 0x50,0x67,0x4B,0x65,0x65,0x2F,0x57,0x42,0x74,0x43,0x76,0x6B,0x6A,0x4F,0x4C, - 0x71,0x64,0x54,0x75,0x67,0x37,0x74,0x4F,0x4F,0x36,0x38,0x63,0x5A,0x58,0x5A, - 0x63,0x70,0x4F,0x38,0x46,0x6D,0x51,0x4C,0x77,0x62,0x64,0x39,0x68,0x36,0x33, - 0x67,0x43,0x6B,0x77,0x50,0x57,0x70,0x6E,0x54,0x39,0x59,0x63,0x48,0x58,0x48, - 0x62,0x5A,0x55,0x66,0x7A,0x30,0x4E,0x68,0x2B,0x37,0x33,0x20,0x4B,0x4F,0x57, - 0x35,0x48,0x54,0x39,0x79,0x44,0x4C,0x36,0x2B,0x56,0x6D,0x6C,0x4A,0x42,0x58, - 0x78,0x6E,0x37,0x36,0x75,0x67,0x4D,0x38,0x39,0x38,0x69,0x33,0x34,0x63,0x31, - 0x46,0x4F,0x42,0x74,0x62,0x67,0x4E,0x34,0x36,0x69,0x31,0x6A,0x62,0x4A,0x65, - 0x45,0x41,0x44,0x77,0x6A,0x78,0x5A,0x48,0x72,0x49,0x50,0x4D,0x74,0x62,0x48, - 0x44,0x2B,0x73,0x76,0x58,0x76,0x30,0x72,0x39,0x20,0x71,0x39,0x65,0x66,0x4D, - 0x30,0x56,0x6E,0x42,0x74,0x31,0x76,0x72,0x68,0x44,0x6F,0x77,0x4F,0x36,0x72, - 0x2B,0x66,0x37,0x4D,0x5A,0x64,0x4B,0x66,0x2B,0x74,0x72,0x44,0x6F,0x65,0x78, - 0x70,0x35,0x65,0x69,0x65,0x6C,0x78,0x63,0x45,0x67,0x6A,0x48,0x63,0x70,0x32, - 0x67,0x74,0x6D,0x41,0x6D,0x66,0x74,0x37,0x5A,0x52,0x31,0x73,0x6E,0x76,0x41, - 0x64,0x70,0x38,0x4C,0x66,0x67,0x33,0x20,0x4C,0x53,0x6A,0x4C,0x48,0x47,0x51, - 0x6B,0x50,0x6D,0x6E,0x62,0x71,0x61,0x75,0x50,0x36,0x39,0x53,0x63,0x6D,0x66, - 0x5A,0x31,0x59,0x50,0x37,0x73,0x66,0x53,0x57,0x64,0x37,0x71,0x32,0x5A,0x51, - 0x66,0x63,0x37,0x39,0x73,0x78,0x5A,0x75,0x48,0x67,0x35,0x76,0x36,0x65,0x72, - 0x36,0x6C,0x57,0x62,0x6F,0x4B,0x48,0x75,0x52,0x4B,0x59,0x62,0x38,0x4C,0x64, - 0x72,0x35,0x36,0x42,0x72,0x20,0x38,0x4B,0x4E,0x30,0x32,0x2B,0x34,0x74,0x4C, - 0x38,0x41,0x33,0x36,0x37,0x35,0x34,0x67,0x61,0x66,0x37,0x6A,0x6B,0x37,0x65, - 0x77,0x51,0x32,0x6E,0x66,0x56,0x6E,0x6E,0x7A,0x4B,0x55,0x79,0x67,0x54,0x75, - 0x55,0x37,0x63,0x58,0x34,0x68,0x72,0x32,0x4E,0x72,0x6F,0x55,0x2B,0x41,0x78, - 0x6A,0x4B,0x52,0x76,0x78,0x45,0x64,0x4E,0x51,0x32,0x59,0x6E,0x31,0x54,0x6C, - 0x6A,0x6B,0x76,0x20,0x36,0x31,0x2F,0x38,0x54,0x50,0x42,0x31,0x5A,0x33,0x31, - 0x7A,0x70,0x75,0x75,0x5A,0x76,0x31,0x59,0x39,0x48,0x58,0x79,0x35,0x30,0x6E, - 0x36,0x66,0x59,0x4C,0x73,0x34,0x4E,0x74,0x54,0x58,0x2F,0x69,0x43,0x64,0x34, - 0x6D,0x65,0x4F,0x5A,0x51,0x5A,0x66,0x74,0x33,0x31,0x32,0x39,0x78,0x2F,0x77, - 0x6E,0x38,0x36,0x6D,0x6D,0x63,0x50,0x70,0x76,0x6E,0x75,0x65,0x50,0x50,0x61, - 0x67,0x20,0x2F,0x69,0x68,0x66,0x39,0x48,0x5A,0x30,0x2F,0x57,0x6F,0x37,0x75, - 0x36,0x6A,0x4B,0x74,0x70,0x76,0x6E,0x36,0x37,0x4C,0x62,0x36,0x47,0x72,0x30, - 0x41,0x41,0x44,0x73,0x73,0x77,0x34,0x76,0x48,0x50,0x30,0x69,0x6E,0x56,0x75, - 0x50,0x7A,0x64,0x54,0x2F,0x65,0x75,0x56,0x58,0x74,0x68,0x73,0x39,0x44,0x63, - 0x47,0x6C,0x71,0x36,0x39,0x6E,0x54,0x51,0x65,0x54,0x30,0x66,0x73,0x7A,0x20, - 0x70,0x2B,0x54,0x39,0x32,0x54,0x33,0x30,0x77,0x59,0x4E,0x66,0x66,0x75,0x5A, - 0x4A,0x47,0x67,0x4A,0x39,0x62,0x4B,0x61,0x45,0x48,0x46,0x4C,0x34,0x7A,0x4C, - 0x46,0x38,0x50,0x35,0x31,0x32,0x4C,0x52,0x74,0x4A,0x34,0x35,0x6C,0x38,0x7A, - 0x31,0x2F,0x6F,0x66,0x75,0x52,0x54,0x67,0x41,0x46,0x71,0x47,0x38,0x35,0x37, - 0x57,0x53,0x57,0x4B,0x75,0x33,0x32,0x73,0x5A,0x52,0x4C,0x54,0x20,0x35,0x56, - 0x38,0x36,0x58,0x6F,0x56,0x74,0x6A,0x39,0x66,0x44,0x72,0x57,0x46,0x76,0x7A, - 0x73,0x63,0x39,0x33,0x65,0x39,0x50,0x62,0x62,0x2B,0x45,0x72,0x36,0x7A,0x66, - 0x44,0x34,0x48,0x4A,0x58,0x74,0x44,0x31,0x66,0x4D,0x6F,0x2F,0x72,0x37,0x66, - 0x41,0x52,0x47,0x51,0x6F,0x33,0x62,0x58,0x39,0x39,0x73,0x57,0x63,0x70,0x2B, - 0x68,0x2B,0x67,0x64,0x42,0x74,0x2F,0x45,0x4E,0x4A,0x20,0x47,0x48,0x77,0x44, - 0x48,0x2B,0x62,0x73,0x6C,0x2B,0x2B,0x42,0x69,0x43,0x30,0x44,0x34,0x4A,0x6D, - 0x47,0x71,0x32,0x41,0x5A,0x67,0x42,0x77,0x41,0x44,0x4C,0x37,0x31,0x59,0x64, - 0x68,0x78,0x6B,0x55,0x51,0x4C,0x71,0x68,0x2B,0x2F,0x38,0x6E,0x6B,0x45,0x30, - 0x2F,0x50,0x79,0x58,0x4F,0x64,0x6D,0x6E,0x54,0x30,0x2B,0x38,0x76,0x39,0x78, - 0x31,0x72,0x6A,0x70,0x66,0x67,0x38,0x44,0x20,0x5A,0x4E,0x59,0x4C,0x57,0x44, - 0x72,0x45,0x48,0x4A,0x61,0x46,0x63,0x54,0x2F,0x68,0x64,0x6B,0x73,0x33,0x73, - 0x69,0x72,0x70,0x46,0x4E,0x44,0x52,0x38,0x64,0x5A,0x4B,0x48,0x46,0x6C,0x46, - 0x35,0x75,0x68,0x4D,0x66,0x44,0x78,0x4B,0x6D,0x63,0x6E,0x4D,0x70,0x69,0x58, - 0x39,0x50,0x65,0x61,0x38,0x30,0x72,0x6D,0x35,0x55,0x49,0x4D,0x6D,0x42,0x53, - 0x43,0x32,0x31,0x72,0x54,0x39,0x20,0x72,0x53,0x5A,0x6C,0x70,0x67,0x6F,0x31, - 0x39,0x6F,0x4C,0x59,0x54,0x53,0x6B,0x37,0x37,0x4A,0x67,0x56,0x62,0x62,0x70, - 0x51,0x4F,0x55,0x63,0x4B,0x67,0x43,0x65,0x5A,0x4C,0x4C,0x63,0x4F,0x7A,0x48, - 0x51,0x51,0x78,0x4E,0x70,0x6E,0x4B,0x64,0x57,0x64,0x67,0x44,0x63,0x41,0x4C, - 0x4B,0x2F,0x45,0x36,0x55,0x5A,0x4D,0x43,0x6B,0x42,0x4B,0x32,0x55,0x6C,0x33, - 0x45,0x6F,0x52,0x75,0x20,0x2B,0x47,0x4B,0x4A,0x46,0x41,0x43,0x52,0x6D,0x35, - 0x38,0x43,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79, - 0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41, - 0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63, - 0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75, - 0x71,0x52,0x20,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F, - 0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44, - 0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79, - 0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F, - 0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71, - 0x20,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41, - 0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48, - 0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A, - 0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78, - 0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x20,0x41, - 0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50, - 0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C, - 0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B, - 0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41, - 0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x20,0x6D,0x4A,0x42, - 0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79, - 0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38, - 0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A, - 0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39, - 0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x20,0x4A,0x41,0x43,0x51,0x79, - 0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41, - 0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63, - 0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75, - 0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D, - 0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x20,0x79,0x73,0x33,0x50,0x6D,0x41,0x44, - 0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79, - 0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F, - 0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71, - 0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43, - 0x51,0x79,0x73,0x33,0x50,0x20,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48, - 0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A, - 0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78, - 0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67, + 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61, + 0x72,0x28,0x29,0x20,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,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20, + 0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x20,0x74,0x68,0x65,0x6E, + 0x20,0x66,0x6F,0x72,0x20,0x65,0x2C,0x61,0x2C,0x62,0x2C,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,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20, + 0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x20,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, + 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64, + 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x68,0x61,0x6E,0x64,0x6C,0x65,0x72,0x73,0x5B, + 0x65,0x5D,0x28,0x61,0x2C,0x62,0x2C,0x63,0x29,0x20,0x65,0x6E,0x64,0x20,0x65, + 0x6E,0x64,0x20,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,0x31,0x29,0x20,0x65,0x6E,0x64, + 0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69, + 0x63,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, + 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28, + 0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66, + 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x6E,0x6F, + 0x67,0x61,0x6D,0x65,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6B,0x6E, + 0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B, + 0x5B,0x20,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,0x43,0x37,0x6D,0x6C,0x44,0x51,0x31,0x42,0x4A,0x51,0x30, + 0x4D,0x67,0x55,0x48,0x4A,0x76,0x5A,0x6D,0x6C,0x73,0x5A,0x51,0x41,0x41,0x20, + 0x65,0x41,0x47,0x46,0x56,0x4D,0x39,0x72,0x45,0x30,0x45,0x55,0x2F,0x6A,0x5A, + 0x75,0x71,0x64,0x41,0x69,0x43,0x46,0x70,0x72,0x44,0x72,0x4A,0x34,0x6B,0x43, + 0x4A,0x4A,0x57,0x61,0x74,0x6F,0x52,0x64,0x51,0x32,0x2F,0x52,0x46,0x69,0x61, + 0x77,0x7A,0x62,0x48,0x37,0x5A,0x46,0x6B,0x47,0x51,0x7A,0x53,0x64,0x5A,0x75, + 0x4E,0x75,0x76,0x75,0x4A,0x72,0x57,0x6C,0x69,0x4F,0x54,0x69,0x20,0x30,0x53, + 0x72,0x65,0x52,0x65,0x32,0x68,0x42,0x2F,0x2B,0x41,0x48,0x6E,0x72,0x77,0x5A, + 0x43,0x39,0x4B,0x68,0x56,0x70,0x46,0x4B,0x4E,0x36,0x72,0x4B,0x47,0x4B,0x68, + 0x46,0x79,0x33,0x78,0x7A,0x57,0x35,0x4D,0x74,0x71,0x58,0x71,0x77,0x4D,0x35, + 0x2B,0x38,0x39,0x34,0x33,0x37,0x33,0x31,0x76,0x64,0x74,0x38,0x41,0x44,0x58, + 0x4C,0x53,0x4E,0x50,0x57,0x41,0x42,0x4F,0x51,0x4E,0x20,0x78,0x31,0x4B,0x69, + 0x45,0x57,0x6C,0x73,0x66,0x45,0x4A,0x71,0x2F,0x49,0x67,0x41,0x6A,0x71,0x49, + 0x4A,0x51,0x54,0x51,0x6C,0x56,0x64,0x76,0x73,0x54,0x69,0x51,0x47,0x51,0x59, + 0x4E,0x7A,0x2B,0x58,0x76,0x6E,0x32,0x48,0x6F,0x50,0x67,0x56,0x74,0x57,0x77, + 0x33,0x76,0x37,0x64,0x37,0x4A,0x33,0x72,0x5A,0x72,0x53,0x74,0x70,0x6F,0x48, + 0x68,0x50,0x31,0x41,0x34,0x45,0x65,0x61,0x20,0x32,0x53,0x71,0x77,0x37,0x78, + 0x64,0x78,0x43,0x6C,0x6B,0x53,0x41,0x6F,0x67,0x38,0x33,0x36,0x45,0x70,0x78, + 0x33,0x51,0x49,0x33,0x2B,0x50,0x59,0x38,0x75,0x79,0x50,0x4F,0x55,0x35,0x35, + 0x65,0x4D,0x47,0x31,0x44,0x79,0x73,0x39,0x78,0x46,0x6B,0x69,0x66,0x45,0x41, + 0x31,0x4C,0x63,0x35,0x2F,0x54,0x62,0x68,0x54,0x7A,0x53,0x58,0x54,0x51,0x49, + 0x4E,0x49,0x4F,0x4A,0x54,0x31,0x20,0x63,0x56,0x49,0x2B,0x6E,0x4E,0x65,0x4C, + 0x6C,0x4E,0x63,0x64,0x42,0x32,0x6C,0x75,0x5A,0x73,0x62,0x49,0x45,0x4C,0x31, + 0x50,0x6B,0x4B,0x61,0x37,0x7A,0x4F,0x36,0x72,0x59,0x71,0x47,0x63,0x54,0x76, + 0x59,0x4F,0x6B,0x4C,0x32,0x64,0x39,0x48,0x35,0x4F,0x73,0x39,0x34,0x2B,0x77, + 0x69,0x48,0x43,0x43,0x78,0x6D,0x74,0x50,0x30,0x61,0x34,0x6A,0x5A,0x37,0x31, + 0x6A,0x4E,0x55,0x2F,0x20,0x34,0x6D,0x48,0x68,0x70,0x4F,0x62,0x45,0x68,0x6A, + 0x30,0x63,0x47,0x44,0x58,0x30,0x2B,0x47,0x41,0x56,0x74,0x78,0x71,0x70,0x2B, + 0x44,0x58,0x43,0x46,0x46,0x38,0x51,0x54,0x53,0x65,0x69,0x56,0x48,0x48,0x5A, + 0x4C,0x67,0x33,0x78,0x6D,0x4B,0x37,0x39,0x56,0x76,0x4A,0x4B,0x67,0x6E,0x43, + 0x51,0x4F,0x4D,0x70,0x6B,0x59,0x59,0x42,0x7A,0x57,0x6B,0x68,0x50,0x31,0x30, + 0x78,0x75,0x20,0x2B,0x4C,0x71,0x48,0x42,0x58,0x30,0x6D,0x31,0x78,0x4F,0x76, + 0x34,0x6E,0x64,0x57,0x55,0x65,0x46,0x35,0x6A,0x78,0x4E,0x6E,0x33,0x74,0x54, + 0x64,0x37,0x30,0x58,0x61,0x41,0x71,0x38,0x77,0x44,0x68,0x30,0x4D,0x47,0x67, + 0x79,0x61,0x44,0x55,0x68,0x51,0x45,0x45,0x55,0x45,0x59,0x5A,0x69,0x77,0x55, + 0x45,0x43,0x47,0x50,0x42,0x6F,0x78,0x4E,0x4C,0x4A,0x79,0x50,0x79,0x4F,0x72, + 0x20,0x42,0x68,0x75,0x54,0x65,0x7A,0x4A,0x31,0x4A,0x47,0x71,0x37,0x64,0x47, + 0x4A,0x45,0x73,0x55,0x46,0x37,0x4E,0x74,0x77,0x39,0x74,0x31,0x47,0x6B,0x33, + 0x54,0x7A,0x2B,0x4B,0x43,0x4A,0x78,0x6C,0x45,0x4F,0x31,0x43,0x4A,0x4C,0x38, + 0x51,0x66,0x34,0x71,0x72,0x38,0x6C,0x50,0x35,0x58,0x6E,0x35,0x79,0x31,0x79, + 0x77,0x32,0x46,0x62,0x33,0x6C,0x4B,0x32,0x62,0x6D,0x72,0x72,0x79,0x20,0x34, + 0x44,0x76,0x46,0x35,0x5A,0x6D,0x35,0x47,0x68,0x37,0x58,0x30,0x38,0x6A,0x6A, + 0x63,0x30,0x31,0x65,0x66,0x4A,0x58,0x55,0x64,0x70,0x4E,0x58,0x52,0x35,0x61, + 0x73,0x65,0x58,0x71,0x38,0x6D,0x75,0x77,0x61,0x50,0x2B,0x78,0x58,0x6C,0x7A, + 0x48,0x6D,0x67,0x6A,0x57,0x50,0x78,0x48,0x4F,0x77,0x2B,0x2F,0x45,0x74,0x58, + 0x35,0x58,0x4D,0x6C,0x79,0x6D,0x4D,0x46,0x4D,0x58,0x6A,0x20,0x56,0x66,0x50, + 0x71,0x53,0x34,0x52,0x31,0x57,0x6A,0x45,0x33,0x33,0x35,0x39,0x73,0x66,0x7A, + 0x73,0x39,0x34,0x69,0x37,0x50,0x4C,0x72,0x58,0x57,0x63,0x36,0x32,0x4A,0x69, + 0x7A,0x64,0x57,0x6D,0x35,0x64,0x6E,0x2F,0x57,0x70,0x49,0x2B,0x2B,0x36,0x71, + 0x76,0x4A,0x50,0x6D,0x56,0x66,0x6C,0x50,0x58,0x76,0x58,0x78,0x2F,0x47,0x66, + 0x4E,0x78,0x47,0x50,0x69,0x4B,0x54,0x45,0x6D,0x20,0x64,0x6F,0x72,0x6E,0x49, + 0x59,0x6D,0x58,0x78,0x53,0x37,0x78,0x6B,0x74,0x68,0x4C,0x71,0x77,0x76,0x69, + 0x59,0x47,0x33,0x48,0x43,0x4A,0x32,0x56,0x68,0x69,0x6E,0x53,0x62,0x5A,0x48, + 0x36,0x4A,0x4E,0x56,0x67,0x59,0x4A,0x71,0x38,0x39,0x53,0x39,0x64,0x50,0x31, + 0x74,0x34,0x76,0x55,0x5A,0x2F,0x44,0x50,0x56,0x52,0x6C,0x42,0x6E,0x4D,0x30, + 0x6C,0x53,0x4A,0x39,0x33,0x2F,0x43,0x20,0x4B,0x6D,0x51,0x30,0x6E,0x62,0x6B, + 0x4F,0x62,0x2F,0x71,0x50,0x32,0x38,0x66,0x38,0x46,0x2B,0x54,0x33,0x69,0x75, + 0x65,0x66,0x4B,0x41,0x49,0x76,0x62,0x4F,0x44,0x49,0x6D,0x62,0x70,0x74,0x55, + 0x33,0x48,0x76,0x45,0x4B,0x46,0x6C,0x70,0x57,0x35,0x7A,0x72,0x67,0x49,0x58, + 0x76,0x39,0x46,0x39,0x38,0x4C,0x5A,0x75,0x61,0x36,0x4E,0x2B,0x4F,0x50,0x77, + 0x45,0x57,0x44,0x79,0x72,0x20,0x46,0x71,0x31,0x53,0x4E,0x5A,0x38,0x67,0x76, + 0x41,0x45,0x63,0x64,0x6F,0x64,0x36,0x48,0x75,0x67,0x70,0x6D,0x4E,0x4F,0x57, + 0x6C,0x73,0x30,0x35,0x55,0x6F,0x63,0x73,0x6E,0x35,0x4F,0x36,0x36,0x63,0x70, + 0x69,0x55,0x73,0x78,0x51,0x32,0x30,0x4E,0x53,0x55,0x74,0x63,0x6C,0x31,0x32, + 0x56,0x4C,0x46,0x72,0x4F,0x5A,0x56,0x57,0x4C,0x70,0x64,0x74,0x69,0x5A,0x30, + 0x78,0x31,0x75,0x20,0x48,0x4B,0x45,0x35,0x51,0x76,0x66,0x45,0x70,0x30,0x70, + 0x6C,0x6B,0x2F,0x71,0x76,0x38,0x52,0x47,0x77,0x2F,0x62,0x42,0x53,0x2B,0x66, + 0x6D,0x73,0x55,0x74,0x6C,0x2B,0x54,0x68,0x72,0x57,0x67,0x5A,0x66,0x36,0x62, + 0x38,0x43,0x38,0x2F,0x55,0x58,0x41,0x65,0x49,0x75,0x4A,0x41,0x41,0x41,0x41, + 0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73,0x54,0x41,0x41,0x41, + 0x4C,0x20,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x41,0x41,0x41,0x4B,0x45, + 0x45,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x62,0x61,0x32,0x77,0x55, + 0x31,0x78,0x58,0x48,0x7A,0x2B,0x79,0x75,0x71,0x59,0x33,0x42,0x59,0x4F,0x4D, + 0x51,0x61,0x48,0x69,0x6B,0x78,0x6A,0x7A,0x69,0x4E,0x70,0x41,0x55,0x4D,0x49, + 0x4B,0x6B,0x77,0x71,0x56,0x53,0x68,0x49,0x54,0x55,0x79,0x6C,0x58,0x56,0x20, + 0x56,0x71,0x6F,0x71,0x52,0x61,0x71,0x45,0x43,0x46,0x43,0x70,0x4C,0x53,0x4A, + 0x53,0x50,0x79,0x56,0x52,0x50,0x30,0x51,0x69,0x55,0x6C,0x73,0x56,0x62,0x45, + 0x64,0x52,0x50,0x31,0x53,0x4B,0x2B,0x69,0x47,0x4B,0x57,0x74,0x52,0x55,0x53, + 0x47,0x33,0x56,0x68,0x78,0x49,0x6C,0x63,0x62,0x7A,0x47,0x45,0x46,0x4A,0x6B, + 0x31,0x6D,0x76,0x41,0x42,0x76,0x78,0x65,0x76,0x4C,0x62,0x58,0x20,0x33,0x76, + 0x55,0x2B,0x35,0x2F,0x62,0x63,0x54,0x55,0x31,0x32,0x5A,0x32,0x62,0x78,0x47, + 0x74,0x74,0x6E,0x7A,0x39,0x72,0x6E,0x66,0x74,0x6D,0x39,0x64,0x2B,0x37,0x4D, + 0x4F,0x66,0x64,0x2F,0x66,0x6E,0x76,0x75,0x7A,0x4A,0x32,0x37,0x68,0x6C,0x49, + 0x4B,0x70,0x43,0x78,0x66,0x42,0x56,0x7A,0x4C,0x64,0x2B,0x67,0x79,0x63,0x71, + 0x32,0x41,0x41,0x4C,0x44,0x4D,0x4F,0x52,0x41,0x41,0x20,0x42,0x49,0x42,0x6C, + 0x72,0x73,0x41,0x79,0x48,0x37,0x35,0x6B,0x41,0x41,0x46,0x67,0x6D,0x53,0x75, + 0x77,0x7A,0x49,0x63,0x76,0x47,0x55,0x41,0x41,0x57,0x4F,0x59,0x4B,0x4C,0x50, + 0x50,0x68,0x65,0x35,0x62,0x79,0x2B,0x4E,0x73,0x37,0x6D,0x7A,0x65,0x59,0x62, + 0x6E,0x67,0x65,0x46,0x4F,0x77,0x46,0x51,0x32,0x30,0x48,0x4D,0x4A,0x37,0x45, + 0x38,0x64,0x59,0x41,0x71,0x45,0x72,0x38,0x20,0x7A,0x43,0x77,0x39,0x65,0x43, + 0x79,0x49,0x37,0x64,0x63,0x4D,0x4D,0x47,0x34,0x72,0x55,0x33,0x6E,0x4E,0x31, + 0x66,0x45,0x50,0x44,0x32,0x37,0x36,0x2B,0x58,0x52,0x6D,0x70,0x36,0x58,0x34, + 0x33,0x56,0x68,0x4B,0x4B,0x34,0x47,0x74,0x66,0x62,0x38,0x70,0x63,0x30,0x2B, + 0x56,0x4E,0x49,0x4C,0x68,0x4F,0x71,0x49,0x4D,0x4F,0x41,0x78,0x4B,0x31,0x63, + 0x34,0x76,0x61,0x45,0x59,0x48,0x20,0x43,0x76,0x51,0x2B,0x77,0x6E,0x4F,0x70, + 0x66,0x75,0x66,0x70,0x66,0x38,0x2F,0x76,0x57,0x6A,0x7A,0x50,0x58,0x68,0x49, + 0x41,0x65,0x50,0x31,0x4E,0x6A,0x57,0x44,0x43,0x6A,0x7A,0x48,0x6F,0x6A,0x59, + 0x73,0x6C,0x4D,0x32,0x61,0x47,0x43,0x57,0x57,0x6F,0x64,0x38,0x42,0x30,0x76, + 0x58,0x56,0x67,0x31,0x30,0x73,0x64,0x69,0x32,0x57,0x48,0x2B,0x72,0x70,0x46, + 0x44,0x59,0x43,0x33,0x20,0x75,0x2B,0x57,0x59,0x53,0x70,0x6E,0x6E,0x77,0x49, + 0x41,0x36,0x59,0x75,0x48,0x65,0x4D,0x31,0x50,0x47,0x6D,0x59,0x4E,0x31,0x4A, + 0x32,0x38,0x53,0x32,0x31,0x31,0x77,0x63,0x30,0x55,0x4A,0x51,0x4B,0x76,0x2F, + 0x66,0x4C,0x31,0x62,0x75,0x56,0x37,0x48,0x31,0x31,0x68,0x48,0x46,0x6C,0x79, + 0x52,0x75,0x56,0x33,0x77,0x37,0x52,0x56,0x75,0x38,0x38,0x79,0x7A,0x74,0x54, + 0x38,0x4E,0x20,0x7A,0x4F,0x30,0x30,0x50,0x72,0x32,0x4C,0x43,0x6F,0x42,0x57, + 0x2F,0x35,0x74,0x50,0x75,0x4D,0x33,0x55,0x2B,0x58,0x78,0x54,0x66,0x53,0x49, + 0x56,0x68,0x39,0x42,0x30,0x45,0x4D,0x4C,0x78,0x45,0x45,0x53,0x54,0x59,0x59, + 0x67,0x6C,0x6F,0x68,0x42,0x4C,0x52,0x69,0x46,0x70,0x4A,0x72,0x49,0x69,0x38, + 0x43,0x56,0x50,0x47,0x58,0x68,0x63,0x48,0x6C,0x69,0x35,0x59,0x6A,0x57,0x55, + 0x20,0x65,0x6B,0x71,0x68,0x76,0x48,0x51,0x74,0x72,0x43,0x6D,0x74,0x41,0x73, + 0x50,0x49,0x37,0x79,0x6E,0x5A,0x41,0x47,0x68,0x4A,0x6C,0x63,0x66,0x50,0x46, + 0x4F,0x4E,0x4E,0x59,0x39,0x45,0x41,0x34,0x4F,0x31,0x71,0x4F,0x61,0x48,0x41, + 0x62,0x4D,0x6D,0x4B,0x6E,0x45,0x4E,0x6C,0x4F,0x68,0x47,0x47,0x2B,0x31,0x4D, + 0x44,0x45,0x49,0x79,0x4D,0x77,0x48,0x51,0x38,0x37,0x4E,0x41,0x6A,0x20,0x76, + 0x79,0x59,0x64,0x2F,0x41,0x6F,0x45,0x6F,0x57,0x72,0x6C,0x65,0x6C,0x68,0x58, + 0x76,0x68,0x45,0x38,0x37,0x70,0x4A,0x5A,0x54,0x6A,0x53,0x36,0x58,0x59,0x5A, + 0x36,0x61,0x66,0x2B,0x4F,0x55,0x2F,0x2B,0x61,0x70,0x53,0x4F,0x72,0x77,0x2B, + 0x77,0x42,0x2B,0x4C,0x54,0x33,0x74,0x32,0x74,0x6A,0x30,0x5A,0x49,0x57,0x6E, + 0x4F,0x64,0x2F,0x2B,0x44,0x44,0x6C,0x67,0x70,0x46,0x68,0x20,0x36,0x42,0x2F, + 0x76,0x67,0x58,0x41,0x73,0x39,0x4C,0x42,0x75,0x6A,0x33,0x51,0x4D,0x62,0x77, + 0x43,0x68,0x73,0x72,0x77,0x61,0x4E,0x6C,0x64,0x75,0x68,0x37,0x4B,0x53,0x56, + 0x62,0x4E,0x64,0x34,0x34,0x30,0x44,0x4F,0x30,0x2B,0x39,0x50,0x46,0x73,0x6E, + 0x4C,0x73,0x64,0x5A,0x41,0x2B,0x44,0x74,0x75,0x72,0x41,0x50,0x38,0x2F,0x41, + 0x66,0x63,0x4D,0x2F,0x4B,0x56,0x33,0x4D,0x4A,0x20,0x4E,0x68,0x55,0x64,0x68, + 0x7A,0x76,0x42,0x4C,0x70,0x69,0x4D,0x54,0x65,0x54,0x71,0x73,0x6D,0x44,0x74, + 0x47,0x6F,0x54,0x71,0x56,0x52,0x73,0x52,0x68,0x46,0x70,0x59,0x67,0x56,0x4E, + 0x46,0x72,0x6F,0x4C,0x39,0x50,0x6F,0x34,0x4D,0x42,0x67,0x34,0x33,0x4E,0x4C, + 0x79,0x53,0x7A,0x4E,0x57,0x48,0x53,0x7A,0x74,0x62,0x41,0x44,0x37,0x78,0x58, + 0x57,0x67,0x77,0x4D,0x50,0x67,0x6F,0x20,0x31,0x46,0x59,0x6E,0x73,0x58,0x53, + 0x71,0x76,0x78,0x76,0x30,0x77,0x31,0x69,0x45,0x2F,0x76,0x37,0x4C,0x5A,0x62, + 0x68,0x68,0x51,0x38,0x56,0x6D,0x65,0x47,0x4A,0x4E,0x44,0x62,0x6A,0x64,0x4F, + 0x64,0x62,0x53,0x46,0x4C,0x52,0x35,0x56,0x45,0x6E,0x6A,0x33,0x71,0x65,0x4F, + 0x44,0x7A,0x72,0x35,0x7A,0x36,0x57,0x4E,0x4A,0x51,0x44,0x74,0x2F,0x71,0x5A, + 0x76,0x6D,0x51,0x72,0x65,0x20,0x51,0x5A,0x48,0x57,0x4F,0x51,0x6E,0x56,0x50, + 0x33,0x34,0x4C,0x2B,0x73,0x5A,0x75,0x34,0x77,0x4A,0x66,0x59,0x62,0x65,0x7A, + 0x6C,0x62,0x68,0x4B,0x59,0x4E,0x76,0x36,0x70,0x32,0x46,0x74,0x57,0x62,0x57, + 0x54,0x6D,0x35,0x69,0x38,0x6A,0x4B,0x74,0x4A,0x74,0x2B,0x76,0x6F,0x6F,0x57, + 0x30,0x6E,0x52,0x68,0x77,0x37,0x4D,0x47,0x6A,0x4D,0x37,0x7A,0x61,0x58,0x30, + 0x46,0x47,0x64,0x20,0x39,0x70,0x55,0x79,0x33,0x6B,0x61,0x54,0x74,0x75,0x41, + 0x6E,0x55,0x77,0x6D,0x34,0x4D,0x64,0x51,0x42,0x39,0x38,0x5A,0x75,0x46,0x54, + 0x7A,0x34,0x57,0x70,0x49,0x45,0x50,0x6B,0x33,0x34,0x68,0x71,0x36,0x67,0x50, + 0x39,0x31,0x59,0x73,0x38,0x4F,0x49,0x71,0x36,0x7A,0x50,0x75,0x68,0x4F,0x70, + 0x39,0x33,0x52,0x66,0x72,0x6F,0x56,0x56,0x42,0x76,0x6A,0x34,0x31,0x70,0x76, + 0x72,0x20,0x33,0x63,0x6E,0x55,0x2B,0x79,0x6A,0x57,0x4C,0x71,0x74,0x67,0x73, + 0x65,0x51,0x30,0x42,0x76,0x38,0x79,0x52,0x42,0x4D,0x38,0x6C,0x2B,0x65,0x72, + 0x79,0x68,0x2B,0x44,0x37,0x59,0x2F,0x74,0x79,0x66,0x48,0x6F,0x61,0x44,0x51, + 0x66,0x32,0x48,0x6E,0x79,0x6C,0x48,0x56,0x4D,0x48,0x4F,0x71,0x73,0x4D,0x6F, + 0x41,0x6E,0x61,0x56,0x35,0x30,0x43,0x76,0x35,0x30,0x59,0x67,0x71,0x75,0x20, + 0x39,0x37,0x65,0x78,0x44,0x62,0x34,0x4F,0x5A,0x44,0x41,0x63,0x67,0x42,0x75, + 0x44,0x6C,0x79,0x47,0x6C,0x55,0x67,0x35,0x78,0x56,0x53,0x66,0x62,0x2F,0x45, + 0x30,0x43,0x67,0x49,0x4D,0x79,0x44,0x35,0x72,0x61,0x75,0x70,0x72,0x4F,0x34, + 0x5A,0x78,0x2B,0x36,0x45,0x48,0x44,0x2F,0x37,0x39,0x45,0x45,0x78,0x48,0x6F, + 0x48,0x47,0x6A,0x48,0x64,0x42,0x75,0x33,0x48,0x6D,0x4A,0x58,0x20,0x44,0x38, + 0x58,0x47,0x6F,0x57,0x76,0x34,0x43,0x72,0x36,0x44,0x4D,0x75,0x32,0x2B,0x4B, + 0x62,0x6A,0x51,0x37,0x6D,0x75,0x32,0x6A,0x63,0x2F,0x65,0x6B,0x62,0x61,0x46, + 0x52,0x51,0x62,0x34,0x70,0x4C,0x76,0x35,0x4B,0x52,0x7A,0x32,0x57,0x65,0x76, + 0x51,0x39,0x55,0x71,0x65,0x62,0x37,0x67,0x6A,0x50,0x64,0x64,0x61,0x6A,0x33, + 0x47,0x74,0x68,0x36,0x62,0x48,0x34,0x47,0x62,0x67,0x20,0x76,0x34,0x37,0x75, + 0x6D,0x51,0x62,0x4D,0x75,0x70,0x44,0x6C,0x65,0x4F,0x49,0x69,0x4E,0x72,0x49, + 0x41,0x77,0x47,0x58,0x43,0x37,0x2B,0x31,0x6A,0x56,0x4E,0x41,0x64,0x75,0x4D, + 0x59,0x36,0x37,0x64,0x74,0x39,0x2F,0x72,0x78,0x6C,0x4E,0x49,0x79,0x4C,0x55, + 0x6D,0x4E,0x4F,0x37,0x34,0x6E,0x55,0x62,0x71,0x2B,0x2F,0x2B,0x58,0x79,0x75, + 0x38,0x77,0x72,0x52,0x58,0x6E,0x41,0x41,0x20,0x63,0x71,0x58,0x2B,0x65,0x79, + 0x69,0x67,0x2F,0x6A,0x55,0x56,0x61,0x2B,0x6E,0x44,0x56,0x63,0x6C,0x51,0x31, + 0x4F,0x34,0x2F,0x50,0x68,0x6D,0x63,0x31,0x68,0x74,0x56,0x75,0x49,0x79,0x72, + 0x6F,0x41,0x43,0x38,0x43,0x2B,0x2B,0x36,0x63,0x64,0x58,0x73,0x75,0x46,0x57, + 0x4D,0x53,0x52,0x52,0x75,0x59,0x4C,0x7A,0x58,0x32,0x6C,0x78,0x55,0x64,0x62, + 0x31,0x47,0x6F,0x61,0x63,0x43,0x20,0x70,0x35,0x74,0x43,0x33,0x4B,0x58,0x45, + 0x4A,0x67,0x73,0x55,0x46,0x49,0x43,0x74,0x76,0x68,0x46,0x39,0x34,0x37,0x63, + 0x6D,0x4F,0x37,0x49,0x4B,0x65,0x6B,0x5A,0x76,0x73,0x48,0x6A,0x4F,0x7A,0x2F, + 0x5A,0x72,0x37,0x72,0x55,0x34,0x76,0x6E,0x6E,0x73,0x78,0x7A,0x55,0x4C,0x65, + 0x31,0x48,0x66,0x61,0x2F,0x56,0x64,0x65,0x4E,0x72,0x65,0x54,0x74,0x39,0x53, + 0x55,0x41,0x44,0x77,0x20,0x6F,0x66,0x6B,0x6E,0x31,0x69,0x45,0x50,0x68,0x2B, + 0x35,0x42,0x4A,0x44,0x35,0x6C,0x62,0x53,0x37,0x61,0x2B,0x6D,0x44,0x6F,0x4C, + 0x74,0x37,0x48,0x52,0x47,0x7A,0x2B,0x75,0x38,0x46,0x34,0x7A,0x64,0x5A,0x59, + 0x67,0x49,0x61,0x43,0x41,0x64,0x44,0x6D,0x61,0x7A,0x70,0x75,0x2F,0x66,0x58, + 0x72,0x78,0x36,0x66,0x2B,0x69,0x5A,0x34,0x43,0x79,0x4C,0x42,0x34,0x4A,0x76, + 0x57,0x59,0x20,0x50,0x6C,0x38,0x70,0x7A,0x4C,0x61,0x68,0x39,0x7A,0x52,0x30, + 0x64,0x50,0x35,0x75,0x53,0x33,0x59,0x72,0x66,0x61,0x31,0x67,0x41,0x42,0x67, + 0x47,0x76,0x47,0x67,0x64,0x37,0x73,0x68,0x6B,0x48,0x38,0x53,0x54,0x4D,0x57, + 0x74,0x7A,0x30,0x64,0x65,0x44,0x59,0x64,0x79,0x62,0x67,0x43,0x2B,0x76,0x72, + 0x43,0x58,0x70,0x39,0x76,0x7A,0x43,0x32,0x6B,0x5A,0x64,0x7A,0x2F,0x45,0x71, + 0x20,0x61,0x33,0x48,0x64,0x61,0x4F,0x31,0x73,0x72,0x6E,0x57,0x35,0x34,0x61, + 0x44,0x56,0x79,0x73,0x44,0x45,0x48,0x57,0x74,0x54,0x56,0x6E,0x33,0x6E,0x78, + 0x75,0x64,0x67,0x30,0x37,0x71,0x76,0x34,0x55,0x61,0x4E,0x44,0x54,0x41,0x53, + 0x75,0x67,0x6B,0x39,0x67,0x58,0x59,0x59,0x47,0x50,0x4E,0x6E,0x39,0x58,0x6E, + 0x55,0x79,0x75,0x71,0x79,0x4B,0x74,0x69,0x31,0x38,0x54,0x42,0x73,0x20,0x71, + 0x74,0x71,0x4E,0x64,0x2B,0x39,0x44,0x30,0x44,0x64,0x36,0x48,0x61,0x39,0x2F, + 0x46,0x59,0x47,0x30,0x70,0x2B,0x2B,0x35,0x32,0x74,0x41,0x33,0x68,0x49,0x4F, + 0x68,0x58,0x71,0x68,0x5A,0x5A,0x33,0x32,0x72,0x72,0x62,0x36,0x4E,0x31,0x2F, + 0x72,0x5A,0x58,0x4B,0x2B,0x33,0x6B,0x50,0x30,0x4C,0x38,0x69,0x37,0x41,0x32, + 0x39,0x56,0x30,0x46,0x6C,0x2B,0x64,0x6E,0x4D,0x73,0x63,0x20,0x53,0x43,0x67, + 0x61,0x68,0x45,0x35,0x63,0x53,0x6E,0x55,0x71,0x4B,0x7A,0x77,0x72,0x34,0x62, + 0x76,0x31,0x72,0x38,0x48,0x6A,0x46,0x54,0x74,0x73,0x68,0x2B,0x2F,0x65,0x76, + 0x77,0x4B,0x58,0x50,0x6E,0x31,0x6A,0x58,0x6F,0x48,0x61,0x58,0x39,0x4D,0x49, + 0x68,0x33,0x61,0x38,0x61,0x4C,0x74,0x32,0x4E,0x42,0x47,0x43,0x76,0x33,0x2F, + 0x32,0x61,0x2B,0x68,0x46,0x45,0x4F,0x5A,0x62,0x20,0x33,0x50,0x67,0x4B,0x65, + 0x65,0x2F,0x57,0x42,0x74,0x43,0x76,0x6B,0x6A,0x4F,0x4C,0x71,0x64,0x54,0x75, + 0x67,0x37,0x74,0x4F,0x4F,0x36,0x38,0x63,0x5A,0x58,0x5A,0x63,0x70,0x4F,0x38, + 0x46,0x6D,0x51,0x4C,0x77,0x62,0x64,0x39,0x68,0x36,0x33,0x67,0x43,0x6B,0x77, + 0x50,0x57,0x70,0x6E,0x54,0x39,0x59,0x63,0x48,0x58,0x48,0x62,0x5A,0x55,0x66, + 0x7A,0x30,0x4E,0x68,0x2B,0x37,0x33,0x20,0x4B,0x4F,0x57,0x35,0x48,0x54,0x39, + 0x79,0x44,0x4C,0x36,0x2B,0x56,0x6D,0x6C,0x4A,0x42,0x58,0x78,0x6E,0x37,0x36, + 0x75,0x67,0x4D,0x38,0x39,0x38,0x69,0x33,0x34,0x63,0x31,0x46,0x4F,0x42,0x74, + 0x62,0x67,0x4E,0x34,0x36,0x69,0x31,0x6A,0x62,0x4A,0x65,0x45,0x41,0x44,0x77, + 0x6A,0x78,0x5A,0x48,0x72,0x49,0x50,0x4D,0x74,0x62,0x48,0x44,0x2B,0x73,0x76, + 0x58,0x76,0x30,0x72,0x39,0x20,0x71,0x39,0x65,0x66,0x4D,0x30,0x56,0x6E,0x42, + 0x74,0x31,0x76,0x72,0x68,0x44,0x6F,0x77,0x4F,0x36,0x72,0x2B,0x66,0x37,0x4D, + 0x5A,0x64,0x4B,0x66,0x2B,0x74,0x72,0x44,0x6F,0x65,0x78,0x70,0x35,0x65,0x69, + 0x65,0x6C,0x78,0x63,0x45,0x67,0x6A,0x48,0x63,0x70,0x32,0x67,0x74,0x6D,0x41, + 0x6D,0x66,0x74,0x37,0x5A,0x52,0x31,0x73,0x6E,0x76,0x41,0x64,0x70,0x38,0x4C, + 0x66,0x67,0x33,0x20,0x4C,0x53,0x6A,0x4C,0x48,0x47,0x51,0x6B,0x50,0x6D,0x6E, + 0x62,0x71,0x61,0x75,0x50,0x36,0x39,0x53,0x63,0x6D,0x66,0x5A,0x31,0x59,0x50, + 0x37,0x73,0x66,0x53,0x57,0x64,0x37,0x71,0x32,0x5A,0x51,0x66,0x63,0x37,0x39, + 0x73,0x78,0x5A,0x75,0x48,0x67,0x35,0x76,0x36,0x65,0x72,0x36,0x6C,0x57,0x62, + 0x6F,0x4B,0x48,0x75,0x52,0x4B,0x59,0x62,0x38,0x4C,0x64,0x72,0x35,0x36,0x42, + 0x72,0x20,0x38,0x4B,0x4E,0x30,0x32,0x2B,0x34,0x74,0x4C,0x38,0x41,0x33,0x36, + 0x37,0x35,0x34,0x67,0x61,0x66,0x37,0x6A,0x6B,0x37,0x65,0x77,0x51,0x32,0x6E, + 0x66,0x56,0x6E,0x6E,0x7A,0x4B,0x55,0x79,0x67,0x54,0x75,0x55,0x37,0x63,0x58, + 0x34,0x68,0x72,0x32,0x4E,0x72,0x6F,0x55,0x2B,0x41,0x78,0x6A,0x4B,0x52,0x76, + 0x78,0x45,0x64,0x4E,0x51,0x32,0x59,0x6E,0x31,0x54,0x6C,0x6A,0x6B,0x76,0x20, + 0x36,0x31,0x2F,0x38,0x54,0x50,0x42,0x31,0x5A,0x33,0x31,0x7A,0x70,0x75,0x75, + 0x5A,0x76,0x31,0x59,0x39,0x48,0x58,0x79,0x35,0x30,0x6E,0x36,0x66,0x59,0x4C, + 0x73,0x34,0x4E,0x74,0x54,0x58,0x2F,0x69,0x43,0x64,0x34,0x6D,0x65,0x4F,0x5A, + 0x51,0x5A,0x66,0x74,0x33,0x31,0x32,0x39,0x78,0x2F,0x77,0x6E,0x38,0x36,0x6D, + 0x6D,0x63,0x50,0x70,0x76,0x6E,0x75,0x65,0x50,0x50,0x61,0x67,0x20,0x2F,0x69, + 0x68,0x66,0x39,0x48,0x5A,0x30,0x2F,0x57,0x6F,0x37,0x75,0x36,0x6A,0x4B,0x74, + 0x70,0x76,0x6E,0x36,0x37,0x4C,0x62,0x36,0x47,0x72,0x30,0x41,0x41,0x44,0x73, + 0x73,0x77,0x34,0x76,0x48,0x50,0x30,0x69,0x6E,0x56,0x75,0x50,0x7A,0x64,0x54, + 0x2F,0x65,0x75,0x56,0x58,0x74,0x68,0x73,0x39,0x44,0x63,0x47,0x6C,0x71,0x36, + 0x39,0x6E,0x54,0x51,0x65,0x54,0x30,0x66,0x73,0x7A,0x20,0x70,0x2B,0x54,0x39, + 0x32,0x54,0x33,0x30,0x77,0x59,0x4E,0x66,0x66,0x75,0x5A,0x4A,0x47,0x67,0x4A, + 0x39,0x62,0x4B,0x61,0x45,0x48,0x46,0x4C,0x34,0x7A,0x4C,0x46,0x38,0x50,0x35, + 0x31,0x32,0x4C,0x52,0x74,0x4A,0x34,0x35,0x6C,0x38,0x7A,0x31,0x2F,0x6F,0x66, + 0x75,0x52,0x54,0x67,0x41,0x46,0x71,0x47,0x38,0x35,0x37,0x57,0x53,0x57,0x4B, + 0x75,0x33,0x32,0x73,0x5A,0x52,0x4C,0x54,0x20,0x35,0x56,0x38,0x36,0x58,0x6F, + 0x56,0x74,0x6A,0x39,0x66,0x44,0x72,0x57,0x46,0x76,0x7A,0x73,0x63,0x39,0x33, + 0x65,0x39,0x50,0x62,0x62,0x2B,0x45,0x72,0x36,0x7A,0x66,0x44,0x34,0x48,0x4A, + 0x58,0x74,0x44,0x31,0x66,0x4D,0x6F,0x2F,0x72,0x37,0x66,0x41,0x52,0x47,0x51, + 0x6F,0x33,0x62,0x58,0x39,0x39,0x73,0x57,0x63,0x70,0x2B,0x68,0x2B,0x67,0x64, + 0x42,0x74,0x2F,0x45,0x4E,0x4A,0x20,0x47,0x48,0x77,0x44,0x48,0x2B,0x62,0x73, + 0x6C,0x2B,0x2B,0x42,0x69,0x43,0x30,0x44,0x34,0x4A,0x6D,0x47,0x71,0x32,0x41, + 0x5A,0x67,0x42,0x77,0x41,0x44,0x4C,0x37,0x31,0x59,0x64,0x68,0x78,0x6B,0x55, + 0x51,0x4C,0x71,0x68,0x2B,0x2F,0x38,0x6E,0x6B,0x45,0x30,0x2F,0x50,0x79,0x58, + 0x4F,0x64,0x6D,0x6E,0x54,0x30,0x2B,0x38,0x76,0x39,0x78,0x31,0x72,0x6A,0x70, + 0x66,0x67,0x38,0x44,0x20,0x5A,0x4E,0x59,0x4C,0x57,0x44,0x72,0x45,0x48,0x4A, + 0x61,0x46,0x63,0x54,0x2F,0x68,0x64,0x6B,0x73,0x33,0x73,0x69,0x72,0x70,0x46, + 0x4E,0x44,0x52,0x38,0x64,0x5A,0x4B,0x48,0x46,0x6C,0x46,0x35,0x75,0x68,0x4D, + 0x66,0x44,0x78,0x4B,0x6D,0x63,0x6E,0x4D,0x70,0x69,0x58,0x39,0x50,0x65,0x61, + 0x38,0x30,0x72,0x6D,0x35,0x55,0x49,0x4D,0x6D,0x42,0x53,0x43,0x32,0x31,0x72, + 0x54,0x39,0x20,0x72,0x53,0x5A,0x6C,0x70,0x67,0x6F,0x31,0x39,0x6F,0x4C,0x59, + 0x54,0x53,0x6B,0x37,0x37,0x4A,0x67,0x56,0x62,0x62,0x70,0x51,0x4F,0x55,0x63, + 0x4B,0x67,0x43,0x65,0x5A,0x4C,0x4C,0x63,0x4F,0x7A,0x48,0x51,0x51,0x78,0x4E, + 0x70,0x6E,0x4B,0x64,0x57,0x64,0x67,0x44,0x63,0x41,0x4C,0x4B,0x2F,0x45,0x36, + 0x55,0x5A,0x4D,0x43,0x6B,0x42,0x4B,0x32,0x55,0x6C,0x33,0x45,0x6F,0x52,0x75, + 0x20,0x2B,0x47,0x4B,0x4A,0x46,0x41,0x43,0x52,0x6D,0x35,0x38,0x43,0x41,0x67, 0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D, - 0x41,0x44,0x41,0x20,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C, - 0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B, - 0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41, + 0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A, + 0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E, + 0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x20,0x41, 0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36, 0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61, - 0x6B,0x20,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38, - 0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A, - 0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39, + 0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49, + 0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41, + 0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x20,0x4E,0x7A,0x39, 0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73, - 0x33,0x50,0x32,0x50,0x38,0x41,0x43,0x2F,0x6B,0x64,0x31,0x2F,0x36,0x61,0x20, - 0x4B,0x5A,0x63,0x41,0x41,0x41,0x41,0x41,0x53,0x55,0x56,0x4F,0x52,0x4B,0x35, - 0x43,0x59,0x49,0x49,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6C, - 0x6F,0x76,0x65,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B, - 0x20,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,0x42,0x41,0x43,0x41,0x59,0x41,0x41,0x41,0x44,0x31,0x58,0x61,0x6D,0x2B, - 0x41,0x41,0x41,0x41,0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73, - 0x54,0x41,0x41,0x41,0x4C,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x20,0x41, - 0x41,0x41,0x4C,0x79,0x30,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x63, - 0x6A,0x31,0x58,0x63,0x4F,0x68,0x50,0x46,0x58,0x39,0x37,0x35,0x43,0x6E,0x41, - 0x71,0x69,0x4B,0x6B,0x67,0x70,0x6F,0x4B,0x59,0x43,0x6C,0x67,0x71,0x77,0x46, - 0x54,0x41,0x70,0x67,0x4B,0x57,0x43,0x69,0x41,0x56,0x73,0x46,0x54,0x41,0x70, - 0x67,0x4A,0x4D,0x42,0x66,0x47,0x72,0x41,0x4B,0x55,0x43,0x20,0x33,0x45,0x47, - 0x2B,0x33,0x30,0x33,0x73,0x39,0x35,0x54,0x42,0x33,0x6A,0x39,0x67,0x37,0x32, - 0x36,0x51,0x37,0x6A,0x6B,0x33,0x6D,0x68,0x6C,0x4A,0x4D,0x2F,0x4A,0x49,0x6D, - 0x76,0x58,0x75,0x79,0x65,0x48,0x64,0x6A,0x78,0x38,0x2F,0x2F,0x6F,0x71,0x49, - 0x47,0x59,0x67,0x5A,0x43,0x44,0x4D,0x44,0x66,0x34,0x66,0x35,0x32,0x50,0x47, - 0x70,0x59,0x77,0x5A,0x69,0x42,0x70,0x53,0x42,0x20,0x57,0x41,0x44,0x69,0x4F, - 0x59,0x67,0x5A,0x43,0x44,0x67,0x44,0x73,0x51,0x41,0x45,0x76,0x50,0x6E,0x78, - 0x30,0x57,0x4D,0x47,0x59,0x67,0x47,0x49,0x5A,0x79,0x42,0x6D,0x49,0x4F,0x41, - 0x4D,0x78,0x41,0x49,0x51,0x38,0x4F,0x62,0x48,0x52,0x34,0x38,0x5A,0x69,0x41, - 0x55,0x67,0x6E,0x6F,0x47,0x59,0x67,0x59,0x41,0x7A,0x38,0x4C,0x2B,0x41,0x6E, - 0x2F,0x31,0x50,0x65,0x2F,0x53,0x4D,0x20,0x42,0x65,0x66,0x51,0x77,0x52,0x4C, - 0x57,0x4D,0x4F,0x4B,0x76,0x76,0x35,0x51,0x58,0x4D,0x54,0x58,0x4A,0x63,0x4F, - 0x68,0x69,0x43,0x53,0x4E,0x36,0x4D,0x68,0x41,0x4C,0x51,0x45,0x39,0x69,0x39, - 0x73,0x69,0x63,0x73,0x4A,0x59,0x37,0x6D,0x48,0x74,0x72,0x30,0x75,0x55,0x2F, - 0x67,0x70,0x56,0x6E,0x43,0x30,0x6E,0x4D,0x65,0x64,0x68,0x54,0x4F,0x49,0x48, - 0x4B,0x7A,0x79,0x6F,0x73,0x20,0x47,0x50,0x41,0x56,0x7A,0x6C,0x63,0x4E,0x44, - 0x4B,0x30,0x2F,0x66,0x67,0x58,0x59,0x2F,0x59,0x35,0x66,0x73,0x59,0x51,0x6E, - 0x71,0x50,0x2B,0x52,0x70,0x56,0x61,0x36,0x44,0x2B,0x6D,0x35,0x62,0x30,0x44, - 0x57,0x6F,0x62,0x39,0x76,0x57,0x74,0x50,0x31,0x70,0x74,0x57,0x73,0x65,0x57, - 0x34,0x39,0x65,0x77,0x48,0x58,0x75,0x66,0x77,0x4D,0x2B,0x31,0x6B,0x6F,0x62, - 0x6D,0x67,0x66,0x20,0x59,0x51,0x45,0x6A,0x6D,0x67,0x7A,0x45,0x41,0x72,0x44, - 0x62,0x6F,0x36,0x44,0x4C,0x50,0x59,0x58,0x74,0x51,0x56,0x59,0x72,0x58,0x59, - 0x65,0x31,0x52,0x64,0x45,0x4B,0x70,0x74,0x58,0x59,0x33,0x4E,0x6A,0x2B,0x4A, - 0x46,0x58,0x50,0x2B,0x61,0x4E,0x68,0x73,0x63,0x62,0x43,0x5A,0x34,0x7A,0x35, - 0x42,0x6E,0x50,0x34,0x55,0x71,0x52,0x4D,0x56,0x47,0x37,0x76,0x6F,0x66,0x49, - 0x58,0x20,0x50,0x4E,0x37,0x46,0x2F,0x77,0x71,0x38,0x73,0x7A,0x4F,0x67,0x41, - 0x2F,0x69,0x30,0x4A,0x50,0x6F,0x42,0x66,0x51,0x37,0x71,0x6B,0x76,0x54,0x68, - 0x6B,0x6F,0x35,0x5A,0x58,0x2B,0x65,0x65,0x32,0x78,0x39,0x5A,0x58,0x39,0x71, - 0x73,0x73,0x61,0x5A,0x39,0x33,0x38,0x69,0x32,0x55,0x5A,0x37,0x75,0x59,0x47, - 0x34,0x37,0x47,0x72,0x32,0x69,0x4C,0x65,0x46,0x33,0x4B,0x46,0x6C,0x49,0x20, - 0x47,0x33,0x36,0x69,0x7A,0x57,0x45,0x58,0x46,0x50,0x4D,0x49,0x74,0x6E,0x4F, - 0x36,0x78,0x72,0x78,0x35,0x57,0x2F,0x77,0x4E,0x59,0x48,0x64,0x62,0x6E,0x4B, - 0x30,0x49,0x6E,0x64,0x4C,0x76,0x6F,0x41,0x35,0x71,0x41,0x72,0x74,0x51,0x64, - 0x68,0x6E,0x2F,0x41,0x4A,0x75,0x65,0x50,0x56,0x31,0x6A,0x6E,0x58,0x70,0x75, - 0x66,0x56,0x70,0x72,0x76,0x4D,0x55,0x63,0x77,0x79,0x56,0x30,0x20,0x63,0x42, - 0x6C,0x53,0x4F,0x67,0x74,0x34,0x44,0x76,0x30,0x38,0x74,0x72,0x36,0x44,0x4C, - 0x67,0x4A,0x2F,0x6B,0x35,0x53,0x49,0x33,0x57,0x53,0x67,0x58,0x6A,0x50,0x73, - 0x6C,0x35,0x35,0x78,0x46,0x66,0x61,0x79,0x70,0x32,0x2F,0x66,0x7A,0x62,0x6C, - 0x5A,0x34,0x4D,0x4C,0x6F,0x72,0x58,0x71,0x44,0x6B,0x4C,0x56,0x4B,0x30,0x2B, - 0x71,0x35,0x44,0x2B,0x45,0x5A,0x64,0x48,0x41,0x56,0x20,0x48,0x41,0x4E,0x6D, - 0x38,0x41,0x44,0x61,0x4F,0x41,0x6B,0x32,0x78,0x51,0x67,0x57,0x73,0x51,0x44, - 0x73,0x62,0x75,0x74,0x31,0x6B,0x4D,0x55,0x75,0x4F,0x49,0x78,0x6C,0x30,0x7A, - 0x47,0x6A,0x31,0x53,0x64,0x64,0x33,0x65,0x68,0x71,0x53,0x71,0x68,0x50,0x72, - 0x6B,0x32,0x51,0x4D,0x7A,0x6A,0x64,0x5A,0x4D,0x4B,0x49,0x59,0x30,0x2B,0x4E, - 0x62,0x2F,0x31,0x43,0x62,0x7A,0x48,0x46,0x20,0x4D,0x44,0x46,0x47,0x35,0x55, - 0x76,0x50,0x72,0x58,0x5A,0x54,0x31,0x45,0x77,0x34,0x67,0x58,0x4D,0x7A,0x4D, - 0x55,0x4F,0x66,0x47,0x56,0x73,0x77,0x61,0x76,0x77,0x4E,0x59,0x4C,0x64,0x62, - 0x72,0x63,0x4F,0x6E,0x37,0x37,0x65,0x70,0x74,0x77,0x79,0x48,0x72,0x49,0x50, - 0x61,0x64,0x63,0x68,0x54,0x37,0x41,0x35,0x75,0x69,0x6D,0x39,0x4D,0x55,0x4B, - 0x77,0x61,0x36,0x74,0x50,0x54,0x20,0x77,0x56,0x30,0x68,0x49,0x66,0x43,0x54, - 0x43,0x66,0x34,0x65,0x58,0x57,0x74,0x72,0x6F,0x54,0x47,0x50,0x55,0x47,0x32, - 0x4C,0x43,0x6B,0x47,0x58,0x33,0x78,0x2F,0x58,0x39,0x6D,0x33,0x61,0x36,0x6C, - 0x4F,0x2F,0x38,0x43,0x62,0x4A,0x70,0x39,0x59,0x51,0x48,0x47,0x49,0x42,0x32, - 0x49,0x38,0x74,0x6E,0x37,0x43,0x4D,0x44,0x44,0x71,0x34,0x67,0x44,0x71,0x51, - 0x51,0x79,0x48,0x48,0x20,0x30,0x62,0x33,0x6E,0x72,0x45,0x54,0x57,0x52,0x64, - 0x6F,0x56,0x43,0x67,0x4C,0x72,0x41,0x72,0x62,0x51,0x38,0x36,0x72,0x67,0x2B, - 0x65,0x69,0x36,0x6F,0x41,0x63,0x4D,0x47,0x43,0x6F,0x76,0x43,0x62,0x34,0x65, - 0x6F,0x64,0x6F,0x57,0x79,0x6B,0x6E,0x5A,0x4B,0x71,0x47,0x30,0x38,0x55,0x66, - 0x41,0x2F,0x64,0x68,0x70,0x58,0x51,0x4A,0x52,0x53,0x4F,0x45,0x45,0x66,0x6D, - 0x70,0x6B,0x20,0x48,0x64,0x49,0x4D,0x43,0x75,0x58,0x50,0x66,0x33,0x2B,0x39, - 0x48,0x54,0x77,0x30,0x65,0x74,0x33,0x59,0x2B,0x68,0x72,0x62,0x6E,0x7A,0x4E, - 0x77,0x41,0x68,0x64,0x39,0x45,0x30,0x61,0x32,0x48,0x78,0x76,0x2F,0x65,0x67, - 0x34,0x66,0x43,0x59,0x72,0x57,0x35,0x2B,0x4D,0x7A,0x53,0x75,0x30,0x62,0x58, - 0x69,0x6E,0x4C,0x31,0x78,0x78,0x4F,0x50,0x54,0x38,0x35,0x63,0x75,0x6E,0x70, - 0x20,0x51,0x59,0x6A,0x78,0x44,0x57,0x42,0x2F,0x74,0x72,0x6C,0x67,0x4B,0x65, - 0x63,0x77,0x32,0x33,0x42,0x4A,0x63,0x38,0x62,0x66,0x77,0x68,0x4C,0x32,0x34, - 0x59,0x36,0x4F,0x69,0x64,0x65,0x70,0x43,0x33,0x41,0x41,0x31,0x57,0x34,0x62, - 0x50,0x30,0x78,0x41,0x72,0x63,0x4E,0x35,0x74,0x67,0x4A,0x5A,0x62,0x77,0x41, - 0x74,0x48,0x49,0x4C,0x47,0x44,0x49,0x30,0x70,0x44,0x71,0x38,0x38,0x20,0x70, - 0x35,0x66,0x49,0x4D,0x30,0x38,0x50,0x51,0x6F,0x77,0x2F,0x41,0x75,0x35,0x2B, - 0x6D,0x33,0x55,0x78,0x39,0x54,0x71,0x71,0x51,0x35,0x2B,0x39,0x59,0x44,0x6B, - 0x46,0x63,0x2B,0x36,0x68,0x4C,0x6E,0x6B,0x4B,0x75,0x32,0x41,0x2F,0x51,0x52, - 0x4D,0x47,0x58,0x58,0x51,0x4E,0x48,0x4E,0x6D,0x6D,0x5A,0x2F,0x56,0x52,0x6F, - 0x54,0x6A,0x66,0x67,0x48,0x78,0x73,0x39,0x43,0x39,0x47,0x20,0x48,0x30,0x70, - 0x56,0x44,0x6F,0x4A,0x48,0x4C,0x41,0x43,0x37,0x4F,0x77,0x49,0x36,0x67,0x4C, - 0x71,0x30,0x79,0x79,0x37,0x75,0x4A,0x71,0x76,0x54,0x35,0x66,0x6F,0x47,0x69, - 0x34,0x35,0x4A,0x44,0x70,0x75,0x39,0x53,0x46,0x4E,0x73,0x4B,0x64,0x77,0x6D, - 0x37,0x4F,0x55,0x75,0x4F,0x34,0x4C,0x72,0x4F,0x58,0x77,0x73,0x66,0x47,0x56, - 0x41,0x2B,0x65,0x4F,0x41,0x76,0x76,0x35,0x59,0x20,0x56,0x2F,0x45,0x72,0x77, - 0x47,0x36,0x32,0x4C,0x69,0x47,0x73,0x50,0x72,0x57,0x7A,0x6E,0x76,0x41,0x36, - 0x39,0x41,0x2B,0x77,0x67,0x69,0x58,0x30,0x6B,0x61,0x4E,0x6F,0x33,0x6D,0x6E, - 0x54,0x30,0x6A,0x7A,0x44,0x47,0x5A,0x62,0x35,0x4D,0x2B,0x75,0x76,0x4E,0x34, - 0x33,0x55,0x73,0x35,0x66,0x49,0x52,0x35,0x34,0x2B,0x74,0x76,0x68,0x45,0x67, - 0x4D,0x51,0x4C,0x63,0x6F,0x69,0x73,0x20,0x5A,0x32,0x79,0x68,0x35,0x31,0x49, - 0x52,0x61,0x36,0x45,0x2B,0x6A,0x52,0x6B,0x61,0x4E,0x6F,0x37,0x38,0x4B,0x77, - 0x2B,0x6C,0x68,0x4B,0x43,0x67,0x2F,0x77,0x6F,0x63,0x47,0x42,0x4F,0x65,0x64, - 0x77,0x70,0x6E,0x4D,0x4E,0x33,0x42,0x73,0x79,0x76,0x2B,0x4E,0x32,0x6A,0x78, - 0x68,0x45,0x46,0x72,0x55,0x76,0x2B,0x36,0x65,0x36,0x4C,0x31,0x33,0x38,0x45, - 0x75,0x46,0x42,0x69,0x74,0x20,0x6E,0x37,0x78,0x6A,0x59,0x4E,0x63,0x34,0x4F, - 0x32,0x38,0x49,0x33,0x63,0x5A,0x2B,0x58,0x47,0x4E,0x39,0x4E,0x78,0x31,0x6A, - 0x68,0x6C,0x69,0x4C,0x7A,0x58,0x2F,0x58,0x57,0x6F,0x61,0x49,0x73,0x2F,0x63, - 0x2B,0x51,0x76,0x77,0x4B,0x63,0x45,0x57,0x46,0x46,0x2F,0x55,0x64,0x32,0x50, - 0x2B,0x30,0x32,0x56,0x62,0x68,0x37,0x2F,0x72,0x6B,0x4C,0x77,0x6D,0x75,0x54, - 0x37,0x6F,0x5A,0x20,0x72,0x4F,0x47,0x36,0x63,0x41,0x77,0x38,0x61,0x57,0x6A, - 0x6E,0x33,0x57,0x44,0x50,0x6F,0x59,0x38,0x53,0x5A,0x65,0x45,0x62,0x6B,0x4A, - 0x57,0x4C,0x78,0x4E,0x6A,0x47,0x55,0x49,0x2B,0x4E,0x30,0x39,0x4C,0x6F,0x55, - 0x6E,0x4E,0x6A,0x2B,0x32,0x37,0x30,0x49,0x56,0x54,0x6C,0x4A,0x54,0x4F,0x4F, - 0x62,0x6F,0x30,0x65,0x6A,0x42,0x70,0x69,0x41,0x5A,0x68,0x34,0x75,0x37,0x75, - 0x4E,0x20,0x67,0x2B,0x2B,0x46,0x2B,0x33,0x6E,0x42,0x37,0x65,0x47,0x62,0x4D, - 0x30,0x43,0x76,0x6E,0x77,0x36,0x2B,0x46,0x41,0x73,0x6D,0x79,0x6B,0x64,0x74, - 0x48,0x4F,0x69,0x77,0x32,0x32,0x66,0x38,0x62,0x4D,0x61,0x70,0x2F,0x38,0x4C, - 0x4D,0x47,0x30,0x4F,0x64,0x47,0x4B,0x64,0x66,0x6A,0x54,0x36,0x32,0x71,0x75, - 0x64,0x55,0x50,0x67,0x6F,0x54,0x71,0x45,0x4B,0x66,0x47,0x56,0x73,0x77,0x20, - 0x61,0x6D,0x67,0x46,0x51,0x49,0x64,0x41,0x62,0x4F,0x46,0x61,0x59,0x51,0x74, - 0x74,0x53,0x67,0x78,0x37,0x30,0x65,0x62,0x59,0x7A,0x75,0x41,0x51,0x30,0x45, - 0x46,0x57,0x45,0x66,0x43,0x52,0x6F,0x6B,0x78,0x39,0x41,0x37,0x4B,0x44,0x58, - 0x34,0x78,0x4E,0x59,0x7A,0x4A,0x6A,0x47,0x31,0x4B,0x56,0x37,0x39,0x52,0x7A, - 0x57,0x43,0x4D,0x76,0x50,0x48,0x31,0x73,0x55,0x66,0x48,0x76,0x20,0x59,0x57, - 0x45,0x43,0x61,0x52,0x31,0x36,0x67,0x77,0x6F,0x57,0x6F,0x52,0x55,0x41,0x48, - 0x51,0x51,0x66,0x7A,0x6C,0x64,0x47,0x6C,0x75,0x33,0x6C,0x56,0x32,0x78,0x39, - 0x47,0x67,0x2B,0x4A,0x43,0x6D,0x65,0x58,0x78,0x75,0x45,0x35,0x65,0x6D,0x4A, - 0x73,0x4D,0x33,0x53,0x4E,0x39,0x61,0x46,0x50,0x78,0x37,0x46,0x77,0x61,0x68, - 0x77,0x76,0x6A,0x4E,0x36,0x71,0x64,0x53,0x73,0x4D,0x20,0x31,0x4B,0x62,0x34, - 0x30,0x58,0x50,0x70,0x71,0x31,0x34,0x47,0x66,0x53,0x69,0x57,0x43,0x71,0x62, - 0x7A,0x6A,0x61,0x48,0x4A,0x6F,0x52,0x57,0x41,0x31,0x47,0x7A,0x77,0x67,0x39, - 0x48,0x48,0x55,0x68,0x4D,0x63,0x46,0x38,0x62,0x35,0x47,0x66,0x72,0x51,0x42, - 0x31,0x34,0x68,0x5A,0x74,0x44,0x42,0x46,0x6C,0x32,0x78,0x31,0x57,0x65,0x4C, - 0x54,0x34,0x5A,0x74,0x32,0x6B,0x34,0x61,0x20,0x75,0x4A,0x30,0x59,0x66,0x31, - 0x2B,0x4E,0x33,0x71,0x70,0x56,0x4B,0x7A,0x54,0x74,0x42,0x36,0x4F,0x76,0x71, - 0x2B,0x70,0x5A,0x64,0x50,0x45,0x66,0x59,0x51,0x45,0x74,0x46,0x45,0x65,0x58, - 0x33,0x38,0x61,0x7A,0x34,0x39,0x36,0x38,0x48,0x6E,0x6F,0x42,0x32,0x4E,0x59, - 0x47,0x46,0x79,0x61,0x51,0x44,0x6C,0x35,0x70,0x62,0x45,0x4F,0x71,0x6C,0x38, - 0x62,0x5A,0x71,0x64,0x47,0x6C,0x20,0x6C,0x6E,0x41,0x4F,0x66,0x56,0x79,0x67, - 0x70,0x4C,0x35,0x68,0x41,0x48,0x6C,0x69,0x66,0x4E,0x62,0x6F,0x69,0x78,0x36, - 0x2F,0x7A,0x74,0x68,0x7A,0x6F,0x36,0x39,0x53,0x4D,0x77,0x62,0x6F,0x30,0x31, - 0x34,0x73,0x59,0x42,0x65,0x75,0x4D,0x63,0x62,0x4C,0x33,0x32,0x51,0x6D,0x74, - 0x41,0x4A,0x67,0x44,0x30,0x52,0x70,0x44,0x53,0x50,0x70,0x6E,0x34,0x7A,0x66, - 0x57,0x36,0x4D,0x50,0x20,0x72,0x64,0x6F,0x4C,0x70,0x6F,0x75,0x52,0x64,0x67, - 0x54,0x52,0x57,0x30,0x44,0x74,0x32,0x52,0x50,0x6B,0x4B,0x30,0x38,0x66,0x51, - 0x6A,0x77,0x32,0x54,0x75,0x7A,0x61,0x2F,0x47,0x36,0x48,0x49,0x72,0x5A,0x49, - 0x45,0x62,0x54,0x32,0x64,0x58,0x48,0x48,0x77,0x4C,0x37,0x78,0x46,0x58,0x32, - 0x36,0x2B,0x50,0x61,0x5A,0x31,0x2F,0x58,0x39,0x4A,0x73,0x65,0x46,0x56,0x67, - 0x41,0x2B,0x20,0x37,0x6D,0x67,0x58,0x63,0x78,0x4E,0x33,0x32,0x53,0x55,0x77, - 0x51,0x31,0x2B,0x6B,0x31,0x73,0x79,0x79,0x4D,0x62,0x49,0x4F,0x54,0x78,0x70, - 0x6E,0x76,0x77,0x70,0x4D,0x73,0x49,0x6C,0x44,0x49,0x4D,0x47,0x4A,0x39,0x64, - 0x58,0x33,0x2B,0x74,0x2F,0x47,0x4B,0x31,0x75,0x68,0x61,0x63,0x2B,0x4E,0x76, - 0x71,0x6E,0x71,0x6D,0x48,0x41,0x47,0x44,0x32,0x45,0x4A,0x49,0x37,0x77,0x4D, - 0x20,0x68,0x46,0x59,0x41,0x64,0x43,0x43,0x33,0x44,0x63,0x58,0x30,0x34,0x39, - 0x62,0x6F,0x62,0x67,0x75,0x4C,0x65,0x44,0x41,0x78,0x4D,0x71,0x4F,0x33,0x36, - 0x68,0x79,0x68,0x62,0x4A,0x57,0x6D,0x76,0x61,0x48,0x31,0x31,0x32,0x79,0x36, - 0x31,0x31,0x59,0x6E,0x78,0x6F,0x39,0x44,0x58,0x36,0x79,0x59,0x66,0x57,0x76, - 0x36,0x43,0x2F,0x54,0x55,0x32,0x50,0x72,0x55,0x53,0x36,0x39,0x44,0x20,0x63, - 0x59,0x37,0x67,0x41,0x5A,0x7A,0x44,0x69,0x49,0x34,0x4D,0x68,0x46,0x59,0x41, - 0x4F,0x6C,0x49,0x77,0x75,0x69,0x6B,0x7A,0x45,0x53,0x71,0x6A,0x6A,0x36,0x58, - 0x61,0x4F,0x4D,0x76,0x65,0x66,0x73,0x35,0x59,0x52,0x4F,0x30,0x74,0x4A,0x45, - 0x46,0x57,0x45,0x58,0x67,0x74,0x54,0x6F,0x32,0x44,0x68,0x64,0x47,0x37,0x31, - 0x42,0x4B,0x6A,0x4D,0x78,0x31,0x58,0x52,0x75,0x39,0x54,0x20,0x35,0x33,0x53, - 0x38,0x61,0x33,0x68,0x43,0x57,0x38,0x4B,0x49,0x4A,0x52,0x6D,0x49,0x42,0x57, - 0x42,0x4A,0x63,0x74,0x35,0x59,0x6C,0x79,0x35,0x31,0x48,0x78,0x77,0x64,0x6C, - 0x36,0x5A,0x7A,0x67,0x69,0x36,0x2B,0x46,0x43,0x6B,0x54,0x63,0x7A,0x50,0x35, - 0x69,0x39,0x48,0x37,0x31,0x4D,0x2B,0x6D,0x51,0x2B,0x73,0x6F,0x6A,0x47,0x30, - 0x49,0x4E,0x63,0x57,0x4A,0x69,0x6F,0x73,0x34,0x20,0x68,0x51,0x6B,0x4D,0x43, - 0x71,0x45,0x56,0x67,0x49,0x63,0x39,0x32,0x4E,0x31,0x71,0x53,0x32,0x73,0x6F, - 0x4E,0x34,0x78,0x7A,0x7A,0x58,0x67,0x37,0x52,0x32,0x38,0x42,0x4B,0x58,0x77, - 0x4A,0x7A,0x73,0x32,0x6B,0x45,0x74,0x30,0x5A,0x57,0x35,0x2B,0x36,0x6F,0x4B, - 0x4D,0x30,0x6E,0x56,0x70,0x4C,0x5A,0x6D,0x79,0x76,0x55,0x65,0x56,0x4C,0x61, - 0x31,0x52,0x52,0x2B,0x67,0x6F,0x56,0x20,0x55,0x34,0x55,0x67,0x67,0x63,0x45, - 0x67,0x74,0x41,0x4A,0x67,0x4E,0x33,0x62,0x49,0x41,0x32,0x56,0x39,0x39,0x2B, - 0x6E,0x62,0x69,0x70,0x6E,0x32,0x4C,0x57,0x43,0x4A,0x2F,0x59,0x79,0x2B,0x32, - 0x75,0x76,0x58,0x5A,0x58,0x6A,0x4A,0x56,0x77,0x48,0x4E,0x4B,0x7A,0x77,0x2F, - 0x45,0x6D,0x2B,0x4E,0x76,0x6B,0x71,0x31,0x61,0x39,0x48,0x34,0x65,0x7A,0x68, - 0x5A,0x4E,0x58,0x48,0x4E,0x20,0x66,0x6C,0x33,0x2B,0x53,0x33,0x67,0x48,0x74, - 0x64,0x35,0x57,0x6E,0x79,0x49,0x48,0x67,0x39,0x41,0x4B,0x51,0x47,0x31,0x32, - 0x56,0x68,0x73,0x2F,0x4E,0x74,0x7A,0x59,0x41,0x58,0x72,0x38,0x70,0x7A,0x33, - 0x32,0x5A,0x57,0x5A,0x48,0x70,0x79,0x36,0x46,0x6A,0x78,0x78,0x6C,0x35,0x68, - 0x76,0x57,0x6B,0x43,0x65,0x4D,0x38,0x58,0x50,0x72,0x30,0x4F,0x64,0x77,0x45, - 0x7A,0x67,0x47,0x20,0x6E,0x35,0x67,0x4A,0x38,0x71,0x6B,0x4C,0x4F,0x34,0x4F, - 0x2B,0x66,0x39,0x53,0x4E,0x6F,0x66,0x6B,0x31,0x72,0x4F,0x41,0x6E,0x2B,0x42, - 0x30,0x36,0x2B,0x41,0x45,0x47,0x67,0x39,0x41,0x4B,0x67,0x44,0x62,0x62,0x68, - 0x7A,0x5A,0x2B,0x62,0x44,0x67,0x54,0x49,0x44,0x66,0x36,0x57,0x47,0x70,0x71, - 0x48,0x4E,0x74,0x6E,0x4E,0x39,0x33,0x2F,0x71,0x74,0x64,0x49,0x35,0x62,0x2F, - 0x61,0x20,0x4C,0x2B,0x47,0x43,0x4A,0x6A,0x4F,0x32,0x5A,0x61,0x72,0x47,0x2B, - 0x37,0x6A,0x31,0x6C,0x51,0x33,0x6B,0x6B,0x72,0x46,0x6E,0x48,0x65,0x50,0x6C, - 0x2F,0x78,0x48,0x4F,0x34,0x4B,0x70,0x31,0x35,0x59,0x77,0x70,0x34,0x41,0x32, - 0x38,0x68,0x31,0x4E,0x6F,0x6F,0x61,0x4C,0x33,0x73,0x54,0x45,0x6D,0x74,0x76, - 0x4D,0x74,0x36,0x36,0x48,0x39,0x51,0x52,0x42,0x74,0x37,0x70,0x4F,0x33,0x20, - 0x6F,0x54,0x58,0x79,0x65,0x30,0x38,0x66,0x53,0x39,0x54,0x42,0x79,0x7A,0x33, - 0x6E,0x52,0x38,0x69,0x6C,0x70,0x34,0x38,0x68,0x36,0x73,0x41,0x58,0x6E,0x75, - 0x50,0x50,0x79,0x4E,0x65,0x65,0x76,0x6B,0x78,0x55,0x6E,0x68,0x36,0x68,0x32, - 0x68,0x59,0x4F,0x34,0x52,0x41,0x71,0x5A,0x38,0x74,0x51,0x30,0x4B,0x6E,0x59, - 0x4C,0x54,0x54,0x2B,0x41,0x4B,0x36,0x61,0x31,0x34,0x37,0x76,0x20,0x61,0x67, - 0x75,0x4D,0x56,0x39,0x42,0x66,0x6A,0x78,0x31,0x58,0x59,0x66,0x42,0x6A,0x5A, - 0x45,0x76,0x47,0x61,0x7A,0x30,0x35,0x46,0x4F,0x54,0x7A,0x47,0x6B,0x36,0x67, - 0x35,0x70,0x51,0x4E,0x61,0x64,0x34,0x2B,0x51,0x6E,0x73,0x44,0x71,0x4E,0x6C, - 0x53,0x35,0x32,0x31,0x72,0x67,0x71,0x78,0x4E,0x48,0x78,0x75,0x56,0x43,0x58, - 0x42,0x71,0x39,0x44,0x48,0x55,0x69,0x58,0x46,0x71,0x20,0x31,0x32,0x43,0x36, - 0x66,0x31,0x4E,0x72,0x4E,0x50,0x76,0x36,0x6E,0x57,0x4B,0x37,0x2F,0x32,0x33, - 0x55,0x63,0x79,0x58,0x42,0x64,0x47,0x48,0x4D,0x43,0x33,0x54,0x35,0x65,0x77, - 0x33,0x6D,0x54,0x46,0x62,0x52,0x72,0x4A,0x59,0x34,0x79,0x65,0x6A,0x4C,0x50, - 0x53,0x5A,0x4C,0x78,0x71,0x70,0x72,0x44,0x6C,0x50,0x34,0x41,0x63,0x36,0x67, - 0x35,0x73,0x74,0x2F,0x43,0x63,0x50,0x42,0x20,0x53,0x48,0x39,0x78,0x5A,0x5A, - 0x2F,0x2F,0x45,0x6F,0x72,0x2B,0x79,0x6F,0x79,0x50,0x4B,0x35,0x53,0x78,0x31, - 0x35,0x76,0x35,0x41,0x5A,0x48,0x31,0x31,0x33,0x38,0x32,0x2B,0x63,0x73,0x2F, - 0x6D,0x36,0x35,0x76,0x30,0x68,0x46,0x76,0x55,0x78,0x38,0x61,0x50,0x7A,0x4E, - 0x2B,0x70,0x4E,0x37,0x41,0x50,0x6C,0x39,0x64,0x34,0x39,0x4D,0x6C,0x34,0x2F, - 0x76,0x38,0x4C,0x4C,0x4D,0x58,0x20,0x2B,0x48,0x75,0x45,0x4C,0x38,0x55,0x4E, - 0x45,0x35,0x66,0x35,0x44,0x36,0x6F,0x76,0x74,0x4B,0x38,0x41,0x71,0x75,0x77, - 0x54,0x71,0x42,0x2B,0x53,0x57,0x6A,0x67,0x45,0x76,0x52,0x4B,0x4F,0x6A,0x55, - 0x63,0x43,0x70,0x46,0x36,0x51,0x53,0x2B,0x53,0x5A,0x70,0x77,0x38,0x70,0x36, - 0x70,0x4D,0x36,0x39,0x78,0x7A,0x4F,0x6B,0x63,0x38,0x38,0x66,0x52,0x50,0x52, - 0x2B,0x74,0x4C,0x63,0x20,0x42,0x5A,0x53,0x2F,0x57,0x6B,0x71,0x44,0x6E,0x46, - 0x5A,0x6A,0x66,0x56,0x79,0x6A,0x36,0x4B,0x76,0x48,0x47,0x4E,0x41,0x2B,0x48, - 0x73,0x4F,0x73,0x59,0x56,0x63,0x4D,0x72,0x61,0x39,0x71,0x2B,0x49,0x38,0x6E, - 0x64,0x34,0x30,0x4E,0x30,0x68,0x5A,0x69,0x41,0x64,0x42,0x47,0x36,0x33,0x65, - 0x41,0x78,0x4E,0x74,0x78,0x48,0x65,0x61,0x35,0x70,0x34,0x38,0x68,0x54,0x6E, - 0x47,0x71,0x20,0x37,0x37,0x45,0x2B,0x39,0x4A,0x31,0x61,0x42,0x33,0x52,0x49, - 0x44,0x42,0x31,0x48,0x65,0x64,0x4C,0x46,0x7A,0x73,0x77,0x69,0x74,0x57,0x35, - 0x64,0x37,0x68,0x4A,0x4F,0x34,0x41,0x33,0x55,0x32,0x42,0x59,0x31,0x77,0x67, - 0x46,0x55,0x75,0x79,0x33,0x6B,0x54,0x61,0x43,0x4B,0x64,0x70,0x74,0x78,0x74, - 0x2F,0x56,0x38,0x67,0x38,0x63,0x4A,0x74,0x51,0x44,0x4D,0x79,0x4F,0x53,0x46, - 0x20,0x6C,0x30,0x32,0x48,0x72,0x4D,0x4D,0x36,0x4A,0x68,0x4B,0x63,0x50,0x30, - 0x4B,0x31,0x4C,0x58,0x52,0x51,0x6A,0x2B,0x42,0x51,0x68,0x7A,0x58,0x44,0x6C, - 0x79,0x36,0x72,0x48,0x32,0x4F,0x42,0x66,0x67,0x4A,0x66,0x41,0x2F,0x6D,0x7A, - 0x61,0x31,0x2F,0x6C,0x54,0x7A,0x45,0x56,0x4F,0x32,0x4B,0x50,0x4D,0x78,0x44, - 0x61,0x6A,0x34,0x44,0x74,0x56,0x73,0x78,0x62,0x6F,0x57,0x6C,0x54,0x20,0x32, - 0x6C,0x6B,0x6A,0x6A,0x39,0x58,0x55,0x4F,0x4E,0x61,0x62,0x68,0x6F,0x38,0x4D, - 0x78,0x56,0x35,0x59,0x76,0x33,0x38,0x54,0x75,0x63,0x75,0x58,0x59,0x75,0x70, - 0x54,0x2B,0x72,0x57,0x51,0x6E,0x30,0x4E,0x59,0x72,0x65,0x6E,0x6F,0x6D,0x6E, - 0x47,0x4C,0x4E,0x63,0x66,0x47,0x59,0x54,0x76,0x4D,0x51,0x4B,0x67,0x46,0x77, - 0x4A,0x48,0x7A,0x53,0x35,0x50,0x33,0x43,0x2F,0x54,0x4D,0x20,0x32,0x49,0x5A, - 0x57,0x64,0x53,0x6E,0x73,0x78,0x56,0x42,0x4D,0x46,0x59,0x45,0x55,0x76,0x68, - 0x52,0x54,0x4A,0x6E,0x59,0x56,0x45,0x6C,0x31,0x2B,0x39,0x31,0x4B,0x6E,0x5A, - 0x70,0x37,0x38,0x36,0x47,0x33,0x6C,0x32,0x74,0x69,0x74,0x71,0x72,0x77,0x4F, - 0x55,0x58,0x53,0x73,0x33,0x36,0x69,0x50,0x6B,0x49,0x46,0x51,0x76,0x77,0x49, - 0x6F,0x6C,0x51,0x6E,0x38,0x42,0x6C,0x50,0x59,0x20,0x6F,0x6B,0x59,0x34,0x67, - 0x47,0x72,0x48,0x67,0x75,0x4C,0x71,0x73,0x6D,0x59,0x6D,0x67,0x47,0x4C,0x71, - 0x38,0x6C,0x77,0x62,0x2B,0x7A,0x49,0x31,0x70,0x31,0x4F,0x46,0x53,0x36,0x32, - 0x46,0x2F,0x49,0x78,0x31,0x45,0x62,0x58,0x32,0x63,0x36,0x68,0x57,0x72,0x4F, - 0x45,0x43,0x33,0x73,0x49,0x53,0x52,0x76,0x77,0x68,0x47,0x51,0x69,0x35,0x41, - 0x47,0x69,0x4C,0x63,0x71,0x6A,0x4C,0x20,0x36,0x4B,0x4E,0x43,0x4F,0x59,0x48, - 0x4F,0x4E,0x77,0x34,0x73,0x4A,0x2F,0x6A,0x72,0x4B,0x67,0x49,0x4B,0x6F,0x38, - 0x73,0x30,0x68,0x31,0x2B,0x68,0x31,0x69,0x4B,0x39,0x52,0x59,0x6F,0x67,0x48, - 0x73,0x4E,0x4A,0x49,0x39,0x4D,0x38,0x67,0x77,0x72,0x4A,0x37,0x4A,0x6B,0x31, - 0x47,0x6D,0x49,0x47,0x54,0x41,0x5A,0x43,0x4C,0x77,0x42,0x4B,0x78,0x77,0x7A, - 0x71,0x55,0x39,0x53,0x48,0x20,0x4C,0x70,0x32,0x4B,0x51,0x4F,0x6B,0x62,0x42, - 0x35,0x59,0x54,0x2F,0x4E,0x31,0x41,0x58,0x65,0x53,0x68,0x6F,0x48,0x57,0x66, - 0x77,0x63,0x56,0x51,0x44,0x71,0x4F,0x66,0x74,0x35,0x32,0x42,0x55,0x48,0x38, - 0x44,0x38,0x48,0x64,0x31,0x68,0x6A,0x4C,0x33,0x44,0x63,0x69,0x36,0x6E,0x50, - 0x71,0x45,0x31,0x67,0x57,0x56,0x2F,0x46,0x4A,0x6B,0x54,0x4D,0x78,0x68,0x6C, - 0x34,0x38,0x61,0x20,0x75,0x34,0x71,0x4D,0x4C,0x71,0x7A,0x6B,0x31,0x32,0x4B, - 0x4F,0x67,0x77,0x4F,0x34,0x65,0x4B,0x32,0x6A,0x4F,0x44,0x2B,0x63,0x44,0x4D, - 0x51,0x33,0x67,0x50,0x2F,0x32,0x57,0x70,0x65,0x39,0x2B,0x45,0x2F,0x39,0x54, - 0x5A,0x71,0x6A,0x36,0x5A,0x56,0x38,0x6E,0x63,0x75,0x56,0x4D,0x57,0x34,0x43, - 0x39,0x5A,0x6F,0x75,0x57,0x61,0x6A,0x67,0x34,0x55,0x2B,0x70,0x2B,0x35,0x38, - 0x45,0x20,0x38,0x78,0x53,0x65,0x77,0x68,0x53,0x75,0x69,0x35,0x71,0x42,0x43, - 0x33,0x67,0x4A,0x48,0x59,0x79,0x49,0x47,0x64,0x67,0x6F,0x41,0x37,0x45,0x41, - 0x2F,0x4A,0x34,0x75,0x58,0x63,0x4B,0x72,0x33,0x30,0x33,0x50,0x74,0x42,0x4B, - 0x4C,0x4C,0x74,0x34,0x2F,0x58,0x73,0x39,0x48,0x35,0x41,0x54,0x6D,0x6E,0x73, - 0x32,0x4B,0x4B,0x67,0x43,0x56,0x4E,0x58,0x62,0x6F,0x47,0x62,0x59,0x4A,0x20, - 0x2F,0x41,0x54,0x54,0x68,0x6A,0x51,0x2F,0x34,0x66,0x68,0x58,0x6C,0x4A,0x38, - 0x48,0x75,0x49,0x41,0x52,0x4D,0x51,0x4D,0x76,0x7A,0x6B,0x41,0x73,0x41,0x4D, - 0x39,0x54,0x70,0x77,0x75,0x6F,0x74,0x77,0x47,0x31,0x51,0x36,0x48,0x47,0x30, - 0x51,0x46,0x55,0x47,0x78,0x45,0x7A,0x73,0x44,0x63,0x5A,0x69,0x4C,0x38,0x42, - 0x50,0x4E,0x2B,0x4B,0x43,0x70,0x4D,0x2B,0x72,0x63,0x2B,0x67,0x20,0x67,0x36, - 0x2F,0x46,0x48,0x41,0x64,0x48,0x4D,0x46,0x37,0x2B,0x31,0x32,0x59,0x79,0x7A, - 0x68,0x38,0x38,0x41,0x2F,0x45,0x4E,0x59,0x48,0x56,0x4B,0x4D,0x34,0x62,0x6F, - 0x75,0x33,0x6B,0x4F,0x4A,0x61,0x2B,0x43,0x43,0x6B,0x67,0x4A,0x39,0x59,0x71, - 0x75,0x4E,0x6C,0x35,0x38,0x6B,0x68,0x43,0x78,0x6E,0x78,0x6D,0x49,0x42,0x57, - 0x44,0x7A,0x66,0x56,0x45,0x52,0x53,0x44,0x71,0x6D,0x20,0x36,0x61,0x4A,0x58, - 0x48,0x66,0x5A,0x6F,0x69,0x68,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41,0x72,0x43, - 0x33,0x57,0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x62,0x69,0x62,0x77, - 0x44,0x6A,0x35,0x7A,0x68,0x47,0x69,0x42,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41, - 0x72,0x43,0x33,0x57,0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x5A,0x69, - 0x41,0x52,0x67,0x2F,0x78,0x7A,0x46,0x43,0x20,0x7A,0x4D,0x44,0x65,0x5A,0x69, - 0x41,0x57,0x67,0x4C,0x33,0x64,0x6D,0x72,0x69,0x77,0x6D,0x49,0x48,0x78,0x4D, - 0x78,0x41,0x4C,0x77,0x50,0x67,0x35,0x6A,0x68,0x46,0x69,0x42,0x76,0x59,0x32, - 0x41,0x37,0x45,0x41,0x37,0x4F,0x33,0x57,0x78,0x49,0x58,0x46,0x44,0x49,0x79, - 0x66,0x67,0x56,0x67,0x41,0x78,0x73,0x39,0x78,0x6A,0x42,0x41,0x7A,0x73,0x4C, - 0x63,0x5A,0x2B,0x44,0x2F,0x67,0x20,0x6B,0x56,0x6D,0x37,0x6B,0x69,0x4A,0x4A, - 0x36,0x67,0x41,0x41,0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A, - 0x67,0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x70, - 0x6C,0x61,0x6E,0x65,0x74,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20, - 0x5B,0x5B,0x20,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,0x64,0x35,0x6B,0x6C,0x45,0x51,0x56,0x52,0x34,0x6E, - 0x4F,0x32,0x64,0x66,0x5A,0x42,0x63,0x31,0x58,0x6E,0x6D,0x66,0x37,0x64,0x37, - 0x20,0x50,0x71,0x55,0x5A,0x7A,0x57,0x6A,0x30,0x4D,0x66,0x70,0x41,0x51,0x69, - 0x4E,0x45,0x4A,0x41,0x47,0x79,0x51,0x4D,0x45,0x73,0x77,0x6F,0x41,0x4D,0x43, - 0x56,0x35,0x69,0x78,0x53,0x6E,0x6A,0x73,0x47,0x56,0x58,0x4A,0x62,0x76,0x72, - 0x4C,0x55,0x78,0x43,0x63,0x4A,0x6D,0x74,0x70,0x4C,0x4C,0x6C,0x53,0x72,0x41, - 0x68,0x41,0x64,0x74,0x4A,0x4F,0x61,0x6D,0x34,0x6A,0x41,0x74,0x77,0x20,0x58, - 0x48,0x61,0x74,0x64,0x31,0x31,0x4F,0x78,0x52,0x56,0x32,0x6C,0x58,0x56,0x46, - 0x57,0x44,0x5A,0x6C,0x73,0x41,0x4F,0x78,0x4D,0x49,0x73,0x52,0x57,0x42,0x69, - 0x51,0x73,0x4E,0x43,0x33,0x72,0x4E,0x46,0x49,0x6F,0x35,0x6E,0x52,0x6A,0x4F, - 0x61,0x7A,0x37,0x38,0x30,0x66,0x70,0x78,0x76,0x64,0x61,0x63,0x31,0x6F,0x7A, - 0x72,0x6C,0x39,0x75,0x2F,0x74,0x32,0x33,0x2B,0x64,0x58,0x20,0x64,0x59,0x76, - 0x70,0x34,0x66,0x53,0x64,0x6F,0x2B,0x37,0x7A,0x50,0x50,0x63,0x39,0x35,0x37, - 0x7A,0x6E,0x48,0x43,0x38,0x49,0x41,0x6F,0x51,0x51,0x36,0x53,0x52,0x54,0x37, - 0x51,0x6F,0x49,0x49,0x61,0x71,0x48,0x44,0x45,0x43,0x49,0x46,0x43,0x4D,0x44, - 0x45,0x43,0x4C,0x46,0x79,0x41,0x43,0x45,0x53,0x44,0x45,0x79,0x41,0x43,0x46, - 0x53,0x6A,0x41,0x78,0x41,0x69,0x42,0x51,0x6A,0x20,0x41,0x78,0x41,0x69,0x78, - 0x63,0x67,0x41,0x68,0x45,0x67,0x78,0x44,0x61,0x58,0x65,0x34,0x49,0x6C,0x58, - 0x78,0x75,0x4F,0x6F,0x68,0x78,0x41,0x69,0x41,0x76,0x64,0x76,0x61,0x53,0x37, - 0x70,0x2F,0x59,0x6F,0x41,0x68,0x45,0x67,0x78,0x4A,0x55,0x63,0x41,0x6F,0x71, - 0x62,0x78,0x5A,0x76,0x6D,0x39,0x38,0x73,0x4E,0x54,0x67,0x67,0x79,0x67,0x2F, - 0x70,0x67,0x48,0x58,0x41,0x56,0x73,0x20,0x41,0x6A,0x72,0x79,0x50,0x77,0x4F, - 0x73,0x42,0x70,0x61,0x45,0x79,0x71,0x30,0x48,0x35,0x73,0x39,0x79,0x6A,0x78, - 0x46,0x67,0x58,0x2B,0x68,0x31,0x48,0x33,0x41,0x6B,0x2F,0x2F,0x4D,0x62,0x77, - 0x43,0x43,0x77,0x4E,0x2F,0x2F,0x7A,0x2B,0x56,0x68,0x71,0x4C,0x61,0x71,0x43, - 0x44,0x4B,0x41,0x32,0x38,0x59,0x42,0x31,0x6F,0x57,0x73,0x54,0x52,0x75,0x67, - 0x39,0x77,0x49,0x6F,0x59,0x20,0x37,0x6A,0x38,0x66,0x32,0x47,0x4A,0x5A,0x39, - 0x67,0x52,0x77,0x45,0x47,0x4D,0x47,0x65,0x34,0x46,0x66,0x68,0x69,0x35,0x46, - 0x45,0x67,0x6C,0x48,0x42,0x6C,0x41,0x62,0x58,0x41,0x6C,0x73,0x42,0x57,0x34, - 0x47,0x62,0x67,0x41,0x32,0x56,0x37,0x63,0x36,0x30,0x31,0x69,0x52,0x76,0x39, - 0x34,0x33,0x77,0x2F,0x39,0x37,0x44,0x58,0x67,0x4A,0x65,0x41,0x48,0x59,0x44, - 0x62,0x78,0x64,0x20,0x77,0x58,0x6F,0x4A,0x43,0x32,0x51,0x41,0x79,0x65,0x51, - 0x47,0x34,0x42,0x61,0x4D,0x34,0x47,0x38,0x47,0x46,0x6C,0x65,0x33,0x4F,0x70, - 0x48,0x5A,0x6E,0x4C,0x2F,0x75,0x7A,0x62,0x38,0x2B,0x6A,0x54,0x47,0x43,0x46, - 0x34,0x44,0x6E,0x38,0x7A,0x2B,0x4C,0x4B,0x69,0x49,0x44,0x53,0x41,0x61,0x62, - 0x67,0x4F,0x33,0x41,0x48,0x52,0x6A,0x42,0x4E,0x31,0x57,0x33,0x4F,0x6D,0x56, - 0x6A,0x20,0x4D,0x66,0x43,0x68,0x2F,0x41,0x57,0x51,0x77,0x35,0x6A,0x42,0x4C, - 0x6D,0x41,0x6E,0x70,0x67,0x73,0x68,0x4B,0x6F,0x67,0x4D,0x6F,0x44,0x70,0x30, - 0x59,0x63,0x52,0x2B,0x4F,0x33,0x41,0x58,0x30,0x77,0x66,0x6E,0x30,0x6B,0x51, - 0x57,0x32,0x4A,0x61,0x2F,0x2F,0x67,0x6F,0x7A,0x32,0x4C,0x67,0x44,0x65,0x42, - 0x5A,0x34,0x42,0x75,0x69,0x76,0x58,0x74,0x58,0x53,0x67,0x51,0x79,0x67,0x20, - 0x73,0x6E,0x77,0x55,0x75,0x44,0x74,0x2F,0x69,0x59,0x74,0x5A,0x41,0x76,0x78, - 0x42,0x2F,0x67,0x4A,0x34,0x4B,0x6E,0x2F,0x4A,0x44,0x4D,0x71,0x45,0x44,0x4B, - 0x44,0x38,0x33,0x41,0x6E,0x63,0x67,0x33,0x6E,0x53,0x5A,0x36,0x74,0x63,0x6C, - 0x31,0x6F,0x6A,0x62,0x4A,0x5A,0x50,0x41,0x64,0x2F,0x41,0x64,0x42,0x64,0x45, - 0x54,0x4D,0x67,0x41,0x79,0x6B,0x4D,0x50,0x38,0x48,0x47,0x4D,0x20,0x38,0x46, - 0x64,0x57,0x74,0x79,0x70,0x31,0x51,0x38,0x45,0x4D,0x6A,0x6D,0x4F,0x4D,0x34, - 0x4A,0x75,0x59,0x36,0x55,0x64,0x52,0x41,0x6C,0x55,0x33,0x67,0x47,0x2B,0x38, - 0x31,0x56,0x6A,0x74,0x4B,0x70,0x54,0x45,0x50,0x52,0x73,0x6D,0x77,0x79,0x38, - 0x2F,0x43,0x4E,0x79,0x50,0x47,0x64,0x41,0x54,0x35,0x57,0x45,0x6C,0x38,0x46, - 0x44,0x2B,0x32,0x67,0x6B,0x38,0x41,0x54,0x78,0x64,0x20,0x2B,0x4A,0x2B,0x31, - 0x31,0x70,0x36,0x4B,0x32,0x6B,0x2F,0x46,0x71,0x62,0x6F,0x42,0x31,0x43,0x49, - 0x7A,0x66,0x47,0x6E,0x33,0x59,0x59,0x53,0x2F,0x71,0x66,0x4B,0x31,0x6D,0x55, - 0x34,0x75,0x67,0x4C,0x50,0x6A,0x48,0x6D,0x66,0x48,0x50,0x53,0x5A,0x38,0x47, - 0x42,0x67,0x33,0x32,0x62,0x37,0x44,0x6B,0x78,0x35,0x6A,0x75,0x51,0x76,0x6C, - 0x42,0x69,0x63,0x38,0x4A,0x76,0x32,0x5A,0x20,0x37,0x39,0x47,0x59,0x67,0x59, - 0x36,0x6D,0x43,0x7A,0x6B,0x38,0x4C,0x56,0x6C,0x6F,0x61,0x7A,0x53,0x76,0x4F, - 0x35,0x73,0x44,0x6D,0x6A,0x4B,0x77,0x73,0x44,0x6C,0x67,0x59,0x58,0x4E,0x41, - 0x64,0x72,0x5A,0x6B,0x34,0x73,0x71,0x77,0x50,0x58,0x2F,0x74,0x78,0x52,0x6A, - 0x42,0x56,0x38,0x50,0x66,0x54,0x61,0x32,0x5A,0x51,0x54,0x57,0x51,0x41,0x54, - 0x68,0x51,0x4A,0x50,0x77,0x75,0x20,0x34,0x4A,0x4D,0x59,0x34,0x53,0x2B,0x72, - 0x64,0x46,0x32,0x47,0x4A,0x6A,0x79,0x47,0x4A,0x73,0x31,0x2F,0x43,0x34,0x49, - 0x2F,0x4E,0x77,0x6E,0x6E,0x70,0x30,0x70,0x58,0x35,0x4B,0x51,0x50,0x70,0x38, - 0x65,0x4B,0x37,0x7A,0x50,0x7A,0x66,0x65,0x63,0x31,0x42,0x4C,0x51,0x33,0x58, - 0x6A,0x43,0x45,0x42,0x55,0x30,0x42,0x43,0x78,0x70,0x68,0x51,0x56,0x4E,0x46, - 0x6B,0x77,0x41,0x33,0x20,0x41,0x55,0x38,0x43,0x44,0x32,0x4F,0x4D,0x34,0x48, - 0x47,0x67,0x76,0x2F,0x42,0x39,0x79,0x51,0x68,0x6D,0x52,0x77,0x5A,0x67,0x53, - 0x55,0x6A,0x38,0x6A,0x63,0x43,0x44,0x6D,0x4D,0x5A,0x57,0x45,0x59,0x59,0x6D, - 0x50,0x45,0x36,0x4E,0x65,0x76,0x53,0x4F,0x65,0x76,0x53,0x4E,0x65,0x5A,0x79, - 0x35,0x53,0x4A,0x7A,0x56,0x34,0x2F,0x79,0x55,0x78,0x2F,0x6B,0x70,0x36,0x42, - 0x32,0x39,0x20,0x75,0x45,0x36,0x4C,0x57,0x67,0x4B,0x57,0x74,0x41,0x52,0x30, - 0x74,0x77,0x59,0x73,0x62,0x51,0x30,0x71,0x59,0x51,0x72,0x4C,0x67,0x45,0x66, - 0x79,0x31,0x31,0x38,0x43,0x6E,0x77,0x63,0x6D,0x37,0x39,0x6B,0x77,0x4B,0x52, - 0x4F,0x59,0x42,0x52,0x6E,0x41,0x48,0x42,0x51,0x39,0x39,0x66,0x38,0x63,0x38, - 0x38,0x51,0x76,0x36,0x38,0x44,0x65,0x38,0x4B,0x54,0x48,0x30,0x52,0x47,0x50, - 0x20,0x34,0x79,0x4D,0x65,0x76,0x65,0x63,0x7A,0x30,0x30,0x4C,0x33,0x57,0x75, - 0x4A,0x4D,0x33,0x71,0x7A,0x65,0x47,0x6A,0x43,0x76,0x57,0x37,0x4B,0x77,0x74, - 0x4E,0x58,0x6E,0x73,0x72,0x61,0x41,0x56,0x66,0x4F,0x44,0x64,0x37,0x73,0x56, - 0x5A,0x65,0x4A,0x68,0x34,0x42,0x4F,0x59,0x69,0x4F,0x41,0x4C,0x69,0x67,0x5A, - 0x6D,0x52,0x67,0x59,0x77,0x43,0x30,0x58,0x43,0x66,0x77,0x41,0x6A,0x20,0x2F, - 0x50,0x58,0x6C,0x2B,0x46,0x73,0x42,0x63,0x48,0x7A,0x45,0x34,0x38,0x52,0x49, - 0x68,0x73,0x50,0x44,0x48,0x6B,0x4D,0x54,0x79,0x58,0x6E,0x43,0x78,0x38,0x6C, - 0x59,0x44,0x6F,0x34,0x4D,0x5A,0x7A,0x67,0x79,0x62,0x46,0x34,0x76,0x61,0x41, - 0x71,0x34,0x76,0x43,0x31,0x67,0x78,0x58,0x79,0x66,0x6C,0x66,0x4F,0x44,0x57, - 0x64,0x63,0x6D,0x6C,0x38,0x42,0x4B,0x54,0x42,0x54,0x77,0x20,0x58,0x7A,0x42, - 0x47,0x38,0x4A,0x69,0x4D,0x59,0x44,0x6F,0x79,0x67,0x43,0x49,0x71,0x4F,0x61, - 0x70,0x2F,0x62,0x4D,0x54,0x6A,0x34,0x4C,0x6B,0x4D,0x68,0x38,0x39,0x6C,0x47, - 0x4B,0x2F,0x52,0x70,0x33,0x77,0x70,0x44,0x45,0x31,0x34,0x37,0x4F,0x33,0x33, - 0x32,0x4E,0x75,0x66,0x6F,0x54,0x6B,0x4C,0x6C,0x37,0x66,0x37,0x39,0x4C,0x53, - 0x58,0x78,0x51,0x7A,0x57,0x41,0x31,0x38,0x47,0x20,0x50,0x6B,0x42,0x2B,0x31, - 0x6B,0x42,0x47,0x59,0x4A,0x41,0x42,0x68,0x41,0x69,0x4A,0x66,0x77,0x32,0x6D, - 0x6E,0x2F,0x2B,0x4A,0x75,0x50,0x2F,0x47,0x71,0x56,0x47,0x50,0x66,0x59,0x50, - 0x70,0x46,0x66,0x31,0x73,0x6A,0x4F,0x64,0x67,0x2F,0x30,0x43,0x47,0x2F,0x51, - 0x4D,0x58,0x7A,0x47,0x42,0x39,0x68,0x38,0x2F,0x53,0x31,0x6C,0x69,0x37,0x43, - 0x59,0x56,0x5A,0x67,0x36,0x39,0x6A,0x20,0x49,0x6F,0x4E,0x44,0x61,0x52,0x38, - 0x66,0x6B,0x41,0x46,0x77,0x30,0x56,0x50,0x2F,0x73,0x35,0x68,0x42,0x70,0x4E, - 0x67,0x59,0x7A,0x38,0x48,0x62,0x67,0x78,0x6E,0x32,0x44,0x57,0x62,0x65,0x6E, - 0x5A,0x59,0x54,0x73,0x78,0x4D,0x32,0x67,0x38,0x37,0x6D,0x67,0x50,0x55,0x64, - 0x50,0x6C,0x64,0x32,0x2B,0x44,0x54,0x48,0x6C,0x30,0x66,0x35,0x69,0x66,0x7A, - 0x31,0x45,0x50,0x42,0x6F,0x20,0x6D,0x71,0x4F,0x42,0x31,0x4F,0x38,0x4A,0x47, - 0x42,0x4C,0x2F,0x65,0x34,0x48,0x76,0x45,0x61,0x50,0x34,0x2B,0x38,0x59,0x38, - 0x66,0x6E,0x51,0x69,0x79,0x7A,0x2F,0x38,0x73,0x70,0x47,0x66,0x6E,0x73,0x70, - 0x4B,0x2F,0x42,0x45,0x59,0x47,0x50,0x66,0x34,0x36,0x53,0x6E,0x7A,0x47,0x66, - 0x37,0x6F,0x52,0x4A,0x61,0x2B,0x65,0x47,0x64,0x41,0x48,0x73,0x46,0x38,0x35, - 0x2B,0x2B,0x46,0x20,0x36,0x69,0x66,0x6C,0x56,0x49,0x50,0x55,0x52,0x67,0x42, - 0x46,0x58,0x2F,0x61,0x6A,0x77,0x47,0x66,0x69,0x75,0x76,0x65,0x52,0x34,0x51, - 0x77,0x2F,0x50,0x35,0x4F,0x5A,0x63,0x57,0x70,0x4D,0x52,0x4D,0x4D,0x50,0x34, - 0x4D,0x42,0x51,0x68,0x67,0x4E,0x44,0x47,0x62,0x70,0x62,0x41,0x39,0x36,0x7A, - 0x79,0x47,0x64,0x31,0x32,0x79,0x79,0x5A,0x54,0x47,0x37,0x63,0x6D,0x62,0x38, - 0x2B,0x20,0x42,0x33,0x77,0x32,0x62,0x64,0x46,0x41,0x4B,0x69,0x4F,0x41,0x6B, - 0x50,0x6A,0x58,0x59,0x35,0x61,0x65,0x6C,0x69,0x7A,0x2B,0x41,0x42,0x4F,0x32, - 0x50,0x76,0x56,0x4F,0x41,0x38,0x38,0x63,0x79,0x30,0x72,0x38,0x5A,0x61,0x52, - 0x33,0x31,0x4F,0x4F,0x5A,0x59,0x31,0x6D,0x65,0x65,0x71,0x65,0x42,0x2F,0x51, - 0x4F,0x5A,0x75,0x50,0x59,0x64,0x2B,0x77,0x79,0x6D,0x4C,0x61,0x79,0x48,0x20, - 0x39,0x45,0x51,0x44,0x71,0x54,0x4F,0x41,0x30,0x42,0x66,0x37,0x2B,0x35,0x67, - 0x74,0x71,0x32,0x34,0x72,0x39,0x5A,0x35,0x76,0x44,0x78,0x72,0x68,0x50,0x33, - 0x38,0x79,0x79,0x32,0x43,0x64,0x54,0x75,0x45,0x6C,0x6B,0x63,0x45,0x4A,0x6A, - 0x2B,0x64,0x50,0x47,0x69,0x4E,0x34,0x65,0x7A,0x43,0x57,0x70,0x6E,0x77,0x62, - 0x70,0x6B,0x33,0x38,0x50,0x71,0x54,0x44,0x42,0x46,0x4C,0x54,0x20,0x42,0x53, - 0x6A,0x36,0x4D,0x70,0x2F,0x45,0x35,0x4F,0x2B,0x58,0x78,0x44,0x74,0x44,0x47, - 0x66,0x61,0x63,0x30,0x63,0x42,0x65,0x74,0x52,0x6D,0x61,0x38,0x50,0x6A,0x58, - 0x58,0x32,0x58,0x35,0x65,0x58,0x2B,0x47,0x36,0x78,0x62,0x35,0x72,0x46,0x31, - 0x51,0x55,0x74,0x65,0x67,0x47,0x66,0x67,0x57,0x5A,0x6F,0x2F,0x44,0x50,0x36, - 0x72,0x33,0x4C,0x6B,0x45,0x71,0x49,0x6F,0x43,0x51,0x20,0x2B,0x44,0x64,0x6A, - 0x48,0x4C,0x34,0x6B,0x38,0x66,0x65,0x4E,0x65,0x58,0x7A,0x33,0x55,0x41,0x50, - 0x50,0x6E,0x64,0x44,0x41,0x58,0x70,0x49,0x59,0x47,0x50,0x64,0x34,0x37,0x6B, - 0x53,0x57,0x37,0x78,0x35,0x71,0x69,0x47,0x4F,0x77,0x38,0x44,0x35,0x4D,0x57, - 0x39,0x6B,0x4D,0x39,0x52,0x73,0x4E,0x31,0x48,0x55,0x45,0x55,0x50,0x53,0x6C, - 0x2F,0x56,0x66,0x67,0x66,0x7A,0x4C,0x37,0x20,0x59,0x52,0x68,0x7A,0x4D,0x6A, - 0x7A,0x70,0x38,0x58,0x4B,0x66,0x47,0x59,0x67,0x53,0x79,0x61,0x56,0x67,0x30, - 0x46,0x63,0x73,0x38,0x4C,0x6C,0x2B,0x69,0x56,0x39,0x4B,0x79,0x76,0x46,0x37, - 0x67,0x44,0x33,0x41,0x66,0x77,0x50,0x2B,0x56,0x7A,0x31,0x47,0x41,0x33,0x58, - 0x62,0x6B,0x6B,0x50,0x69,0x7A,0x77,0x4A,0x66,0x77,0x32,0x77,0x67,0x45,0x55, - 0x6E,0x38,0x66,0x67,0x43,0x76,0x20,0x6E,0x6A,0x48,0x39,0x66,0x49,0x6D,0x2F, - 0x64,0x6A,0x67,0x77,0x5A,0x4C,0x36,0x7A,0x56,0x38,0x39,0x6B,0x38,0x4B,0x4F, - 0x50,0x46,0x48,0x71,0x59,0x74,0x76,0x4D,0x31,0x38,0x6A,0x73,0x36,0x31,0x56, - 0x4D,0x30,0x55,0x4A,0x65,0x74,0x4F,0x66,0x51,0x46,0x58,0x59,0x73,0x4A,0x34, - 0x2B,0x36,0x64,0x76,0x66,0x53,0x6C,0x36,0x52,0x76,0x7A,0x32,0x48,0x47,0x6F, - 0x67,0x5A,0x2F,0x31,0x20,0x5A,0x63,0x6E,0x70,0x6D,0x49,0x75,0x61,0x49,0x78, - 0x66,0x41,0x7A,0x2F,0x71,0x79,0x37,0x43,0x69,0x39,0x57,0x33,0x41,0x76,0x70, - 0x69,0x31,0x64,0x43,0x2F,0x56,0x6A,0x41,0x6E,0x56,0x6E,0x41,0x4B,0x45,0x76, - 0x35,0x73,0x4F,0x59,0x38,0x4F,0x33,0x71,0x4B,0x50,0x65,0x5A,0x39,0x4F,0x48, - 0x46,0x58,0x74,0x4F,0x66,0x56,0x44,0x2B,0x2F,0x39,0x68,0x6B,0x59,0x4E,0x39, - 0x32,0x43,0x20,0x46,0x33,0x75,0x7A,0x73,0x32,0x36,0x45,0x59,0x73,0x48,0x56, - 0x6D,0x44,0x62,0x31,0x59,0x61,0x67,0x50,0x45,0x36,0x67,0x72,0x41,0x77,0x68, - 0x39,0x49,0x51,0x39,0x67,0x74,0x70,0x65,0x4F,0x52,0x4F,0x2B,0x6F,0x78,0x34, - 0x36,0x44,0x44,0x66,0x7A,0x69,0x62,0x46,0x31,0x39,0x50,0x41,0x4C,0x34,0x78, - 0x64,0x6B,0x4D,0x4F,0x77,0x34,0x32,0x6C,0x4A,0x71,0x6E,0x73,0x51,0x50,0x54, - 0x20,0x78,0x6D,0x72,0x65,0x42,0x4F,0x70,0x69,0x45,0x4C,0x44,0x6F,0x53,0x33, - 0x67,0x4D,0x2B,0x46,0x54,0x55,0x65,0x37,0x31,0x32,0x4A,0x73,0x50,0x50,0x2B, - 0x72,0x49,0x36,0x31,0x4B,0x36,0x4F,0x4F,0x54,0x66,0x70,0x73,0x66,0x4E,0x77, - 0x41,0x37,0x2B,0x2B,0x4A,0x4D,0x66,0x6D,0x52,0x5A,0x48,0x44,0x67,0x53,0x39, - 0x6A,0x7A,0x6D,0x56,0x38,0x6F,0x4A,0x59,0x48,0x42,0x32,0x76,0x2B,0x20,0x45, - 0x52,0x63,0x53,0x2F,0x79,0x72,0x67,0x58,0x34,0x67,0x6F,0x2F,0x72,0x45,0x63, - 0x66,0x50,0x39,0x6F,0x41,0x79,0x39,0x4C,0x2F,0x4B,0x6B,0x67,0x41,0x46,0x37, - 0x75,0x79,0x2F,0x4C,0x39,0x6F,0x77,0x32,0x6C,0x62,0x4C,0x6A,0x79,0x4B,0x55, - 0x79,0x62,0x57,0x77,0x57,0x31,0x47,0x51,0x33,0x55,0x74,0x41,0x45,0x55,0x4C, - 0x64,0x2F,0x39,0x4E,0x68,0x48,0x58,0x37,0x52,0x64,0x43,0x20,0x2F,0x6D,0x4D, - 0x6A,0x36,0x75,0x75,0x6E,0x6A,0x57,0x4D,0x6A,0x58,0x71,0x6C,0x64,0x67,0x75, - 0x33,0x41,0x50,0x32,0x4C,0x61,0x59,0x4D,0x32,0x5A,0x51,0x4D,0x30,0x61,0x51, - 0x4F,0x69,0x44,0x76,0x67,0x4C,0x34,0x4A,0x38,0x78,0x68,0x6D,0x73,0x37,0x73, - 0x4F,0x5A,0x31,0x68,0x35,0x2B,0x47,0x47,0x57,0x44,0x62,0x54,0x46,0x4C,0x58, - 0x4A,0x2B,0x53,0x6E,0x54,0x4A,0x64,0x68,0x7A,0x20,0x4F,0x72,0x49,0x63,0x62, - 0x73,0x4B,0x30,0x77,0x53,0x75,0x67,0x74,0x6B,0x79,0x67,0x4A,0x67,0x32,0x67, - 0x53,0x50,0x7A,0x2F,0x41,0x6C,0x7A,0x76,0x65,0x6F,0x2B,0x78,0x48,0x4F,0x77, - 0x36,0x32,0x73,0x41,0x72,0x70,0x78,0x58,0x79,0x43,0x39,0x4D,0x6C,0x65,0x4F, - 0x56,0x30,0x6C,0x6C,0x33,0x52,0x75,0x77,0x54,0x58,0x59,0x39,0x70,0x69,0x54, - 0x5A,0x6C,0x41,0x7A,0x52,0x6C,0x41,0x20,0x6B,0x66,0x68,0x2F,0x41,0x47,0x78, - 0x77,0x76,0x55,0x66,0x66,0x6D,0x4D,0x66,0x2F,0x50,0x64,0x6A,0x49,0x63,0x59, - 0x58,0x38,0x6F,0x6F,0x6A,0x6A,0x49,0x36,0x5A,0x74,0x52,0x4D,0x77,0x5A,0x32, - 0x49,0x42,0x70,0x6B,0x7A,0x56,0x6A,0x41,0x6A,0x56,0x6C,0x41,0x45,0x56,0x39, - 0x2F,0x76,0x38,0x48,0x72,0x48,0x57,0x39,0x78,0x38,0x46,0x7A,0x4A,0x75,0x51, - 0x66,0x6E,0x59,0x71,0x78,0x20,0x59,0x71,0x4B,0x75,0x47,0x4A,0x32,0x43,0x6E, - 0x59,0x63,0x62,0x4F,0x48,0x67,0x75,0x6B,0x6A,0x7A,0x57,0x59,0x74,0x72,0x6D, - 0x47,0x6B,0x69,0x2B,0x43,0x64,0x53,0x4D,0x41,0x52,0x53,0x4A,0x2F,0x35,0x2B, - 0x49,0x6B,0x4F,0x44,0x7A,0x32,0x70,0x6B,0x4D,0x7A,0x78,0x35,0x58,0x52,0x70, - 0x2B,0x59,0x6D,0x31,0x77,0x41,0x7A,0x78,0x37,0x50,0x38,0x74,0x71,0x5A,0x53, - 0x42,0x4B,0x35,0x20,0x47,0x74,0x4E,0x47,0x31,0x30,0x43,0x79,0x54,0x61,0x42, - 0x6D,0x44,0x43,0x44,0x50,0x4B,0x75,0x42,0x2F,0x34,0x39,0x6A,0x6E,0x44,0x34, - 0x44,0x64,0x76,0x56,0x6C,0x65,0x37,0x74,0x50,0x68,0x76,0x4D,0x4B,0x4E,0x6C, - 0x2F,0x75,0x79,0x37,0x4F,0x36,0x4E,0x4E,0x45,0x35,0x30,0x50,0x61,0x61,0x74, - 0x72,0x6F,0x71,0x37,0x54,0x6E,0x46,0x53,0x45,0x77,0x59,0x51,0x63,0x74,0x41, - 0x6E,0x20,0x63,0x52,0x7A,0x74,0x39,0x77,0x50,0x34,0x30,0x59,0x6B,0x73,0x62, - 0x79,0x69,0x72,0x54,0x30,0x54,0x6B,0x6A,0x62,0x4D,0x5A,0x6E,0x6A,0x75,0x65, - 0x6A,0x62,0x4B,0x67,0x36,0x42,0x5A,0x4D,0x6D,0x30,0x31,0x73,0x46,0x4A,0x42, - 0x34,0x56,0x59,0x51,0x2B,0x75,0x4D,0x64,0x77,0x6E,0x4F,0x66,0x50,0x42,0x66, - 0x44,0x44,0x34,0x31,0x6E,0x65,0x30,0x51,0x6F,0x2B,0x55,0x53,0x49,0x48,0x20, - 0x7A,0x32,0x58,0x34,0x59,0x62,0x54,0x75,0x34,0x33,0x5A,0x4D,0x32,0x30,0x32, - 0x6B,0x43,0x53,0x52,0x61,0x47,0x61,0x45,0x50,0x37,0x44,0x34,0x63,0x4D,0x2F, - 0x78,0x79,0x41,0x66,0x7A,0x67,0x61,0x41,0x4E,0x48,0x68,0x68,0x50,0x39,0x54, - 0x78,0x51,0x31,0x78,0x4A,0x48,0x68,0x44,0x44,0x38,0x34,0x32,0x68,0x44,0x46, - 0x42,0x44,0x35,0x46,0x66,0x68,0x4F,0x61,0x70,0x4A,0x6C,0x41,0x20,0x59,0x74, - 0x56,0x52,0x74,0x4B,0x72,0x76,0x53,0x5A,0x66,0x33,0x35,0x67,0x4C,0x34,0x33, - 0x70,0x45,0x47,0x54,0x70,0x7A,0x58,0x4E,0x4A,0x2B,0x49,0x6C,0x78,0x50,0x6E, - 0x50,0x62,0x35,0x33,0x4A,0x4A,0x49,0x4A,0x50,0x45,0x6B,0x43,0x56,0x78,0x45, - 0x6D,0x30,0x67,0x42,0x43,0x48,0x39,0x41,0x57,0x48,0x46,0x66,0x31,0x2B,0x51, - 0x45,0x38,0x63,0x36,0x7A,0x6B,0x31,0x56,0x35,0x43,0x20,0x7A,0x49,0x72,0x5A, - 0x6C,0x62,0x67,0x68,0x79,0x70,0x6A,0x41,0x44,0x6B,0x79,0x62,0x54,0x6F,0x77, - 0x4A,0x4A,0x4E,0x49,0x41,0x38,0x71,0x7A,0x42,0x54,0x4B,0x56,0x59,0x34,0x2B, - 0x66,0x37,0x2F,0x45,0x72,0x77,0x45,0x65,0x58,0x6D,0x2B,0x49,0x6A,0x48,0x44, - 0x36,0x4D,0x4E,0x44,0x4C,0x34,0x37,0x50,0x5A,0x67,0x45,0x45,0x6D,0x63,0x41, - 0x52,0x53,0x50,0x2B,0x31,0x6F,0x6B,0x2B,0x20,0x41,0x66,0x44,0x6A,0x58,0x32, - 0x58,0x56,0x35,0x78,0x63,0x56,0x34,0x38,0x68,0x77,0x68,0x68,0x2F,0x2F,0x79, - 0x6E,0x6D,0x4B,0x63,0x43,0x30,0x4A,0x6D,0x68,0x6C,0x49,0x6C,0x46,0x70,0x43, - 0x48,0x38,0x68,0x6E,0x4D,0x61,0x65,0x31,0x57,0x4C,0x50,0x37,0x70,0x45,0x62, - 0x37,0x52,0x65,0x56,0x35,0x5A,0x79,0x6A,0x44,0x37,0x70,0x50,0x4F,0x2B,0x53, - 0x56,0x33,0x59,0x74,0x70,0x34,0x20,0x31,0x55,0x6D,0x4D,0x59,0x6B,0x4C,0x69, - 0x76,0x77,0x33,0x48,0x38,0x2F,0x6C,0x65,0x4F,0x35,0x50,0x68,0x7A,0x59,0x48, - 0x45,0x2F,0x46,0x4E,0x45,0x79,0x6E,0x68,0x7A,0x49,0x42,0x4D,0x6C,0x59,0x2F, - 0x41,0x52,0x59,0x6A,0x69,0x55,0x70,0x6C,0x53,0x53,0x70,0x70,0x6F,0x31,0x6D, - 0x48,0x58,0x39,0x31,0x68,0x77,0x5A,0x4E,0x6A,0x76,0x34,0x43,0x46,0x46,0x4E, - 0x58,0x75,0x36,0x4C,0x20,0x31,0x50,0x33,0x38,0x4E,0x6C,0x55,0x65,0x44,0x30, - 0x69,0x45,0x41,0x52,0x54,0x31,0x2B,0x35,0x66,0x62,0x76,0x71,0x39,0x76,0x7A, - 0x4F,0x50,0x5A,0x34,0x31,0x72,0x4F,0x4B,0x35,0x4C,0x42,0x73,0x38,0x65,0x64, - 0x54,0x79,0x39,0x65,0x6A,0x75,0x4D,0x55,0x64,0x39,0x78,0x55,0x33,0x51,0x43, - 0x69,0x39,0x76,0x74,0x48,0x70,0x38,0x78,0x30,0x6E,0x78,0x62,0x32,0x69,0x4B, - 0x53,0x51,0x20,0x79,0x30,0x39,0x42,0x4F,0x36,0x34,0x30,0x72,0x65,0x70,0x34, - 0x51,0x4E,0x55,0x4E,0x49,0x4D,0x38,0x31,0x4F,0x50,0x54,0x37,0x7A,0x58,0x53, - 0x66,0x6C,0x76,0x53,0x4B,0x35,0x44,0x45,0x36,0x5A,0x64,0x71,0x6D,0x34,0x2F, - 0x54,0x67,0x49,0x78,0x67,0x4E,0x56,0x4A,0x79,0x6B,0x47,0x4D,0x44,0x6A,0x4C, - 0x6F,0x56,0x66,0x4F,0x71,0x58,0x6A,0x74,0x30,0x56,0x79,0x36,0x52,0x33,0x31, - 0x20,0x2B,0x4F,0x6B,0x70,0x35,0x33,0x45,0x70,0x4A,0x77,0x33,0x45,0x52,0x52, - 0x49,0x4D,0x34,0x41,0x76,0x41,0x72,0x62,0x61,0x46,0x33,0x78,0x37,0x4D,0x61, - 0x4C,0x39,0x2B,0x6B,0x58,0x6A,0x65,0x4F,0x4A,0x74,0x78,0x50,0x62,0x4C,0x38, - 0x56,0x6F,0x77,0x57,0x4B,0x6B,0x71,0x31,0x6C,0x58,0x51,0x6A,0x38,0x47,0x65, - 0x32,0x68,0x51,0x63,0x6E,0x50,0x48,0x62,0x33,0x61,0x73,0x52,0x66,0x20,0x31, - 0x41,0x61,0x37,0x65,0x37,0x4D,0x4D,0x54,0x6A,0x68,0x46,0x71,0x6E,0x2B,0x47, - 0x30,0x55,0x54,0x46,0x71,0x4C,0x59,0x42,0x50,0x47,0x78,0x62,0x73,0x4C,0x43, - 0x75,0x76,0x34,0x52,0x6A,0x6E,0x59,0x53,0x6F,0x4B,0x4A,0x4F,0x2B,0x61,0x62, - 0x4F,0x4F,0x34,0x77,0x48,0x57,0x6D,0x6F,0x69,0x44,0x61,0x68,0x71,0x41,0x30, - 0x36,0x6A,0x2F,0x4B,0x36,0x65,0x7A,0x6E,0x43,0x37,0x39,0x20,0x7A,0x48,0x63, - 0x68,0x4B,0x73,0x72,0x70,0x4D,0x59,0x39,0x58,0x54,0x6A,0x74,0x46,0x72,0x52, - 0x57,0x64,0x46,0x61,0x69,0x57,0x41,0x61,0x7A,0x43,0x59,0x64,0x54,0x2F,0x78, - 0x48,0x6D,0x50,0x6E,0x30,0x66,0x62,0x6D,0x30,0x32,0x49,0x71,0x76,0x50,0x7A, - 0x4D,0x78,0x6E,0x58,0x70,0x65,0x6D,0x50,0x55,0x4B,0x47,0x74,0x78,0x4B,0x71, - 0x6C,0x71,0x67,0x64,0x74,0x43,0x30,0x37,0x36,0x20,0x38,0x4C,0x7A,0x37,0x67, - 0x67,0x73,0x68,0x45,0x6B,0x4F,0x41,0x61,0x63,0x4F,0x4F,0x33,0x56,0x64,0x72, - 0x6A,0x5A,0x52,0x43,0x4E,0x51,0x7A,0x67,0x67,0x38,0x41,0x66,0x32,0x68,0x5A, - 0x2B,0x75,0x53,0x2F,0x4C,0x38,0x4B,0x52,0x43,0x66,0x31,0x48,0x62,0x44,0x45, - 0x39,0x36,0x72,0x70,0x76,0x53,0x2F,0x69,0x46,0x47,0x4B,0x32,0x57,0x6C,0x47, - 0x67,0x5A,0x77,0x76,0x32,0x33,0x42,0x20,0x55,0x36,0x4D,0x65,0x62,0x32,0x72, - 0x4B,0x54,0x39,0x51,0x4A,0x62,0x35,0x37,0x4E,0x63,0x4D,0x6F,0x74,0x66,0x38, - 0x56,0x61,0x4B,0x31,0x47,0x70,0x74,0x4C,0x72,0x2B,0x46,0x4D,0x75,0x4E,0x50, - 0x66,0x30,0x41,0x6E,0x6A,0x2B,0x70,0x30,0x46,0x2F,0x55,0x44,0x77,0x47,0x6D, - 0x54,0x54,0x76,0x4D,0x43,0x6D,0x77,0x48,0x2F,0x72,0x68,0x73,0x46,0x61,0x4C, - 0x79,0x42,0x6D,0x44,0x74,0x20,0x61,0x48,0x76,0x37,0x4D,0x77,0x79,0x4D,0x4B, - 0x2F,0x51,0x58,0x39,0x63,0x58,0x41,0x75,0x4D,0x66,0x65,0x66,0x69,0x66,0x5A, - 0x6C,0x54,0x55,0x4B,0x71,0x4B,0x51,0x42,0x2F,0x44,0x6E,0x51,0x59,0x31,0x50, - 0x77,0x2F,0x4A,0x54,0x48,0x61,0x32,0x65,0x55,0x38,0x43,0x50,0x71,0x6B,0x39, - 0x66,0x4F,0x5A,0x46,0x31,0x4F,0x6F,0x31,0x36,0x48,0x30,0x55,0x35,0x5A,0x71, - 0x4A,0x51,0x42,0x20,0x64,0x41,0x47,0x66,0x74,0x79,0x33,0x38,0x30,0x71,0x6D, - 0x4D,0x45,0x6E,0x35,0x45,0x33,0x54,0x4C,0x70,0x6D,0x7A,0x62,0x75,0x77,0x4F, - 0x63,0x78,0x47,0x6F,0x71,0x64,0x53,0x68,0x6E,0x41,0x41,0x37,0x59,0x46,0x65, - 0x30,0x63,0x39,0x44,0x6D,0x68,0x72,0x4C,0x31,0x48,0x6E,0x48,0x42,0x6A,0x4B, - 0x75,0x43,0x35,0x6F,0x73,0x39,0x61,0x51,0x43,0x35,0x56,0x51,0x57,0x68,0x63, - 0x4F,0x20,0x36,0x59,0x33,0x4B,0x39,0x52,0x64,0x70,0x34,0x55,0x57,0x33,0x74, - 0x76,0x34,0x77,0x5A,0x59,0x67,0x43,0x4B,0x6D,0x45,0x41,0x39,0x39,0x6B,0x57, - 0x66,0x47,0x63,0x6F,0x77,0x78,0x6D,0x6C,0x2B,0x34,0x71,0x55,0x63,0x48,0x72, - 0x4D,0x63,0x7A,0x32,0x43,0x33,0x46,0x70,0x4C,0x74,0x6C,0x54,0x43,0x41,0x4B, - 0x78,0x47,0x4D,0x51,0x4E,0x67,0x6A,0x39,0x4A,0x39,0x52,0x63,0x70,0x34,0x20, - 0x35,0x58,0x54,0x47,0x5A,0x61,0x6F,0x37,0x39,0x68,0x6D,0x42,0x63,0x69,0x76, - 0x75,0x58,0x6D,0x43,0x6C,0x54,0x63,0x45,0x44,0x67,0x35,0x72,0x32,0x45,0x2B, - 0x6C,0x6A,0x59,0x4E,0x7A,0x6A,0x67,0x50,0x32,0x2B,0x41,0x53,0x73,0x78,0x6D, - 0x6F,0x71,0x4E,0x63,0x68,0x75,0x41,0x6E,0x76,0x35,0x43,0x7A,0x4D,0x47,0x65, - 0x4D,0x39,0x57,0x4C,0x41,0x73,0x71,0x70,0x75,0x67,0x38,0x43,0x20,0x31,0x39, - 0x6F,0x55,0x66,0x48,0x73,0x67,0x77,0x35,0x44,0x62,0x78,0x67,0x6C,0x43,0x31, - 0x41,0x31,0x44,0x45,0x78,0x35,0x76,0x32,0x35,0x39,0x72,0x63,0x53,0x30,0x78, - 0x72,0x68,0x45,0x6F,0x70,0x77,0x48,0x59,0x5A,0x2F,0x30,0x70,0x33,0x31,0x2B, - 0x6B,0x48,0x45,0x63,0x4E,0x78,0x42,0x59,0x46,0x6C,0x45,0x74,0x35,0x50,0x56, - 0x6A,0x6D,0x2F,0x42,0x38,0x5A,0x56,0x74,0x39,0x66,0x20,0x69,0x49,0x46,0x78, - 0x7A,0x2B,0x56,0x67,0x6B,0x65,0x31,0x59,0x5A,0x74,0x58,0x4F,0x52,0x62,0x6B, - 0x4D,0x34,0x44,0x2F,0x62,0x46,0x6E,0x54,0x4D,0x69,0x78,0x61,0x69,0x62,0x6E, - 0x48,0x55,0x67,0x72,0x58,0x47,0x4C,0x6B,0x57,0x35,0x31,0x48,0x65,0x50,0x54, - 0x61,0x48,0x54,0x59,0x78,0x34,0x6E,0x33,0x58,0x5A,0x4B,0x45,0x61,0x4A,0x75, - 0x4F,0x58,0x6E,0x65,0x63,0x7A,0x6C,0x5A,0x20,0x36,0x42,0x36,0x41,0x4A,0x31, - 0x34,0x5A,0x4C,0x2B,0x6C,0x76,0x6C,0x73,0x4D,0x41,0x37,0x67,0x42,0x57,0x32, - 0x78,0x52,0x38,0x58,0x55,0x39,0x2F,0x49,0x61,0x62,0x78,0x43,0x33,0x74,0x4E, - 0x72,0x4D,0x62,0x78,0x42,0x4F,0x32,0x5A,0x4B,0x49,0x63,0x43,0x72,0x5A,0x37, - 0x2B,0x34,0x7A,0x6B,0x34,0x35,0x4A,0x59,0x46,0x4A,0x55,0x54,0x64,0x63,0x2B, - 0x68,0x63,0x68,0x76,0x47,0x63,0x20,0x64,0x66,0x47,0x50,0x51,0x32,0x6C,0x52, - 0x51,0x4E,0x77,0x4B,0x37,0x41,0x49,0x2B,0x61,0x6C,0x50,0x77,0x6C,0x30,0x4D, - 0x5A,0x6E,0x65,0x73,0x6E,0x52,0x42,0x47,0x35,0x77,0x47,0x6A,0x44,0x6B,0x6F, - 0x39,0x53,0x34,0x76,0x71,0x41,0x75,0x41,0x33,0x67,0x44,0x74,0x75,0x43,0x2B, - 0x2B,0x7A,0x6E,0x50,0x59,0x56,0x49,0x46,0x59,0x37,0x61,0x73,0x4E,0x62,0x63, - 0x54,0x4D,0x53,0x74,0x20,0x77,0x72,0x74,0x74,0x43,0x76,0x57,0x4E,0x65,0x5A, - 0x7A,0x56,0x31,0x4A,0x38,0x51,0x4D,0x33,0x4A,0x32,0x33,0x48,0x50,0x5A,0x4F, - 0x2F,0x42,0x75,0x69,0x4E,0x34,0x4E,0x69,0x4E,0x4D,0x41,0x6C,0x6D,0x42,0x70, - 0x41,0x50,0x76,0x31,0x39,0x42,0x66,0x69,0x6B,0x6A,0x69,0x63,0x4B,0x33,0x67, - 0x33,0x52,0x6E,0x75,0x52,0x69,0x46,0x4F,0x4A,0x56,0x71,0x46,0x49,0x41,0x4B, - 0x35,0x4C,0x20,0x49,0x49,0x56,0x49,0x48,0x51,0x66,0x50,0x4F,0x61,0x30,0x50, - 0x69,0x4E,0x77,0x4E,0x71,0x4C,0x67,0x42,0x48,0x42,0x2F,0x78,0x58,0x45,0x59, - 0x35,0x68,0x55,0x67,0x6C,0x34,0x7A,0x6D,0x6A,0x46,0x55,0x73,0x53,0x59,0x51, - 0x43,0x33,0x32,0x78,0x54,0x53,0x30,0x31,0x38,0x49,0x4F,0x78,0x79,0x30,0x63, - 0x6A,0x74,0x45,0x47,0x77,0x65,0x49,0x53,0x34,0x32,0x62,0x73,0x45,0x6A,0x2B, - 0x20,0x38,0x51,0x4D,0x34,0x4C,0x41,0x4D,0x51,0x77,0x6F,0x72,0x44,0x35,0x7A, - 0x4B,0x32,0x5A,0x77,0x69,0x73,0x78,0x6D,0x6A,0x51,0x6D,0x62,0x6A,0x55,0x61, - 0x4C,0x58,0x77,0x52,0x2B,0x47,0x2F,0x45,0x50,0x59,0x34,0x64,0x67,0x4F,0x73, - 0x4E,0x46,0x68,0x4D,0x53,0x51,0x59,0x51,0x43,0x6A,0x6D,0x73,0x55,0x68,0x4B, - 0x50,0x6A,0x2B,0x6A,0x70,0x4C,0x34,0x51,0x4C,0x44,0x70,0x71,0x35,0x20,0x45, - 0x39,0x79,0x37,0x41,0x58,0x45,0x6F,0x73,0x67,0x76,0x59,0x5A,0x6C,0x50,0x51, - 0x38,0x59,0x68,0x6B,0x49,0x56,0x4B,0x50,0x67,0x32,0x61,0x32,0x45,0x53,0x45, - 0x72,0x4D,0x41,0x34,0x44,0x75,0x4E,0x6D,0x6D,0x30,0x50,0x43,0x6B,0x6B,0x6E, - 0x2B,0x45,0x63,0x4F,0x58,0x73,0x75,0x4F,0x64,0x79,0x4F,0x72,0x61,0x56,0x46, - 0x73,0x4E,0x55,0x7A,0x41,0x43,0x4F,0x32,0x76,0x64,0x6C,0x20,0x68,0x42,0x41, - 0x68,0x48,0x4C,0x52,0x54,0x4F,0x51,0x4D,0x49,0x39,0x54,0x56,0x75,0x73,0x53, - 0x6C,0x2F,0x62,0x46,0x67,0x47,0x49,0x45,0x51,0x55,0x48,0x4C,0x52,0x7A,0x43, - 0x37,0x69,0x4E,0x41,0x35,0x51,0x61,0x41,0x54,0x51,0x41,0x4E,0x38,0x35,0x56, - 0x4B,0x41,0x42,0x36,0x52,0x7A,0x55,0x41,0x4B,0x45,0x51,0x55,0x65,0x6B,0x65, - 0x74,0x73,0x77,0x4A,0x76,0x78,0x47,0x6A,0x53,0x20,0x6D,0x6C,0x4A,0x56,0x65, - 0x5A,0x56,0x4E,0x6F,0x59,0x46,0x78,0x54,0x66,0x38,0x4A,0x45,0x5A,0x58,0x78, - 0x48,0x43,0x37,0x37,0x5A,0x6C,0x70,0x70,0x73,0x6B,0x43,0x70,0x42,0x72,0x44, - 0x56,0x70,0x70,0x44,0x6A,0x49,0x59,0x68,0x43,0x69,0x43,0x49,0x63,0x4E,0x47, - 0x53,0x6C,0x79,0x51,0x49,0x56,0x4D,0x51,0x43,0x48,0x70,0x59,0x31,0x43,0x69, - 0x42,0x6C,0x77,0x30,0x46,0x44,0x35,0x20,0x44,0x53,0x41,0x30,0x79,0x48,0x43, - 0x44,0x54,0x58,0x6D,0x48,0x6A,0x51,0x36,0x46,0x45,0x44,0x50,0x67,0x6F,0x4B, - 0x45,0x62,0x77,0x48,0x34,0x67,0x73,0x4A,0x51,0x49,0x6F,0x42,0x6E,0x59,0x4F, - 0x46,0x63,0x68,0x50,0x34,0x42,0x42,0x7A,0x66,0x38,0x4C,0x55,0x52,0x4B,0x44, - 0x34,0x35,0x37,0x74,0x75,0x6F,0x43,0x4E,0x47,0x47,0x31,0x61,0x55,0x59,0x6F, - 0x42,0x57,0x41,0x30,0x32,0x20,0x6E,0x42,0x33,0x33,0x58,0x4E,0x59,0x31,0x43, - 0x79,0x46,0x6D,0x49,0x41,0x43,0x58,0x52,0x44,0x72,0x72,0x67,0x63,0x42,0x53, - 0x44,0x4D,0x44,0x71,0x33,0x4C,0x39,0x2B,0x50,0x66,0x32,0x46,0x69,0x41,0x55, - 0x48,0x4C,0x56,0x6C,0x70,0x45,0x30,0x6F,0x7A,0x41,0x4B,0x76,0x6C,0x68,0x7A, - 0x49,0x41,0x49,0x65,0x4C,0x42,0x51,0x55,0x76,0x57,0x53,0x34,0x50,0x4C,0x33, - 0x67,0x58,0x51,0x20,0x75,0x58,0x39,0x43,0x78,0x45,0x4D,0x35,0x63,0x67,0x47, - 0x63,0x44,0x53,0x41,0x30,0x75,0x72,0x6A,0x65,0x70,0x76,0x7A,0x67,0x68,0x4F, - 0x74,0x66,0x45,0x45,0x4C,0x4D,0x68,0x49,0x4F,0x57,0x31,0x6F,0x50,0x64,0x54, - 0x45,0x44,0x55,0x43,0x4B,0x41,0x42,0x57,0x44,0x4E,0x58,0x6F,0x51,0x41,0x59, - 0x6D,0x56,0x49,0x45,0x49,0x45,0x51,0x63,0x6A,0x45,0x78,0x5A,0x44,0x36,0x69, - 0x76,0x20,0x77,0x54,0x49,0x6C,0x4F,0x4B,0x6F,0x42,0x72,0x4C,0x51,0x70,0x4E, - 0x44,0x4A,0x70,0x50,0x58,0x55,0x68,0x68,0x4A,0x67,0x44,0x50,0x7A,0x43,0x61, - 0x73,0x73,0x52,0x4B,0x6F,0x31,0x45,0x4E,0x77,0x4F,0x70,0x73,0x38,0x75,0x48, - 0x4A,0x69,0x48,0x63,0x58,0x51,0x73,0x79,0x49,0x67,0x36,0x61,0x73,0x4E,0x46, - 0x70,0x57,0x41,0x7A,0x68,0x6E,0x37,0x31,0x5A,0x43,0x43,0x41,0x73,0x63,0x20, - 0x4E,0x46,0x56,0x57,0x41,0x37,0x41,0x36,0x2F,0x6C,0x73,0x52,0x67,0x42,0x44, - 0x78,0x34,0x71,0x41,0x70,0x4B,0x34,0x31,0x47,0x4E,0x51,0x43,0x72,0x76,0x63, - 0x66,0x47,0x63,0x34,0x6F,0x41,0x68,0x49,0x67,0x54,0x42,0x30,0x31,0x5A,0x61, - 0x62,0x53,0x73,0x67,0x34,0x44,0x6E,0x70,0x79,0x4C,0x65,0x58,0x51,0x67,0x78, - 0x49,0x77,0x36,0x61,0x4B,0x75,0x73,0x67,0x59,0x49,0x64,0x4E,0x20,0x6F,0x51, - 0x6C,0x66,0x45,0x59,0x41,0x51,0x63,0x65,0x4B,0x67,0x4B,0x53,0x75,0x4E,0x6C, - 0x72,0x6B,0x4C,0x45,0x50,0x48,0x75,0x51,0x6F,0x67,0x5A,0x63,0x64,0x42,0x55, - 0x57,0x62,0x73,0x41,0x6C,0x68,0x46,0x41,0x78,0x4C,0x73,0x4C,0x49,0x57,0x62, - 0x45,0x51,0x56,0x4E,0x6C,0x6A,0x51,0x42,0x61,0x62,0x51,0x70,0x4E,0x79,0x51, - 0x43,0x45,0x69,0x42,0x55,0x48,0x54,0x56,0x6C,0x70,0x20,0x4E,0x4B,0x6F,0x42, - 0x74,0x4E,0x6B,0x55,0x6D,0x74,0x49,0x59,0x67,0x42,0x43,0x78,0x34,0x71,0x41, - 0x70,0x4B,0x34,0x30,0x36,0x47,0x55,0x42,0x6F,0x63,0x55,0x47,0x54,0x54,0x66, - 0x6D,0x63,0x30,0x6F,0x43,0x46,0x69,0x42,0x55,0x48,0x53,0x57,0x56,0x68,0x37, - 0x67,0x56,0x42,0x55,0x53,0x49,0x41,0x44,0x32,0x69,0x78,0x4B,0x53,0x67,0x44, - 0x45,0x43,0x4A,0x65,0x4A,0x75,0x32,0x37,0x20,0x41,0x50,0x4D,0x78,0x57,0x72, - 0x30,0x6B,0x4F,0x71,0x31,0x44,0x69,0x42,0x51,0x6A,0x41,0x78,0x41,0x69,0x78, - 0x63,0x67,0x41,0x68,0x4B,0x67,0x68,0x47,0x75,0x30,0x56,0x4F,0x34,0x4C,0x46, - 0x6B,0x45,0x45,0x55,0x41,0x77,0x69,0x41,0x4D,0x5A,0x75,0x43,0x57,0x55,0x30, - 0x43,0x43,0x42,0x45,0x72,0x44,0x70,0x4C,0x4B,0x41,0x64,0x79,0x2F,0x35,0x64, - 0x49,0x37,0x68,0x44,0x73,0x5A,0x20,0x51,0x4F,0x68,0x6D,0x56,0x70,0x73,0x54, - 0x79,0x51,0x43,0x45,0x69,0x4A,0x65,0x4D,0x76,0x61,0x61,0x73,0x4E,0x42,0x71, - 0x31,0x43,0x7A,0x42,0x73,0x55,0x36,0x67,0x68,0x6F,0x32,0x6B,0x41,0x49,0x65, - 0x4C,0x45,0x51,0x56,0x4F,0x6A,0x4E,0x6F,0x57,0x69,0x47,0x6F,0x44,0x56,0x7A, - 0x52,0x73,0x30,0x77,0x69,0x42,0x45,0x72,0x43,0x51,0x6C,0x41,0x68,0x69,0x30, - 0x4B,0x64,0x51,0x6B,0x20,0x41,0x78,0x41,0x69,0x56,0x68,0x77,0x30,0x5A,0x61, - 0x58,0x52,0x71,0x42,0x4C,0x74,0x74,0x79,0x6E,0x55,0x6E,0x49,0x31,0x34,0x64, - 0x79,0x48,0x45,0x6A,0x44,0x68,0x6F,0x79,0x6B,0x71,0x6A,0x5A,0x59,0x34,0x41, - 0x4E,0x41,0x59,0x67,0x52,0x4A,0x77,0x34,0x61,0x4B,0x71,0x73,0x45,0x63,0x42, - 0x78,0x6D,0x30,0x4C,0x7A,0x72,0x48,0x59,0x6D,0x46,0x30,0x4C,0x59,0x30,0x6D, - 0x71,0x76,0x20,0x71,0x5A,0x4D,0x32,0x68,0x63,0x72,0x63,0x42,0x56,0x41,0x45, - 0x49,0x45,0x53,0x63,0x74,0x4E,0x68,0x72,0x71,0x73,0x2B,0x6D,0x55,0x46,0x51, - 0x44,0x4F,0x47,0x4A,0x54,0x71,0x4B,0x30,0x78,0x34,0x74,0x32,0x46,0x45,0x44, - 0x50,0x69,0x6F,0x43,0x6B,0x72,0x6A,0x55,0x59,0x31,0x67,0x49,0x4D,0x32,0x68, - 0x64,0x6F,0x62,0x46,0x51,0x45,0x49,0x45,0x53,0x63,0x4F,0x6D,0x72,0x4C,0x53, - 0x20,0x61,0x46,0x6B,0x6A,0x67,0x50,0x6D,0x4B,0x41,0x49,0x53,0x49,0x46,0x51, - 0x64,0x4E,0x6C,0x54,0x55,0x43,0x73,0x4F,0x77,0x43,0x42,0x43,0x36,0x35,0x79, - 0x30,0x4B,0x49,0x53,0x35,0x44,0x78,0x6A,0x4B,0x59,0x73,0x4B,0x61,0x73,0x42, - 0x54,0x41,0x47,0x48,0x35,0x69,0x72,0x6B,0x34,0x56,0x52,0x68,0x49,0x63,0x51, - 0x6C,0x6D,0x4E,0x39,0x67,0x2F,0x55,0x41,0x39,0x68,0x4E,0x48,0x6F,0x20,0x6E, - 0x44,0x67,0x62,0x51,0x47,0x68,0x42,0x30,0x44,0x36,0x62,0x38,0x68,0x31,0x57, - 0x6D,0x34,0x63,0x4A,0x49,0x65,0x62,0x43,0x51,0x55,0x76,0x37,0x59,0x4F,0x36, - 0x56,0x67,0x46,0x44,0x61,0x66,0x67,0x42,0x76,0x32,0x42,0x54,0x71,0x62,0x46, - 0x59,0x45,0x49,0x45,0x51,0x63,0x4F,0x47,0x6A,0x4A,0x53,0x70,0x74,0x51,0x6D, - 0x67,0x48,0x73,0x74,0x53,0x6E,0x55,0x4A,0x51,0x4D,0x51,0x20,0x49,0x68,0x59, - 0x63,0x74,0x47,0x53,0x6C,0x54,0x61,0x69,0x41,0x41,0x53,0x79,0x55,0x41,0x51, - 0x67,0x52,0x43,0x77,0x35,0x61,0x71,0x6F,0x67,0x42,0x57,0x49,0x55,0x5A,0x43, - 0x35,0x73,0x31,0x45,0x79,0x42,0x45,0x71,0x58,0x67,0x6B,0x4C,0x77,0x49,0x34, - 0x44,0x37,0x77,0x35,0x56,0x36,0x47,0x73,0x42,0x78,0x32,0x4B,0x41,0x6F,0x51, - 0x6F,0x69,0x59,0x37,0x6D,0x77,0x48,0x59,0x76,0x20,0x67,0x44,0x65,0x42,0x53, - 0x78,0x38,0x47,0x45,0x43,0x4B,0x53,0x41,0x59,0x52,0x47,0x46,0x31,0x2B,0x79, - 0x4B,0x62,0x2B,0x6B,0x52,0x51,0x59,0x67,0x52,0x43,0x6B,0x34,0x61,0x4F,0x67, - 0x6C,0x73,0x4A,0x73,0x42,0x67,0x4E,0x4A,0x33,0x42,0x64,0x35,0x74,0x55,0x32, - 0x68,0x70,0x71,0x77,0x78,0x41,0x69,0x46,0x4A,0x77,0x30,0x4A,0x43,0x56,0x4A, - 0x67,0x74,0x55,0x78,0x41,0x43,0x36,0x20,0x5A,0x51,0x42,0x43,0x6C,0x49,0x53, - 0x44,0x68,0x69,0x70,0x71,0x41,0x4E,0x61,0x35,0x41,0x4E,0x6F,0x64,0x53,0x49, - 0x68,0x6F,0x4E,0x47,0x66,0x4C,0x6B,0x77,0x4D,0x41,0x70,0x52,0x76,0x41,0x46, - 0x50,0x44,0x69,0x58,0x49,0x55,0x38,0x6F,0x4C,0x74,0x56,0x5A,0x34,0x55,0x4C, - 0x45,0x59,0x58,0x75,0x56,0x74,0x39,0x32,0x4A,0x75,0x31,0x46,0x4C,0x46,0x4F, - 0x41,0x43,0x30,0x51,0x32,0x20,0x67,0x4E,0x41,0x67,0x77,0x2F,0x4D,0x32,0x35, - 0x53,0x39,0x72,0x55,0x7A,0x64,0x41,0x69,0x43,0x67,0x34,0x61,0x4F,0x64,0x35, - 0x73,0x42,0x38,0x41,0x68,0x48,0x69,0x4F,0x42,0x6E,0x76,0x42,0x70,0x74,0x43, - 0x71,0x2B,0x54,0x49,0x41,0x49,0x61,0x4C,0x67,0x6F,0x42,0x30,0x72,0x4C,0x59, - 0x61,0x70,0x6D,0x41,0x47,0x30,0x4E,0x51,0x62,0x4B,0x43,0x68,0x54,0x43,0x6B, - 0x59,0x58,0x4E,0x20,0x67,0x63,0x75,0x4B,0x32,0x71,0x6F,0x59,0x51,0x44,0x2F, - 0x77,0x59,0x35,0x75,0x43,0x79,0x7A,0x51,0x62,0x49,0x49,0x51,0x54,0x44,0x70, - 0x72,0x35,0x4D,0x5A,0x5A,0x37,0x64,0x59,0x59,0x70,0x79,0x51,0x42,0x43,0x66, - 0x59,0x31,0x64,0x4E,0x75,0x56,0x58,0x74,0x57,0x6B,0x67,0x55,0x41,0x67,0x58, - 0x48,0x44,0x53,0x7A,0x43,0x39,0x7A,0x36,0x2F,0x78,0x44,0x66,0x38,0x65,0x41, - 0x37,0x20,0x62,0x51,0x71,0x74,0x6E,0x4B,0x2F,0x70,0x51,0x43,0x46,0x73,0x61, - 0x63,0x34,0x61,0x7A,0x56,0x68,0x69,0x70,0x63,0x46,0x69,0x34,0x6A,0x4B,0x41, - 0x76,0x56,0x68,0x73,0x51,0x5A,0x54,0x78,0x59,0x4C,0x57,0x69,0x41,0x43,0x47, - 0x73,0x57,0x4E,0x33,0x6D,0x32,0x2B,0x62,0x2F,0x48,0x38,0x46,0x68,0x41,0x56, - 0x43,0x59,0x4F,0x45,0x2F,0x76,0x73,0x78,0x71,0x41,0x36,0x47,0x6D,0x58,0x20, - 0x41,0x51,0x68,0x68,0x67,0x34,0x4E,0x57,0x58,0x67,0x44,0x33,0x38,0x42,0x2F, - 0x69,0x4E,0x51,0x43,0x72,0x45,0x4F,0x53,0x79,0x4E,0x6E,0x55,0x44,0x68,0x4A, - 0x69,0x4C,0x35,0x71,0x7A,0x54,0x2F,0x48,0x2B,0x6B,0x38,0x42,0x2F,0x69,0x4E, - 0x59,0x42,0x6E,0x62,0x41,0x70,0x35,0x4B,0x41,0x6F,0x51,0x59,0x69,0x35,0x36, - 0x32,0x71,0x32,0x7A,0x2F,0x38,0x42,0x53,0x65,0x7A,0x4D,0x52,0x20,0x70,0x77, - 0x48,0x30,0x41,0x54,0x74,0x73,0x43,0x71,0x37,0x72,0x6B,0x41,0x45,0x49,0x63, - 0x53,0x6B,0x63,0x4E,0x4C,0x49,0x44,0x79,0x32,0x50,0x41,0x5A,0x69,0x4A,0x4F, - 0x41,0x77,0x42,0x34,0x79,0x71,0x5A,0x51,0x64,0x32,0x74,0x41,0x52,0x35,0x4E, - 0x79,0x41,0x6F,0x53,0x59,0x69,0x59,0x36,0x6D,0x77,0x47,0x58,0x31,0x33,0x31, - 0x4D,0x51,0x72,0x66,0x38,0x50,0x38,0x52,0x75,0x41,0x20,0x56,0x54,0x34,0x41, - 0x77,0x4D,0x61,0x46,0x69,0x67,0x4B,0x45,0x6D,0x49,0x6B,0x4E,0x6E,0x55,0x37, - 0x61,0x73,0x4E,0x62,0x63,0x54,0x4D,0x52,0x74,0x41,0x50,0x33,0x41,0x64,0x32, - 0x77,0x4B,0x72,0x6C,0x76,0x67,0x6B,0x39,0x56,0x6D,0x67,0x55,0x4A,0x4D,0x49, - 0x2B,0x76,0x42,0x6C,0x66,0x62,0x68,0x2F,0x33,0x65,0x49,0x6B,0x50,0x30,0x58, - 0x4A,0x6D,0x34,0x44,0x41,0x50,0x69,0x57,0x20,0x54,0x61,0x48,0x6D,0x4C,0x4B, - 0x7A,0x52,0x59,0x4B,0x41,0x51,0x30,0x31,0x6A,0x54,0x37,0x72,0x76,0x4D,0x6B, - 0x6E,0x30,0x4C,0x6F,0x6F,0x66,0x2F,0x55,0x42,0x34,0x44,0x32,0x41,0x6D,0x63, - 0x74,0x43,0x6C,0x34,0x64,0x5A,0x63,0x4D,0x51,0x49,0x67,0x77,0x56,0x39,0x6C, - 0x33,0x6A,0x55,0x39,0x53,0x77,0x76,0x52,0x66,0x67,0x58,0x49,0x59,0x41,0x4D, - 0x43,0x54,0x4E,0x6F,0x57,0x57,0x20,0x74,0x41,0x51,0x73,0x6D,0x36,0x66,0x42, - 0x51,0x43,0x45,0x41,0x6C,0x73,0x30,0x4C,0x58,0x50,0x62,0x2B,0x2B,0x78,0x71, - 0x55,0x39,0x76,0x53,0x48,0x38,0x68,0x6D,0x41,0x56,0x54,0x63,0x41,0x59,0x4A, - 0x4F,0x69,0x41,0x43,0x45,0x41,0x5A,0x79,0x31,0x38,0x4D,0x34,0x36,0x2F,0x57, - 0x53,0x34,0x44,0x4F,0x49,0x68,0x6C,0x65,0x4C,0x4B,0x71,0x7A,0x64,0x66,0x35, - 0x67,0x53,0x4C,0x31,0x20,0x64,0x44,0x51,0x46,0x4C,0x69,0x76,0x2F,0x64,0x6D, - 0x49,0x30,0x56,0x6A,0x4C,0x6C,0x4D,0x67,0x43,0x41,0x4A,0x32,0x77,0x4B,0x65, - 0x63,0x41,0x6D,0x54,0x51,0x6D,0x4B,0x6C,0x50,0x4F,0x65,0x4C,0x71,0x66,0x4D, - 0x50,0x79,0x74,0x74,0x32,0x56,0x42,0x4F,0x41,0x33,0x67,0x61,0x65,0x4E,0x57, - 0x6D,0x34,0x4A,0x57,0x64,0x50,0x75,0x33,0x32,0x75,0x35,0x34,0x49,0x55,0x56, - 0x65,0x30,0x20,0x4E,0x77,0x5A,0x63,0x61,0x54,0x2F,0x33,0x2F,0x79,0x70,0x47, - 0x57,0x37,0x46,0x51,0x54,0x67,0x4D,0x41,0x68,0x79,0x6A,0x67,0x75,0x73,0x57, - 0x4B,0x41,0x6B,0x51,0x36,0x75,0x57,0x35,0x78,0x64,0x5A,0x37,0x2B,0x55,0x48, - 0x34,0x44,0x2B,0x44,0x2B,0x32,0x42,0x64,0x64,0x31,0x2B,0x45,0x6F,0x50,0x46, - 0x71,0x6D,0x6A,0x6F,0x79,0x6C,0x77,0x58,0x52,0x74,0x6A,0x72,0x53,0x6B,0x62, - 0x20,0x79,0x6D,0x30,0x41,0x2F,0x63,0x43,0x44,0x4E,0x67,0x55,0x39,0x59,0x49, - 0x75,0x69,0x41,0x4A,0x45,0x79,0x74,0x72,0x67,0x39,0x2F,0x52,0x2B,0x69,0x78, - 0x4D,0x79,0x2F,0x59,0x73,0x70,0x74,0x41,0x41,0x42,0x66,0x74,0x53,0x33,0x59, - 0x73,0x38,0x42,0x6E,0x6B,0x51,0x34,0x53,0x46,0x53,0x6C,0x68,0x55,0x55,0x74, - 0x41,0x7A,0x77,0x4B,0x6E,0x68,0x39,0x37,0x6A,0x63,0x64,0x65,0x68,0x20,0x45, - 0x67,0x62,0x51,0x44,0x33,0x7A,0x4F,0x70,0x71,0x41,0x48,0x62,0x4F,0x33,0x4F, - 0x6C,0x62,0x63,0x32,0x51,0x69,0x53,0x45,0x72,0x64,0x30,0x35,0x6C,0x36,0x66, - 0x2F,0x35,0x34,0x6A,0x35,0x36,0x51,0x2B,0x56,0x4D,0x51,0x43,0x41,0x4C,0x39, - 0x6B,0x57,0x37,0x47,0x34,0x4E,0x75,0x4D,0x4C,0x4E,0x46,0x59,0x57,0x6F,0x4F, - 0x61,0x35,0x59,0x34,0x4C,0x73,0x65,0x6D,0x6D,0x75,0x74,0x20,0x49,0x52,0x63, - 0x71,0x5A,0x51,0x44,0x39,0x6D,0x50,0x36,0x4C,0x46,0x54,0x63,0x73,0x39,0x57, - 0x6D,0x73,0x56,0x4D,0x32,0x45,0x71,0x44,0x43,0x4E,0x47,0x64,0x50,0x47,0x48, - 0x59,0x69,0x39,0x37,0x31,0x2B,0x67,0x6B,0x6A,0x4B,0x7A,0x37,0x72,0x2F,0x4D, - 0x61,0x77,0x69,0x34,0x52,0x69,0x6E,0x43,0x6F,0x6B,0x37,0x5A,0x31,0x4A,0x56, - 0x6A,0x58,0x6F,0x50,0x54,0x30,0x7A,0x2F,0x32,0x20,0x76,0x6E,0x2B,0x42,0x53, - 0x68,0x71,0x41,0x39,0x59,0x77,0x41,0x77,0x4C,0x57,0x4C,0x63,0x70,0x6F,0x57, - 0x46,0x48,0x56,0x48,0x5A,0x33,0x50,0x41,0x35,0x6B,0x56,0x4F,0x44,0x37,0x63, - 0x48,0x4B,0x64,0x50,0x54,0x48,0x79,0x70,0x72,0x41,0x41,0x42,0x66,0x77,0x48, - 0x4B,0x4E,0x51,0x4D,0x61,0x44,0x57,0x35,0x59,0x37,0x44,0x5A,0x49,0x49,0x6B, - 0x57,0x67,0x38,0x34,0x4F,0x5A,0x6C,0x20,0x4F,0x64,0x75,0x39,0x2F,0x73,0x46, - 0x6F,0x35,0x51,0x74,0x6C,0x71,0x78,0x43,0x56,0x4E,0x77,0x42,0x77,0x79,0x47, - 0x54,0x71,0x62,0x67,0x31,0x63,0x74,0x30,0x63,0x53,0x49,0x72,0x46,0x73,0x58, - 0x4F,0x67,0x38,0x38,0x42,0x64,0x72,0x31,0x74,0x39,0x4D,0x56,0x4D,0x4D,0x41, - 0x6E,0x67,0x62,0x2B,0x33,0x72,0x62,0x77,0x65,0x35,0x63,0x36,0x39,0x35,0x65, - 0x45,0x53,0x42,0x7A,0x7A,0x20,0x47,0x67,0x4B,0x75,0x58,0x2B,0x49,0x30,0x78, - 0x66,0x33,0x33,0x78,0x4A,0x6A,0x7A,0x50,0x78,0x76,0x56,0x47,0x6D,0x76,0x2F, - 0x4F,0x39,0x75,0x43,0x6A,0x52,0x6E,0x59,0x74,0x6B,0x4A,0x64,0x41,0x56,0x47, - 0x37,0x65,0x4A,0x67,0x32,0x37,0x44,0x69,0x7A,0x39,0x54,0x66,0x6C,0x71,0x63, - 0x31,0x30,0x71,0x6D,0x55,0x41,0x2B,0x33,0x47,0x59,0x46,0x6C,0x77,0x78,0x54, - 0x37,0x4D,0x43,0x20,0x6F,0x6E,0x61,0x35,0x70,0x73,0x74,0x6E,0x68,0x64,0x76, - 0x4F,0x56,0x77,0x38,0x42,0x42,0x38,0x70,0x55,0x6E,0x57,0x6C,0x55,0x63,0x37, - 0x62,0x39,0x55,0x65,0x44,0x37,0x74,0x6F,0x57,0x76,0x58,0x35,0x4A,0x54,0x6D, - 0x72,0x43,0x6F,0x4F,0x52,0x61,0x31,0x4F,0x49,0x66,0x2B,0x75,0x7A,0x44,0x61, - 0x71,0x41,0x6A,0x56,0x54,0x72,0x65,0x78,0x2F,0x6F,0x64,0x6D,0x50,0x4C,0x68, - 0x74,0x20,0x52,0x55,0x35,0x62,0x69,0x59,0x75,0x61,0x49,0x5A,0x74,0x76,0x73, - 0x77,0x36,0x6A,0x2F,0x67,0x42,0x2F,0x57,0x61,0x62,0x71,0x7A,0x45,0x69,0x31, - 0x44,0x65,0x44,0x66,0x67,0x43,0x2F,0x61,0x46,0x75,0x35,0x6F,0x43,0x6E,0x6A, - 0x66,0x4D,0x71,0x30,0x56,0x45,0x4C,0x58,0x42,0x2B,0x35,0x59,0x35,0x35,0x37, - 0x4A,0x38,0x45,0x58,0x69,0x78,0x54,0x4E,0x57,0x5A,0x6B,0x57,0x6F,0x62,0x20, - 0x41,0x4D,0x43,0x6E,0x4D,0x55,0x5A,0x67,0x78,0x5A,0x55,0x64,0x50,0x68,0x73, - 0x31,0x4E,0x53,0x67,0x53,0x7A,0x73,0x5A,0x4F,0x33,0x2B,0x57,0x41,0x44,0x7A, - 0x41,0x61,0x2B,0x48,0x53,0x5A,0x71,0x6A,0x4D,0x72,0x53,0x54,0x41,0x41,0x67, - 0x45,0x2B,0x36,0x46,0x4C,0x36,0x78,0x4F,0x2B,0x65,0x79,0x66,0x62,0x49,0x51, - 0x46,0x57,0x56,0x70,0x61,0x38,0x43,0x4E,0x37,0x71,0x74,0x61,0x20,0x6E,0x54, - 0x51,0x51,0x46,0x30,0x6B,0x78,0x67,0x4E,0x64,0x77,0x6D,0x42,0x58,0x49,0x65, - 0x50,0x41,0x62,0x4B,0x33,0x4F,0x30,0x32,0x4A,0x2B,0x67,0x49,0x6B,0x52,0x46, - 0x61,0x4D,0x6D,0x61,0x74,0x75,0x6E,0x59,0x37,0x33,0x38,0x49,0x6F,0x34,0x47, - 0x4B,0x55,0x33,0x55,0x44,0x2B,0x4D,0x5A,0x62,0x6A,0x59,0x55,0x66,0x48,0x38, - 0x58,0x68,0x6F,0x4D,0x4E,0x35,0x44,0x51,0x45,0x66,0x20,0x57,0x44,0x57,0x6C, - 0x51,0x55,0x47,0x52,0x47,0x4C,0x49,0x65,0x66,0x47,0x44,0x56,0x6C,0x47,0x76, - 0x69,0x57,0x6B,0x56,0x48,0x2F,0x59,0x75,0x70,0x75,0x67,0x48,0x41,0x4E,0x42, - 0x50,0x34,0x49,0x2B,0x43,0x55,0x37,0x66,0x75,0x57,0x74,0x41,0x54,0x63,0x75, - 0x6C,0x79,0x44,0x67,0x69,0x49,0x5A,0x33,0x4C,0x6F,0x38,0x78,0x78,0x4B,0x33, - 0x71,0x65,0x70,0x54,0x6D,0x44,0x5A,0x66,0x20,0x4E,0x52,0x4A,0x68,0x41,0x43, - 0x45,0x4F,0x41,0x52,0x39,0x7A,0x65,0x63,0x50,0x61,0x42,0x62,0x37,0x72,0x50, - 0x4B,0x73,0x51,0x73,0x58,0x50,0x39,0x6B,0x68,0x78,0x72,0x33,0x54,0x65,0x79, - 0x2B,0x52,0x69,0x6D,0x7A,0x56,0x65,0x4E,0x78,0x42,0x68,0x41,0x4B,0x41,0x70, - 0x34,0x44,0x6F,0x66,0x78,0x41,0x49,0x44,0x4E,0x69,0x7A,0x51,0x7A,0x49,0x4B, - 0x72,0x48,0x78,0x6B,0x37,0x66,0x20,0x64,0x59,0x6B,0x76,0x6D,0x44,0x62,0x2B, - 0x58,0x42,0x6D,0x71,0x34,0x30,0x52,0x69,0x44,0x41,0x43,0x69,0x6A,0x77,0x63, - 0x41,0x62,0x46,0x32,0x57,0x6F,0x30,0x66,0x48,0x6A,0x59,0x73,0x4B,0x30,0x39, - 0x50,0x75,0x73,0x39,0x55,0x39,0x4E,0x36,0x57,0x71,0x2F,0x66,0x34,0x77,0x69, - 0x54,0x49,0x41,0x75,0x47,0x67,0x38,0x34,0x4C,0x44,0x74,0x2B,0x7A,0x7A,0x67, - 0x2F,0x53,0x74,0x79,0x20,0x72,0x47,0x72,0x54,0x39,0x4B,0x43,0x6F,0x44,0x4B, - 0x76,0x61,0x41,0x74,0x37,0x76,0x76,0x6C,0x44,0x74,0x4D,0x50,0x6C,0x2B,0x66, - 0x36,0x69,0x74,0x56,0x34,0x33,0x45,0x47,0x55,0x43,0x49,0x51,0x38,0x42,0x2F, - 0x63,0x6E,0x6D,0x44,0x6D,0x52,0x36,0x63,0x63,0x6C,0x31,0x34,0x49,0x59,0x51, - 0x7A,0x4B,0x2B,0x59,0x46,0x2F,0x4D,0x62,0x4B,0x4B,0x64,0x66,0x70,0x50,0x6A, - 0x42,0x74,0x20,0x2B,0x6C,0x44,0x73,0x46,0x59,0x70,0x49,0x49,0x67,0x30,0x67, - 0x35,0x49,0x7A,0x2F,0x48,0x37,0x6A,0x4C,0x35,0x62,0x32,0x46,0x71,0x52,0x67, - 0x6C,0x43,0x6F,0x6C,0x79,0x73,0x62,0x51,0x31,0x38,0x68,0x54,0x30,0x58,0x5A, - 0x67,0x32,0x6E,0x59,0x69,0x6E,0x50,0x79,0x54,0x55,0x41,0x47,0x44,0x61,0x42, - 0x2F,0x54,0x50,0x77,0x4A,0x2B,0x34,0x76,0x44,0x66,0x72,0x77,0x5A,0x32,0x72, - 0x20,0x46,0x41,0x6D,0x49,0x2B,0x46,0x6B,0x78,0x4C,0x2B,0x44,0x4F,0x61,0x4F, - 0x4C,0x2F,0x45,0x30,0x78,0x62,0x54,0x6F,0x7A,0x34,0x49,0x63,0x45,0x47,0x41, - 0x4E,0x4D,0x2B,0x71,0x43,0x38,0x42,0x58,0x33,0x46,0x35,0x62,0x32,0x50,0x47, - 0x52,0x41,0x49,0x61,0x45,0x78,0x42,0x78,0x73,0x61,0x72,0x4E,0x50,0x50,0x6B, - 0x6A,0x62,0x46,0x6E,0x2F,0x46,0x66,0x4C,0x37,0x2B,0x69,0x64,0x4A,0x20,0x2F, - 0x4A,0x42,0x77,0x41,0x34,0x42,0x70,0x48,0x39,0x67,0x44,0x57,0x47,0x34,0x6F, - 0x57,0x69,0x44,0x72,0x77,0x57,0x2B,0x75,0x6E,0x4E,0x4C,0x73,0x67,0x43,0x69, - 0x5A,0x6E,0x6E,0x61,0x66,0x33,0x31,0x77,0x5A,0x36,0x63,0x6D,0x2F,0x45,0x39, - 0x4E,0x32,0x45,0x79,0x64,0x2B,0x71,0x41,0x45,0x44,0x67,0x49,0x74,0x6D,0x42, - 0x6E,0x37,0x69,0x38,0x74,0x36,0x4D,0x42,0x37,0x65,0x74,0x20,0x7A,0x48,0x48, - 0x56,0x51,0x70,0x6D,0x41,0x69,0x4D,0x5A,0x56,0x43,0x33,0x31,0x75,0x63,0x38, - 0x2F,0x76,0x42,0x39,0x4E,0x57,0x45,0x7A,0x50,0x69,0x50,0x78,0x4D,0x31,0x59, - 0x51,0x41,0x68,0x6A,0x67,0x4B,0x2F,0x42,0x2B,0x78,0x78,0x65,0x56,0x50,0x68, - 0x7A,0x45,0x46,0x6C,0x44,0x41,0x70,0x58,0x72,0x6C,0x2B,0x53,0x63,0x7A,0x33, - 0x44,0x72,0x38,0x41,0x65,0x54,0x46,0x73,0x39,0x20,0x47,0x6E,0x65,0x64,0x34, - 0x71,0x52,0x6D,0x44,0x43,0x44,0x6B,0x6F,0x49,0x63,0x77,0x55,0x79,0x6C,0x76, - 0x75,0x64,0x35,0x6A,0x38,0x79,0x4B,0x66,0x32,0x31,0x64,0x71,0x56,0x79,0x45, - 0x78,0x4E,0x31,0x6B,0x50,0x62,0x6C,0x2B,0x5A,0x69,0x35,0x4C,0x68,0x42,0x36, - 0x5A,0x74,0x76,0x6A,0x76,0x64,0x6C,0x39,0x53,0x6E,0x50,0x39,0x53,0x51,0x41, - 0x63,0x43,0x30,0x44,0x2F,0x49,0x41,0x20,0x38,0x4E,0x73,0x34,0x4A,0x41,0x6F, - 0x56,0x36,0x47,0x6E,0x33,0x32,0x58,0x37,0x35,0x46,0x4B,0x30,0x4E,0x63,0x64, - 0x5A,0x4D,0x31,0x42,0x4F,0x74,0x44,0x62,0x44,0x39,0x38,0x73,0x68,0x6A,0x52, - 0x34,0x63,0x78,0x62,0x66,0x4D,0x41,0x4A,0x46,0x76,0x38,0x55,0x47,0x4D,0x47, - 0x41,0x42,0x65,0x5A,0x77,0x41,0x65,0x49,0x45,0x41,0x6B,0x73,0x61,0x51,0x6E, - 0x34,0x38,0x42,0x72,0x6C,0x20,0x43,0x6F,0x69,0x4C,0x57,0x64,0x70,0x71,0x32, - 0x6F,0x62,0x6A,0x71,0x72,0x34,0x43,0x62,0x32,0x48,0x61,0x5A,0x45,0x32,0x49, - 0x48,0x32,0x72,0x51,0x41,0x47,0x44,0x61,0x42,0x37,0x73,0x66,0x34,0x37,0x5A, - 0x4F,0x59,0x77,0x4A,0x67,0x39,0x68,0x50,0x59,0x76,0x6E,0x70,0x4B,0x69,0x34, - 0x6A,0x45,0x75,0x32,0x7A,0x73,0x39,0x4E,0x6D,0x2B,0x32,0x6E,0x6B,0x39,0x66, - 0x34,0x45,0x39,0x20,0x6D,0x4C,0x61,0x34,0x48,0x32,0x70,0x44,0x2F,0x46,0x43, - 0x6A,0x42,0x67,0x41,0x58,0x52,0x51,0x49,0x66,0x77,0x58,0x46,0x32,0x41,0x4D, - 0x77,0x4D,0x77,0x55,0x33,0x4C,0x63,0x6D,0x78,0x62,0x72,0x6E,0x47,0x42,0x4E, - 0x4A,0x50,0x31,0x59,0x4E,0x76,0x79,0x48,0x44,0x65,0x35,0x6E,0x64,0x73,0x58, - 0x35,0x69,0x65,0x59,0x4E,0x6C,0x67,0x7A,0x54,0x2F,0x34,0x43,0x4E,0x57,0x73, - 0x41,0x20,0x63,0x4E,0x48,0x41,0x34,0x4D,0x64,0x77,0x7A,0x42,0x4D,0x6F,0x73, - 0x4B,0x37,0x44,0x35,0x36,0x36,0x65,0x4B,0x52,0x62,0x72,0x33,0x49,0x48,0x55, - 0x73,0x61,0x67,0x6C,0x34,0x4B,0x36,0x65,0x4B,0x64,0x61,0x35,0x62,0x65,0x41, - 0x5A,0x5A,0x69,0x65,0x68,0x64,0x66,0x32,0x31,0x4A,0x48,0x36,0x6F,0x63,0x51, - 0x4F,0x41,0x61,0x52,0x2F,0x34,0x55,0x55,0x77,0x49,0x35,0x70,0x51,0x78,0x20, - 0x57,0x4B,0x43,0x6A,0x4B,0x65,0x42,0x44,0x6C,0x30,0x39,0x46,0x48,0x66,0x55, - 0x56,0x4E,0x63,0x6A,0x6D,0x52,0x54,0x36,0x2F,0x63,0x2F,0x6C,0x55,0x4B,0x63, - 0x66,0x51,0x66,0x77,0x58,0x54,0x35,0x6F,0x35,0x43,0x37,0x59,0x6B,0x66,0x6F, - 0x43,0x37,0x47,0x77,0x67,0x73,0x66,0x2F,0x44,0x30,0x62,0x4A,0x73,0x46,0x6B, - 0x58,0x66,0x30,0x53,0x2B,0x4C,0x4C,0x72,0x66,0x54,0x4B,0x65,0x20,0x6D,0x66, - 0x65,0x39,0x62,0x4C,0x37,0x50,0x63,0x79,0x65,0x79,0x6E,0x4A,0x39,0x53,0x76, - 0x36,0x41,0x65,0x6D,0x64,0x63,0x51,0x73,0x47,0x31,0x46,0x72,0x74,0x53,0x31, - 0x49,0x76,0x38,0x64,0x65,0x41,0x78,0x71,0x55,0x2F,0x67,0x46,0x61,0x6A,0x34, - 0x43,0x43,0x42,0x50,0x36,0x49,0x68,0x37,0x44,0x63,0x52,0x56,0x68,0x6D,0x47, - 0x58,0x7A,0x41,0x75,0x35,0x65,0x4F,0x36,0x58,0x73,0x20,0x77,0x54,0x72,0x6B, - 0x71,0x6F,0x55,0x2B,0x64,0x36,0x38,0x74,0x65,0x61,0x48,0x59,0x58,0x64,0x53, - 0x42,0x2B,0x4B,0x48,0x4F,0x44,0x41,0x41,0x75,0x57,0x6B,0x56,0x34,0x41,0x78, - 0x46,0x79,0x42,0x63,0x41,0x73,0x4A,0x74,0x72,0x61,0x6E,0x65,0x4E,0x44,0x70, - 0x59,0x57,0x49,0x49,0x69,0x45,0x55,0x75,0x6E,0x68,0x62,0x75,0x35,0x31,0x50, - 0x36,0x51,0x31,0x7A,0x47,0x4E,0x4F,0x6D,0x20,0x45,0x72,0x65,0x71,0x4C,0x79, - 0x70,0x31,0x5A,0x77,0x42,0x77,0x30,0x58,0x34,0x43,0x37,0x38,0x64,0x78,0x65, - 0x37,0x45,0x77,0x53,0x31,0x73,0x44,0x50,0x74,0x49,0x7A,0x78,0x58,0x57,0x4C, - 0x66,0x63,0x30,0x55,0x31,0x43,0x42,0x5A,0x44,0x36,0x35,0x62,0x37,0x50,0x4F, - 0x52,0x6E,0x70,0x4C,0x7A,0x50,0x6E,0x5A,0x68,0x32,0x6C,0x4B,0x69,0x31,0x76, - 0x4F,0x58,0x53,0x6C,0x30,0x61,0x20,0x41,0x46,0x77,0x30,0x51,0x2F,0x42,0x62, - 0x4F,0x47,0x34,0x30,0x47,0x69,0x62,0x6A,0x77,0x5A,0x62,0x46,0x4F,0x65,0x35, - 0x65,0x4F,0x38,0x55,0x56,0x37,0x6A,0x75,0x2F,0x69,0x69,0x70,0x78,0x78,0x51, - 0x49,0x54,0x37,0x6D,0x39,0x5A,0x48,0x48,0x6C,0x36,0x72,0x38,0x42,0x44,0x6D, - 0x44,0x5A,0x30,0x43,0x4F,0x70,0x48,0x2F,0x46,0x41,0x6E,0x67,0x34,0x43,0x7A, - 0x55,0x54,0x51,0x34,0x20,0x2B,0x43,0x6A,0x77,0x41,0x76,0x42,0x74,0x59,0x48, - 0x6D,0x55,0x2B,0x37,0x55,0x31,0x6D,0x6A,0x33,0x67,0x72,0x6C,0x72,0x6F,0x38, - 0x35,0x50,0x65,0x4C,0x47,0x66,0x47,0x46,0x42,0x49,0x6B,0x6B,0x55,0x55,0x74, - 0x41,0x54,0x66,0x46,0x63,0x33,0x7A,0x63,0x4B,0x63,0x77,0x55,0x33,0x33,0x4E, - 0x51,0x58,0x38,0x49,0x76,0x55,0x4C,0x63,0x52,0x51,0x4A,0x69,0x69,0x4C,0x63, - 0x64,0x76,0x20,0x6F,0x6F,0x51,0x75,0x41,0x56,0x78,0x49,0x46,0x39,0x32,0x32, - 0x33,0x50,0x6E,0x30,0x56,0x31,0x46,0x47,0x4F,0x70,0x6F,0x43,0x74,0x69,0x33, - 0x50,0x78,0x5A,0x58,0x6D,0x76,0x51,0x76,0x34,0x44,0x39,0x53,0x78,0x2B,0x43, - 0x45,0x6C,0x42,0x67,0x44,0x78,0x64,0x67,0x6B,0x4B,0x72,0x4F,0x76,0x77,0x2B, - 0x64,0x32,0x31,0x55,0x39,0x79,0x36,0x50,0x45,0x64,0x37,0x6F,0x34,0x79,0x67, - 0x20,0x57,0x72,0x51,0x33,0x6D,0x68,0x4F,0x69,0x66,0x6E,0x64,0x74,0x53,0x51, - 0x6B,0x39,0x59,0x65,0x6F,0x32,0x35,0x43,0x2B,0x6D,0x72,0x72,0x73,0x41,0x78, - 0x63,0x7A,0x51,0x4A,0x66,0x68,0x6E,0x34,0x45,0x6E,0x67,0x66,0x56,0x48,0x76, - 0x36,0x57,0x47,0x4F,0x4C,0x46,0x2F,0x58,0x34,0x62,0x4E,0x76,0x49,0x4D,0x50, - 0x72,0x2F,0x52,0x6B,0x47,0x4A,0x39,0x51,0x31,0x71,0x41,0x51,0x64,0x20,0x54, - 0x51,0x48,0x58,0x64,0x50,0x6D,0x73,0x37,0x2F,0x53,0x6A,0x72,0x4E,0x65,0x66, - 0x69,0x58,0x2F,0x44,0x62,0x4F,0x43,0x78,0x46,0x2B,0x70,0x62,0x2B,0x41,0x56, - 0x53,0x45,0x77,0x47,0x45,0x43,0x58,0x32,0x78,0x65,0x34,0x47,0x62,0x67,0x53, - 0x2B,0x57,0x65,0x6B,0x38,0x50,0x32,0x4E,0x42,0x70,0x42,0x70,0x33,0x75,0x75, - 0x43,0x78,0x48,0x74,0x31,0x59,0x61,0x6C,0x6F,0x33,0x75,0x20,0x31,0x6F,0x41, - 0x37,0x4C,0x6A,0x4F,0x44,0x73,0x68,0x76,0x69,0x45,0x2F,0x38,0x58,0x4D,0x57, - 0x30,0x68,0x4E,0x65,0x4B,0x48,0x6C,0x45,0x55,0x41,0x59,0x59,0x71,0x69,0x67, - 0x55,0x38,0x44,0x4F,0x34,0x43,0x2F,0x41,0x50,0x35,0x6A,0x71,0x66,0x64,0x65, - 0x33,0x65,0x61,0x7A,0x75,0x73,0x32,0x6E,0x62,0x38,0x7A,0x6A,0x39,0x66,0x34, - 0x4D,0x68,0x38,0x35,0x6C,0x38,0x4F,0x55,0x48,0x20,0x4A,0x5A,0x48,0x78,0x7A, - 0x46,0x34,0x4F,0x56,0x33,0x66,0x35,0x55,0x5A,0x66,0x71,0x7A,0x73,0x62,0x33, - 0x4D,0x64,0x2F,0x37,0x69,0x35,0x41,0x65,0x34,0x52,0x64,0x49,0x72,0x51,0x45, - 0x55,0x2B,0x4D,0x5A,0x62,0x6A,0x51,0x55,0x54,0x65,0x42,0x47,0x34,0x45,0x2F, - 0x67,0x73,0x38,0x45,0x67,0x63,0x39,0x31,0x37,0x53,0x45,0x6E,0x44,0x62,0x69, - 0x68,0x7A,0x6A,0x75,0x52,0x78,0x76,0x20,0x44,0x32,0x5A,0x34,0x61,0x30,0x44, - 0x64,0x41,0x31,0x63,0x36,0x6D,0x67,0x49,0x32,0x64,0x50,0x70,0x63,0x32,0x65, - 0x48,0x54,0x6E,0x49,0x33,0x39,0x39,0x67,0x38,0x52,0x4F,0x71,0x49,0x72,0x62, - 0x65,0x49,0x48,0x47,0x51,0x41,0x77,0x34,0x39,0x6A,0x41,0x64,0x34,0x44,0x2F, - 0x41,0x58,0x77,0x69,0x6A,0x76,0x73,0x33,0x5A,0x2B,0x47,0x61,0x4C,0x70,0x39, - 0x72,0x75,0x6E,0x78,0x36,0x20,0x52,0x7A,0x33,0x32,0x44,0x32,0x59,0x34,0x66, - 0x43,0x37,0x44,0x75,0x4C,0x59,0x6F,0x6E,0x4A,0x48,0x6D,0x4C,0x46,0x7A,0x65, - 0x37,0x76,0x4E,0x72,0x48,0x58,0x36,0x35,0x75,0x6C,0x4A,0x66,0x42,0x2F,0x36, - 0x47,0x47,0x6C,0x75,0x37,0x58,0x77,0x35,0x6B,0x41,0x43,0x46,0x43,0x30,0x63, - 0x42,0x2B,0x34,0x46,0x35,0x4D,0x74,0x2B,0x42,0x2B,0x59,0x48,0x74,0x63,0x66, - 0x36,0x4F,0x37,0x20,0x4E,0x61,0x43,0x37,0x4E,0x63,0x66,0x4E,0x79,0x33,0x49, - 0x63,0x47,0x2F,0x5A,0x34,0x35,0x31,0x79,0x47,0x49,0x2B,0x63,0x79,0x54,0x4B, - 0x51,0x38,0x76,0x36,0x67,0x70,0x41,0x36,0x76,0x62,0x66,0x64,0x61,0x32,0x2B, - 0x31,0x7A,0x57,0x46,0x73,0x54,0x56,0x72,0x79,0x39,0x6D,0x4A,0x2F,0x41,0x45, - 0x38,0x48,0x54,0x68,0x46,0x32,0x6B,0x57,0x50,0x38,0x67,0x41,0x4C,0x71,0x49, - 0x6F,0x20,0x47,0x6E,0x67,0x36,0x66,0x2F,0x30,0x70,0x78,0x67,0x68,0x36,0x34, - 0x76,0x6F,0x37,0x48,0x75,0x61,0x67,0x69,0x56,0x56,0x74,0x4F,0x66,0x78,0x6C, - 0x4F,0x59,0x36,0x50,0x65,0x42,0x77,0x66,0x79,0x58,0x42,0x30,0x78,0x47,0x4D, - 0x6F,0x4A,0x64,0x32,0x45,0x39,0x73,0x61,0x41,0x31,0x57,0x30,0x42,0x4B,0x2B, - 0x66,0x37,0x72,0x4A,0x77,0x66,0x6C,0x4A,0x71,0x74,0x64,0x79,0x6B,0x4F,0x20, - 0x59,0x6F,0x54,0x2F,0x74,0x34,0x56,0x66,0x70,0x46,0x33,0x34,0x42,0x57,0x51, - 0x41,0x73,0x31,0x42,0x6B,0x42,0x48,0x38,0x4C,0x2F,0x42,0x33,0x77,0x49,0x44, - 0x47,0x4E,0x44,0x34,0x54,0x4A,0x65,0x42,0x66,0x4D,0x34,0x45,0x5A,0x67,0x65, - 0x4E,0x4C,0x6A,0x36,0x49,0x6A,0x48,0x73,0x57,0x47,0x50,0x55,0x36,0x4D,0x5A, - 0x78,0x75,0x71,0x6B,0x71,0x39,0x43,0x53,0x68,0x61,0x57,0x74,0x20,0x50,0x69, - 0x76,0x6D,0x47,0x2B,0x46,0x58,0x4B,0x48,0x66,0x69,0x49,0x65,0x44,0x7A,0x67, - 0x41,0x38,0x53,0x66,0x6A,0x45,0x79,0x67,0x44,0x6B,0x49,0x64,0x51,0x74,0x38, - 0x7A,0x50,0x6A,0x41,0x34,0x38,0x41,0x66,0x41,0x35,0x38,0x70,0x31,0x39,0x39, - 0x73,0x61,0x77,0x7A,0x59,0x32,0x42,0x6D,0x77,0x73,0x52,0x4D,0x67,0x78,0x39, - 0x43,0x45,0x52,0x2B,0x2B,0x6F,0x78,0x36,0x2F,0x4F,0x20,0x65,0x35,0x77,0x65, - 0x38,0x7A,0x67,0x37,0x58,0x68,0x73,0x52,0x77,0x73,0x4C,0x6D,0x67,0x4D,0x55, - 0x74,0x41,0x63,0x76,0x6E,0x42,0x58,0x53,0x33,0x42,0x69,0x79,0x6F,0x62,0x4E, - 0x62,0x6B,0x35,0x7A,0x44,0x48,0x63,0x66,0x55,0x58,0x66,0x69,0x48,0x78,0x58, - 0x34,0x77,0x4D,0x77,0x49,0x4B,0x69,0x61,0x4B,0x41,0x66,0x4D,0x31,0x50,0x77, - 0x4A,0x65,0x43,0x54,0x6D,0x4B,0x37,0x42,0x20,0x73,0x6E,0x4C,0x2B,0x2F,0x51, - 0x56,0x4E,0x52,0x6A,0x78,0x58,0x64,0x6C,0x7A,0x34,0x33,0x63,0x43,0x34,0x78, - 0x37,0x6C,0x4A,0x47,0x4A,0x72,0x30,0x47,0x42,0x6A,0x33,0x36,0x42,0x38,0x33, - 0x58,0x59,0x64,0x4B,0x52,0x77,0x73,0x74,0x57,0x56,0x4F,0x2F,0x72,0x75,0x61, - 0x41,0x7A,0x75,0x61,0x41,0x42,0x59,0x30,0x42,0x37,0x59,0x33,0x51,0x32,0x56, - 0x79,0x56,0x65,0x63,0x2B,0x54,0x20,0x6D,0x46,0x44,0x2F,0x63,0x53,0x52,0x38, - 0x4B,0x32,0x51,0x41,0x44,0x73,0x78,0x67,0x42,0x49,0x2F,0x6D,0x72,0x2F,0x73, - 0x77,0x52,0x72,0x43,0x70,0x55,0x6E,0x58,0x70,0x62,0x41,0x37,0x6F,0x62,0x41, - 0x61,0x59,0x4C,0x72,0x51,0x4A,0x48,0x34,0x59,0x6D,0x50,0x50,0x72,0x48,0x50, - 0x45,0x5A,0x7A,0x70,0x6A,0x73,0x42,0x35,0x6E,0x65,0x46,0x67,0x63,0x5A,0x4A, - 0x6E,0x31,0x6D,0x6E,0x20,0x49,0x78,0x63,0x32,0x42,0x39,0x4F,0x57,0x50,0x52, - 0x65,0x2F,0x37,0x6D,0x6F,0x4A,0x79,0x4F,0x62,0x2F,0x75,0x36,0x41,0x70,0x6F, - 0x43,0x6B,0x5A,0x71,0x57,0x52,0x37,0x4D,0x63,0x4C,0x2F,0x61,0x76,0x69,0x58, - 0x45,0x76,0x37,0x63,0x79,0x41,0x41,0x69,0x45,0x47,0x35,0x59,0x65,0x54,0x50, - 0x34,0x61,0x76,0x37,0x36,0x45,0x4D,0x59,0x49,0x37,0x71,0x78,0x4B,0x78,0x54, - 0x43,0x6A,0x20,0x36,0x59,0x74,0x62,0x67,0x72,0x52,0x73,0x63,0x4B,0x70,0x52, - 0x2F,0x52,0x4C,0x78,0x67,0x71,0x43,0x30,0x68,0x76,0x4C,0x45,0x4B,0x2B,0x4D, - 0x78,0x56,0x61,0x57,0x75,0x36,0x41,0x45,0x2B,0x44,0x76,0x77,0x42,0x5A,0x65, - 0x34,0x65,0x70,0x4A,0x43,0x54,0x77,0x4E,0x65,0x41,0x62,0x32,0x4A,0x47,0x39, - 0x31,0x50,0x4E,0x2F,0x56,0x75,0x61,0x53,0x33,0x70,0x2F,0x4D,0x67,0x4B,0x34, - 0x20,0x2B,0x75,0x4D,0x67,0x38,0x44,0x42,0x6D,0x33,0x34,0x48,0x66,0x42,0x70, - 0x36,0x71,0x62,0x6E,0x58,0x71,0x67,0x71,0x63,0x77,0x6E,0x2B,0x56,0x79,0x7A, - 0x47,0x65,0x62,0x65,0x76,0x48,0x48,0x67,0x62,0x6F,0x41,0x35,0x57,0x64,0x6E, - 0x2F,0x75,0x72,0x43,0x64,0x41,0x30,0x2B,0x43,0x76,0x78,0x4F,0x56,0x57,0x74, - 0x55,0x4F,0x33,0x77,0x58,0x6B,0x35,0x57,0x35,0x69,0x39,0x43,0x67,0x20,0x6E, - 0x6F,0x67,0x50,0x47,0x55,0x44,0x6C,0x36,0x41,0x66,0x2B,0x49,0x58,0x38,0x74, - 0x41,0x65,0x37,0x49,0x58,0x39,0x76,0x7A,0x72,0x34,0x58,0x35,0x6A,0x4C,0x34, - 0x4C,0x50,0x4A,0x4F,0x2F,0x2B,0x71,0x70,0x62,0x6E,0x66,0x70,0x48,0x42,0x6C, - 0x41,0x64,0x2B,0x72,0x68,0x67,0x42,0x6D,0x42,0x6D,0x44,0x37,0x5A,0x6A,0x49, - 0x6F,0x53,0x62,0x67,0x66,0x69,0x58,0x76,0x53,0x53,0x54,0x20,0x48,0x47,0x61, - 0x62,0x74,0x6D,0x63,0x78,0x77,0x6E,0x2B,0x31,0x75,0x74,0x56,0x4A,0x48,0x7A, - 0x4B,0x41,0x5A,0x4C,0x41,0x33,0x66,0x2F,0x31,0x31,0x2F,0x76,0x56,0x57,0x34, - 0x42,0x61,0x4D,0x47,0x57,0x77,0x46,0x46,0x6C,0x65,0x70,0x58,0x6E,0x46,0x7A, - 0x47,0x74,0x69,0x4E,0x45,0x66,0x33,0x7A,0x2B,0x5A,0x39,0x46,0x46,0x5A,0x45, - 0x42,0x4A,0x4A,0x50,0x64,0x2B,0x61,0x75,0x77,0x20,0x55,0x63,0x6C,0x36,0x4C, - 0x68,0x6A,0x43,0x72,0x77,0x50,0x58,0x56,0x4B,0x6C,0x65,0x72,0x72,0x77,0x4F, - 0x2F,0x49,0x77,0x4C,0x67,0x74,0x39,0x58,0x33,0x65,0x71,0x49,0x59,0x6D,0x51, - 0x41,0x74,0x63,0x47,0x2B,0x2F,0x50,0x58,0x31,0x2F,0x47,0x73,0x50,0x75,0x41, - 0x6F,0x7A,0x33,0x62,0x67,0x75,0x2F,0x2F,0x4F,0x6D,0x2F,0x4D,0x2B,0x56,0x6A, - 0x68,0x5A,0x4F,0x59,0x34,0x35,0x69,0x20,0x32,0x77,0x75,0x38,0x6B,0x66,0x2F, - 0x35,0x59,0x50,0x37,0x6E,0x56,0x43,0x51,0x6A,0x31,0x44,0x49,0x79,0x67,0x4E, - 0x6F,0x6B,0x41,0x48,0x36,0x52,0x76,0x34,0x72,0x70,0x78,0x42,0x6A,0x42,0x74, - 0x5A,0x6A,0x42,0x78,0x63,0x49,0x4B,0x78,0x6E,0x56,0x41,0x49,0x5A,0x6D,0x34, - 0x44,0x66,0x69,0x31,0x57,0x65,0x37,0x39,0x4F,0x6A,0x41,0x52,0x65,0x72,0x32, - 0x33,0x36,0x50,0x57,0x72,0x20,0x2B,0x64,0x65,0x76,0x59,0x73,0x51,0x2B,0x34, - 0x46,0x35,0x39,0x6B,0x52,0x52,0x6B,0x41,0x50,0x58,0x48,0x41,0x50,0x42,0x79, - 0x2F,0x72,0x6F,0x55,0x73,0x36,0x30,0x6F,0x30,0x6C,0x4D,0x37,0x52,0x63,0x67, - 0x41,0x30,0x6F,0x75,0x45,0x4C,0x70,0x51,0x4A,0x4B,0x45,0x53,0x61,0x4B,0x58, - 0x6B,0x74,0x67,0x42,0x43,0x69,0x64,0x6C,0x45,0x45,0x49,0x45,0x53,0x4B,0x6B, - 0x51,0x45,0x49,0x20,0x6B,0x57,0x4A,0x6B,0x41,0x45,0x4B,0x6B,0x47,0x42,0x6D, - 0x41,0x45,0x43,0x6C,0x47,0x42,0x69,0x42,0x45,0x69,0x70,0x45,0x42,0x43,0x4A, - 0x46,0x69,0x2F,0x68,0x30,0x37,0x77,0x4F,0x37,0x35,0x36,0x2F,0x2B,0x71,0x74, - 0x67,0x41,0x41,0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67, - 0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x74, - 0x61,0x72,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B, - 0x20,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,0x43,0x41,0x41,0x41, - 0x41,0x41,0x67,0x43,0x41,0x59,0x41,0x41,0x41,0x42,0x7A,0x65,0x6E,0x72,0x30, - 0x41,0x41,0x41,0x42,0x53,0x45,0x6C,0x45,0x51,0x56,0x52,0x59,0x68,0x65,0x32, - 0x57,0x30,0x57,0x33,0x43,0x4D,0x42,0x43,0x47,0x76,0x31,0x53,0x38,0x20,0x4E, - 0x79,0x4E,0x55,0x36,0x67,0x4B,0x77,0x51,0x64,0x6D,0x6B,0x33,0x53,0x42,0x4D, - 0x41,0x45,0x78,0x41,0x6D,0x51,0x42,0x31,0x41,0x74,0x6F,0x4A,0x6D,0x6B,0x35, - 0x51,0x47,0x41,0x43,0x4A,0x45,0x63,0x49,0x45,0x36,0x59,0x4D,0x64,0x39,0x62, - 0x42,0x51,0x66,0x4F,0x65,0x6B,0x53,0x68,0x2F,0x79,0x50,0x7A,0x6D,0x4F,0x37, - 0x66,0x2F,0x2F,0x7A,0x33,0x65,0x32,0x73,0x37,0x71,0x75,0x20,0x47,0x52,0x4A, - 0x33,0x67,0x37,0x4B,0x50,0x41,0x6B,0x59,0x42,0x2F,0x30,0x48,0x41,0x70,0x4B, - 0x2B,0x46,0x54,0x70,0x66,0x72,0x37,0x38,0x64,0x37,0x33,0x62,0x7A,0x4F,0x45, - 0x54,0x68,0x64,0x72,0x73,0x68,0x58,0x77,0x4E,0x51,0x79,0x58,0x78,0x57,0x42, - 0x30,0x42,0x30,0x34,0x68,0x36,0x49,0x2F,0x42,0x7A,0x62,0x41,0x4D,0x31,0x44, - 0x32,0x4C,0x73,0x42,0x6A,0x41,0x78,0x77,0x39,0x20,0x77,0x54,0x6B,0x67,0x2F, - 0x38,0x54,0x6F,0x50,0x45,0x56,0x41,0x44,0x75,0x78,0x38,0x2B,0x2B,0x43,0x46, - 0x66,0x50,0x6D,0x2B,0x50,0x49,0x55,0x63,0x49,0x4E,0x50,0x63,0x42,0x64,0x37, - 0x74,0x46,0x50,0x68,0x57,0x72,0x44,0x6B,0x48,0x79,0x72,0x39,0x49,0x77,0x73, - 0x5A,0x31,0x44,0x44,0x6E,0x63,0x7A,0x70,0x74,0x6B,0x41,0x63,0x4C,0x4E,0x6D, - 0x32,0x4C,0x34,0x44,0x69,0x67,0x61,0x20,0x45,0x54,0x45,0x68,0x71,0x69,0x31, - 0x6F,0x46,0x76,0x50,0x51,0x33,0x74,0x38,0x6C,0x73,0x4D,0x42,0x46,0x44,0x72, - 0x68,0x39,0x4E,0x71,0x67,0x69,0x49,0x4D,0x67,0x4C,0x4A,0x54,0x6E,0x41,0x45, - 0x79,0x35,0x6E,0x56,0x72,0x51,0x6B,0x71,0x53,0x55,0x48,0x48,0x6F,0x43,0x6C, - 0x59,0x54,0x77,0x34,0x39,0x31,0x58,0x62,0x67,0x47,0x67,0x5A,0x43,0x76,0x66, - 0x61,0x63,0x6A,0x73,0x44,0x20,0x37,0x38,0x44,0x57,0x74,0x31,0x75,0x68,0x50, - 0x51,0x63,0x4B,0x58,0x45,0x68,0x6A,0x4F,0x41,0x41,0x7A,0x32,0x52,0x45,0x72, - 0x52,0x38,0x74,0x42,0x74,0x42,0x59,0x6B,0x46,0x62,0x38,0x48,0x6B,0x34,0x7A, - 0x4B,0x68,0x34,0x59,0x30,0x52,0x63,0x42,0x72,0x79,0x37,0x2B,0x39,0x61,0x4A, - 0x64,0x36,0x61,0x67,0x64,0x31,0x47,0x59,0x59,0x49,0x62,0x73,0x41,0x6D,0x4F, - 0x54,0x4F,0x77,0x20,0x52,0x53,0x42,0x5A,0x51,0x43,0x42,0x69,0x6A,0x39,0x75, - 0x4B,0x75,0x59,0x55,0x63,0x4F,0x72,0x34,0x48,0x42,0x4E,0x6B,0x4C,0x4C,0x75, - 0x76,0x4E,0x36,0x4F,0x74,0x4A,0x56,0x75,0x46,0x4B,0x7A,0x34,0x78,0x4F,0x57, - 0x39,0x41,0x48,0x42,0x6E,0x2B,0x55,0x6A,0x67,0x4A,0x47,0x41,0x54,0x2F,0x6D, - 0x2F,0x46,0x57,0x39,0x51,0x77,0x43,0x69,0x33,0x41,0x41,0x41,0x41,0x41,0x42, - 0x4A,0x20,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D,0x3D,0x5D, - 0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x73, - 0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20,0x72,0x65, - 0x74,0x75,0x72,0x6E,0x20,0x7B,0x20,0x78,0x30,0x20,0x3D,0x20,0x2D,0x31,0x30, - 0x30,0x2C,0x20,0x78,0x20,0x3D,0x20,0x31,0x30,0x30,0x30,0x2C,0x20,0x79,0x20, - 0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29, - 0x20,0x2A,0x20,0x36,0x30,0x30,0x2C,0x20,0x72,0x30,0x20,0x3D,0x20,0x6D,0x61, + 0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70, + 0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43, + 0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71, + 0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x20,0x41,0x67,0x43,0x2F,0x6D, + 0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41, + 0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59, + 0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49, + 0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E, + 0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x20,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43, + 0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67, + 0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71, + 0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69, + 0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43, + 0x2F,0x6D,0x4A,0x42,0x36,0x20,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D, + 0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A, + 0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E, + 0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45, + 0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A, + 0x41,0x43,0x51,0x20,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61, + 0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49, + 0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41, + 0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A, + 0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33, + 0x50,0x20,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70, + 0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43, + 0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71, + 0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A, + 0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x20, + 0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59, + 0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49, + 0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E, + 0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51, + 0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x20,0x48,0x67, + 0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71, + 0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69, + 0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43, + 0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x32,0x50, + 0x38,0x41,0x43,0x2F,0x6B,0x64,0x31,0x2F,0x36,0x61,0x20,0x4B,0x5A,0x63,0x41, + 0x41,0x41,0x41,0x41,0x53,0x55,0x56,0x4F,0x52,0x4B,0x35,0x43,0x59,0x49,0x49, + 0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6C,0x6F,0x76,0x65,0x5F, + 0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x42,0x41,0x43, + 0x41,0x59,0x41,0x41,0x41,0x44,0x31,0x58,0x61,0x6D,0x2B,0x41,0x41,0x41,0x41, + 0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73,0x54,0x41,0x41,0x41, + 0x4C,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x20,0x41,0x41,0x41,0x4C,0x79, + 0x30,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x63,0x6A,0x31,0x58,0x63, + 0x4F,0x68,0x50,0x46,0x58,0x39,0x37,0x35,0x43,0x6E,0x41,0x71,0x69,0x4B,0x6B, + 0x67,0x70,0x6F,0x4B,0x59,0x43,0x6C,0x67,0x71,0x77,0x46,0x54,0x41,0x70,0x67, + 0x4B,0x57,0x43,0x69,0x41,0x56,0x73,0x46,0x54,0x41,0x70,0x67,0x4A,0x4D,0x42, + 0x66,0x47,0x72,0x41,0x4B,0x55,0x43,0x20,0x33,0x45,0x47,0x2B,0x33,0x30,0x33, + 0x73,0x39,0x35,0x54,0x42,0x33,0x6A,0x39,0x67,0x37,0x32,0x36,0x51,0x37,0x6A, + 0x6B,0x33,0x6D,0x68,0x6C,0x4A,0x4D,0x2F,0x4A,0x49,0x6D,0x76,0x58,0x75,0x79, + 0x65,0x48,0x64,0x6A,0x78,0x38,0x2F,0x2F,0x6F,0x71,0x49,0x47,0x59,0x67,0x5A, + 0x43,0x44,0x4D,0x44,0x66,0x34,0x66,0x35,0x32,0x50,0x47,0x70,0x59,0x77,0x5A, + 0x69,0x42,0x70,0x53,0x42,0x20,0x57,0x41,0x44,0x69,0x4F,0x59,0x67,0x5A,0x43, + 0x44,0x67,0x44,0x73,0x51,0x41,0x45,0x76,0x50,0x6E,0x78,0x30,0x57,0x4D,0x47, + 0x59,0x67,0x47,0x49,0x5A,0x79,0x42,0x6D,0x49,0x4F,0x41,0x4D,0x78,0x41,0x49, + 0x51,0x38,0x4F,0x62,0x48,0x52,0x34,0x38,0x5A,0x69,0x41,0x55,0x67,0x6E,0x6F, + 0x47,0x59,0x67,0x59,0x41,0x7A,0x38,0x4C,0x2B,0x41,0x6E,0x2F,0x31,0x50,0x65, + 0x2F,0x53,0x4D,0x20,0x42,0x65,0x66,0x51,0x77,0x52,0x4C,0x57,0x4D,0x4F,0x4B, + 0x76,0x76,0x35,0x51,0x58,0x4D,0x54,0x58,0x4A,0x63,0x4F,0x68,0x69,0x43,0x53, + 0x4E,0x36,0x4D,0x68,0x41,0x4C,0x51,0x45,0x39,0x69,0x39,0x73,0x69,0x63,0x73, + 0x4A,0x59,0x37,0x6D,0x48,0x74,0x72,0x30,0x75,0x55,0x2F,0x67,0x70,0x56,0x6E, + 0x43,0x30,0x6E,0x4D,0x65,0x64,0x68,0x54,0x4F,0x49,0x48,0x4B,0x7A,0x79,0x6F, + 0x73,0x20,0x47,0x50,0x41,0x56,0x7A,0x6C,0x63,0x4E,0x44,0x4B,0x30,0x2F,0x66, + 0x67,0x58,0x59,0x2F,0x59,0x35,0x66,0x73,0x59,0x51,0x6E,0x71,0x50,0x2B,0x52, + 0x70,0x56,0x61,0x36,0x44,0x2B,0x6D,0x35,0x62,0x30,0x44,0x57,0x6F,0x62,0x39, + 0x76,0x57,0x74,0x50,0x31,0x70,0x74,0x57,0x73,0x65,0x57,0x34,0x39,0x65,0x77, + 0x48,0x58,0x75,0x66,0x77,0x4D,0x2B,0x31,0x6B,0x6F,0x62,0x6D,0x67,0x66,0x20, + 0x59,0x51,0x45,0x6A,0x6D,0x67,0x7A,0x45,0x41,0x72,0x44,0x62,0x6F,0x36,0x44, + 0x4C,0x50,0x59,0x58,0x74,0x51,0x56,0x59,0x72,0x58,0x59,0x65,0x31,0x52,0x64, + 0x45,0x4B,0x70,0x74,0x58,0x59,0x33,0x4E,0x6A,0x2B,0x4A,0x46,0x58,0x50,0x2B, + 0x61,0x4E,0x68,0x73,0x63,0x62,0x43,0x5A,0x34,0x7A,0x35,0x42,0x6E,0x50,0x34, + 0x55,0x71,0x52,0x4D,0x56,0x47,0x37,0x76,0x6F,0x66,0x49,0x58,0x20,0x50,0x4E, + 0x37,0x46,0x2F,0x77,0x71,0x38,0x73,0x7A,0x4F,0x67,0x41,0x2F,0x69,0x30,0x4A, + 0x50,0x6F,0x42,0x66,0x51,0x37,0x71,0x6B,0x76,0x54,0x68,0x6B,0x6F,0x35,0x5A, + 0x58,0x2B,0x65,0x65,0x32,0x78,0x39,0x5A,0x58,0x39,0x71,0x73,0x73,0x61,0x5A, + 0x39,0x33,0x38,0x69,0x32,0x55,0x5A,0x37,0x75,0x59,0x47,0x34,0x37,0x47,0x72, + 0x32,0x69,0x4C,0x65,0x46,0x33,0x4B,0x46,0x6C,0x49,0x20,0x47,0x33,0x36,0x69, + 0x7A,0x57,0x45,0x58,0x46,0x50,0x4D,0x49,0x74,0x6E,0x4F,0x36,0x78,0x72,0x78, + 0x35,0x57,0x2F,0x77,0x4E,0x59,0x48,0x64,0x62,0x6E,0x4B,0x30,0x49,0x6E,0x64, + 0x4C,0x76,0x6F,0x41,0x35,0x71,0x41,0x72,0x74,0x51,0x64,0x68,0x6E,0x2F,0x41, + 0x4A,0x75,0x65,0x50,0x56,0x31,0x6A,0x6E,0x58,0x70,0x75,0x66,0x56,0x70,0x72, + 0x76,0x4D,0x55,0x63,0x77,0x79,0x56,0x30,0x20,0x63,0x42,0x6C,0x53,0x4F,0x67, + 0x74,0x34,0x44,0x76,0x30,0x38,0x74,0x72,0x36,0x44,0x4C,0x67,0x4A,0x2F,0x6B, + 0x35,0x53,0x49,0x33,0x57,0x53,0x67,0x58,0x6A,0x50,0x73,0x6C,0x35,0x35,0x78, + 0x46,0x66,0x61,0x79,0x70,0x32,0x2F,0x66,0x7A,0x62,0x6C,0x5A,0x34,0x4D,0x4C, + 0x6F,0x72,0x58,0x71,0x44,0x6B,0x4C,0x56,0x4B,0x30,0x2B,0x71,0x35,0x44,0x2B, + 0x45,0x5A,0x64,0x48,0x41,0x56,0x20,0x48,0x41,0x4E,0x6D,0x38,0x41,0x44,0x61, + 0x4F,0x41,0x6B,0x32,0x78,0x51,0x67,0x57,0x73,0x51,0x44,0x73,0x62,0x75,0x74, + 0x31,0x6B,0x4D,0x55,0x75,0x4F,0x49,0x78,0x6C,0x30,0x7A,0x47,0x6A,0x31,0x53, + 0x64,0x64,0x33,0x65,0x68,0x71,0x53,0x71,0x68,0x50,0x72,0x6B,0x32,0x51,0x4D, + 0x7A,0x6A,0x64,0x5A,0x4D,0x4B,0x49,0x59,0x30,0x2B,0x4E,0x62,0x2F,0x31,0x43, + 0x62,0x7A,0x48,0x46,0x20,0x4D,0x44,0x46,0x47,0x35,0x55,0x76,0x50,0x72,0x58, + 0x5A,0x54,0x31,0x45,0x77,0x34,0x67,0x58,0x4D,0x7A,0x4D,0x55,0x4F,0x66,0x47, + 0x56,0x73,0x77,0x61,0x76,0x77,0x4E,0x59,0x4C,0x64,0x62,0x72,0x63,0x4F,0x6E, + 0x37,0x37,0x65,0x70,0x74,0x77,0x79,0x48,0x72,0x49,0x50,0x61,0x64,0x63,0x68, + 0x54,0x37,0x41,0x35,0x75,0x69,0x6D,0x39,0x4D,0x55,0x4B,0x77,0x61,0x36,0x74, + 0x50,0x54,0x20,0x77,0x56,0x30,0x68,0x49,0x66,0x43,0x54,0x43,0x66,0x34,0x65, + 0x58,0x57,0x74,0x72,0x6F,0x54,0x47,0x50,0x55,0x47,0x32,0x4C,0x43,0x6B,0x47, + 0x58,0x33,0x78,0x2F,0x58,0x39,0x6D,0x33,0x61,0x36,0x6C,0x4F,0x2F,0x38,0x43, + 0x62,0x4A,0x70,0x39,0x59,0x51,0x48,0x47,0x49,0x42,0x32,0x49,0x38,0x74,0x6E, + 0x37,0x43,0x4D,0x44,0x44,0x71,0x34,0x67,0x44,0x71,0x51,0x51,0x79,0x48,0x48, + 0x20,0x30,0x62,0x33,0x6E,0x72,0x45,0x54,0x57,0x52,0x64,0x6F,0x56,0x43,0x67, + 0x4C,0x72,0x41,0x72,0x62,0x51,0x38,0x36,0x72,0x67,0x2B,0x65,0x69,0x36,0x6F, + 0x41,0x63,0x4D,0x47,0x43,0x6F,0x76,0x43,0x62,0x34,0x65,0x6F,0x64,0x6F,0x57, + 0x79,0x6B,0x6E,0x5A,0x4B,0x71,0x47,0x30,0x38,0x55,0x66,0x41,0x2F,0x64,0x68, + 0x70,0x58,0x51,0x4A,0x52,0x53,0x4F,0x45,0x45,0x66,0x6D,0x70,0x6B,0x20,0x48, + 0x64,0x49,0x4D,0x43,0x75,0x58,0x50,0x66,0x33,0x2B,0x39,0x48,0x54,0x77,0x30, + 0x65,0x74,0x33,0x59,0x2B,0x68,0x72,0x62,0x6E,0x7A,0x4E,0x77,0x41,0x68,0x64, + 0x39,0x45,0x30,0x61,0x32,0x48,0x78,0x76,0x2F,0x65,0x67,0x34,0x66,0x43,0x59, + 0x72,0x57,0x35,0x2B,0x4D,0x7A,0x53,0x75,0x30,0x62,0x58,0x69,0x6E,0x4C,0x31, + 0x78,0x78,0x4F,0x50,0x54,0x38,0x35,0x63,0x75,0x6E,0x70,0x20,0x51,0x59,0x6A, + 0x78,0x44,0x57,0x42,0x2F,0x74,0x72,0x6C,0x67,0x4B,0x65,0x63,0x77,0x32,0x33, + 0x42,0x4A,0x63,0x38,0x62,0x66,0x77,0x68,0x4C,0x32,0x34,0x59,0x36,0x4F,0x69, + 0x64,0x65,0x70,0x43,0x33,0x41,0x41,0x31,0x57,0x34,0x62,0x50,0x30,0x78,0x41, + 0x72,0x63,0x4E,0x35,0x74,0x67,0x4A,0x5A,0x62,0x77,0x41,0x74,0x48,0x49,0x4C, + 0x47,0x44,0x49,0x30,0x70,0x44,0x71,0x38,0x38,0x20,0x70,0x35,0x66,0x49,0x4D, + 0x30,0x38,0x50,0x51,0x6F,0x77,0x2F,0x41,0x75,0x35,0x2B,0x6D,0x33,0x55,0x78, + 0x39,0x54,0x71,0x71,0x51,0x35,0x2B,0x39,0x59,0x44,0x6B,0x46,0x63,0x2B,0x36, + 0x68,0x4C,0x6E,0x6B,0x4B,0x75,0x32,0x41,0x2F,0x51,0x52,0x4D,0x47,0x58,0x58, + 0x51,0x4E,0x48,0x4E,0x6D,0x6D,0x5A,0x2F,0x56,0x52,0x6F,0x54,0x6A,0x66,0x67, + 0x48,0x78,0x73,0x39,0x43,0x39,0x47,0x20,0x48,0x30,0x70,0x56,0x44,0x6F,0x4A, + 0x48,0x4C,0x41,0x43,0x37,0x4F,0x77,0x49,0x36,0x67,0x4C,0x71,0x30,0x79,0x79, + 0x37,0x75,0x4A,0x71,0x76,0x54,0x35,0x66,0x6F,0x47,0x69,0x34,0x35,0x4A,0x44, + 0x70,0x75,0x39,0x53,0x46,0x4E,0x73,0x4B,0x64,0x77,0x6D,0x37,0x4F,0x55,0x75, + 0x4F,0x34,0x4C,0x72,0x4F,0x58,0x77,0x73,0x66,0x47,0x56,0x41,0x2B,0x65,0x4F, + 0x41,0x76,0x76,0x35,0x59,0x20,0x56,0x2F,0x45,0x72,0x77,0x47,0x36,0x32,0x4C, + 0x69,0x47,0x73,0x50,0x72,0x57,0x7A,0x6E,0x76,0x41,0x36,0x39,0x41,0x2B,0x77, + 0x67,0x69,0x58,0x30,0x6B,0x61,0x4E,0x6F,0x33,0x6D,0x6E,0x54,0x30,0x6A,0x7A, + 0x44,0x47,0x5A,0x62,0x35,0x4D,0x2B,0x75,0x76,0x4E,0x34,0x33,0x55,0x73,0x35, + 0x66,0x49,0x52,0x35,0x34,0x2B,0x74,0x76,0x68,0x45,0x67,0x4D,0x51,0x4C,0x63, + 0x6F,0x69,0x73,0x20,0x5A,0x32,0x79,0x68,0x35,0x31,0x49,0x52,0x61,0x36,0x45, + 0x2B,0x6A,0x52,0x6B,0x61,0x4E,0x6F,0x37,0x38,0x4B,0x77,0x2B,0x6C,0x68,0x4B, + 0x43,0x67,0x2F,0x77,0x6F,0x63,0x47,0x42,0x4F,0x65,0x64,0x77,0x70,0x6E,0x4D, + 0x4E,0x33,0x42,0x73,0x79,0x76,0x2B,0x4E,0x32,0x6A,0x78,0x68,0x45,0x46,0x72, + 0x55,0x76,0x2B,0x36,0x65,0x36,0x4C,0x31,0x33,0x38,0x45,0x75,0x46,0x42,0x69, + 0x74,0x20,0x6E,0x37,0x78,0x6A,0x59,0x4E,0x63,0x34,0x4F,0x32,0x38,0x49,0x33, + 0x63,0x5A,0x2B,0x58,0x47,0x4E,0x39,0x4E,0x78,0x31,0x6A,0x68,0x6C,0x69,0x4C, + 0x7A,0x58,0x2F,0x58,0x57,0x6F,0x61,0x49,0x73,0x2F,0x63,0x2B,0x51,0x76,0x77, + 0x4B,0x63,0x45,0x57,0x46,0x46,0x2F,0x55,0x64,0x32,0x50,0x2B,0x30,0x32,0x56, + 0x62,0x68,0x37,0x2F,0x72,0x6B,0x4C,0x77,0x6D,0x75,0x54,0x37,0x6F,0x5A,0x20, + 0x72,0x4F,0x47,0x36,0x63,0x41,0x77,0x38,0x61,0x57,0x6A,0x6E,0x33,0x57,0x44, + 0x50,0x6F,0x59,0x38,0x53,0x5A,0x65,0x45,0x62,0x6B,0x4A,0x57,0x4C,0x78,0x4E, + 0x6A,0x47,0x55,0x49,0x2B,0x4E,0x30,0x39,0x4C,0x6F,0x55,0x6E,0x4E,0x6A,0x2B, + 0x32,0x37,0x30,0x49,0x56,0x54,0x6C,0x4A,0x54,0x4F,0x4F,0x62,0x6F,0x30,0x65, + 0x6A,0x42,0x70,0x69,0x41,0x5A,0x68,0x34,0x75,0x37,0x75,0x4E,0x20,0x67,0x2B, + 0x2B,0x46,0x2B,0x33,0x6E,0x42,0x37,0x65,0x47,0x62,0x4D,0x30,0x43,0x76,0x6E, + 0x77,0x36,0x2B,0x46,0x41,0x73,0x6D,0x79,0x6B,0x64,0x74,0x48,0x4F,0x69,0x77, + 0x32,0x32,0x66,0x38,0x62,0x4D,0x61,0x70,0x2F,0x38,0x4C,0x4D,0x47,0x30,0x4F, + 0x64,0x47,0x4B,0x64,0x66,0x6A,0x54,0x36,0x32,0x71,0x75,0x64,0x55,0x50,0x67, + 0x6F,0x54,0x71,0x45,0x4B,0x66,0x47,0x56,0x73,0x77,0x20,0x61,0x6D,0x67,0x46, + 0x51,0x49,0x64,0x41,0x62,0x4F,0x46,0x61,0x59,0x51,0x74,0x74,0x53,0x67,0x78, + 0x37,0x30,0x65,0x62,0x59,0x7A,0x75,0x41,0x51,0x30,0x45,0x46,0x57,0x45,0x66, + 0x43,0x52,0x6F,0x6B,0x78,0x39,0x41,0x37,0x4B,0x44,0x58,0x34,0x78,0x4E,0x59, + 0x7A,0x4A,0x6A,0x47,0x31,0x4B,0x56,0x37,0x39,0x52,0x7A,0x57,0x43,0x4D,0x76, + 0x50,0x48,0x31,0x73,0x55,0x66,0x48,0x76,0x20,0x59,0x57,0x45,0x43,0x61,0x52, + 0x31,0x36,0x67,0x77,0x6F,0x57,0x6F,0x52,0x55,0x41,0x48,0x51,0x51,0x66,0x7A, + 0x6C,0x64,0x47,0x6C,0x75,0x33,0x6C,0x56,0x32,0x78,0x39,0x47,0x67,0x2B,0x4A, + 0x43,0x6D,0x65,0x58,0x78,0x75,0x45,0x35,0x65,0x6D,0x4A,0x73,0x4D,0x33,0x53, + 0x4E,0x39,0x61,0x46,0x50,0x78,0x37,0x46,0x77,0x61,0x68,0x77,0x76,0x6A,0x4E, + 0x36,0x71,0x64,0x53,0x73,0x4D,0x20,0x31,0x4B,0x62,0x34,0x30,0x58,0x50,0x70, + 0x71,0x31,0x34,0x47,0x66,0x53,0x69,0x57,0x43,0x71,0x62,0x7A,0x6A,0x61,0x48, + 0x4A,0x6F,0x52,0x57,0x41,0x31,0x47,0x7A,0x77,0x67,0x39,0x48,0x48,0x55,0x68, + 0x4D,0x63,0x46,0x38,0x62,0x35,0x47,0x66,0x72,0x51,0x42,0x31,0x34,0x68,0x5A, + 0x74,0x44,0x42,0x46,0x6C,0x32,0x78,0x31,0x57,0x65,0x4C,0x54,0x34,0x5A,0x74, + 0x32,0x6B,0x34,0x61,0x20,0x75,0x4A,0x30,0x59,0x66,0x31,0x2B,0x4E,0x33,0x71, + 0x70,0x56,0x4B,0x7A,0x54,0x74,0x42,0x36,0x4F,0x76,0x71,0x2B,0x70,0x5A,0x64, + 0x50,0x45,0x66,0x59,0x51,0x45,0x74,0x46,0x45,0x65,0x58,0x33,0x38,0x61,0x7A, + 0x34,0x39,0x36,0x38,0x48,0x6E,0x6F,0x42,0x32,0x4E,0x59,0x47,0x46,0x79,0x61, + 0x51,0x44,0x6C,0x35,0x70,0x62,0x45,0x4F,0x71,0x6C,0x38,0x62,0x5A,0x71,0x64, + 0x47,0x6C,0x20,0x6C,0x6E,0x41,0x4F,0x66,0x56,0x79,0x67,0x70,0x4C,0x35,0x68, + 0x41,0x48,0x6C,0x69,0x66,0x4E,0x62,0x6F,0x69,0x78,0x36,0x2F,0x7A,0x74,0x68, + 0x7A,0x6F,0x36,0x39,0x53,0x4D,0x77,0x62,0x6F,0x30,0x31,0x34,0x73,0x59,0x42, + 0x65,0x75,0x4D,0x63,0x62,0x4C,0x33,0x32,0x51,0x6D,0x74,0x41,0x4A,0x67,0x44, + 0x30,0x52,0x70,0x44,0x53,0x50,0x70,0x6E,0x34,0x7A,0x66,0x57,0x36,0x4D,0x50, + 0x20,0x72,0x64,0x6F,0x4C,0x70,0x6F,0x75,0x52,0x64,0x67,0x54,0x52,0x57,0x30, + 0x44,0x74,0x32,0x52,0x50,0x6B,0x4B,0x30,0x38,0x66,0x51,0x6A,0x77,0x32,0x54, + 0x75,0x7A,0x61,0x2F,0x47,0x36,0x48,0x49,0x72,0x5A,0x49,0x45,0x62,0x54,0x32, + 0x64,0x58,0x48,0x48,0x77,0x4C,0x37,0x78,0x46,0x58,0x32,0x36,0x2B,0x50,0x61, + 0x5A,0x31,0x2F,0x58,0x39,0x4A,0x73,0x65,0x46,0x56,0x67,0x41,0x2B,0x20,0x37, + 0x6D,0x67,0x58,0x63,0x78,0x4E,0x33,0x32,0x53,0x55,0x77,0x51,0x31,0x2B,0x6B, + 0x31,0x73,0x79,0x79,0x4D,0x62,0x49,0x4F,0x54,0x78,0x70,0x6E,0x76,0x77,0x70, + 0x4D,0x73,0x49,0x6C,0x44,0x49,0x4D,0x47,0x4A,0x39,0x64,0x58,0x33,0x2B,0x74, + 0x2F,0x47,0x4B,0x31,0x75,0x68,0x61,0x63,0x2B,0x4E,0x76,0x71,0x6E,0x71,0x6D, + 0x48,0x41,0x47,0x44,0x32,0x45,0x4A,0x49,0x37,0x77,0x4D,0x20,0x68,0x46,0x59, + 0x41,0x64,0x43,0x43,0x33,0x44,0x63,0x58,0x30,0x34,0x39,0x62,0x6F,0x62,0x67, + 0x75,0x4C,0x65,0x44,0x41,0x78,0x4D,0x71,0x4F,0x33,0x36,0x68,0x79,0x68,0x62, + 0x4A,0x57,0x6D,0x76,0x61,0x48,0x31,0x31,0x32,0x79,0x36,0x31,0x31,0x59,0x6E, + 0x78,0x6F,0x39,0x44,0x58,0x36,0x79,0x59,0x66,0x57,0x76,0x36,0x43,0x2F,0x54, + 0x55,0x32,0x50,0x72,0x55,0x53,0x36,0x39,0x44,0x20,0x63,0x59,0x37,0x67,0x41, + 0x5A,0x7A,0x44,0x69,0x49,0x34,0x4D,0x68,0x46,0x59,0x41,0x4F,0x6C,0x49,0x77, + 0x75,0x69,0x6B,0x7A,0x45,0x53,0x71,0x6A,0x6A,0x36,0x58,0x61,0x4F,0x4D,0x76, + 0x65,0x66,0x73,0x35,0x59,0x52,0x4F,0x30,0x74,0x4A,0x45,0x46,0x57,0x45,0x58, + 0x67,0x74,0x54,0x6F,0x32,0x44,0x68,0x64,0x47,0x37,0x31,0x42,0x4B,0x6A,0x4D, + 0x78,0x31,0x58,0x52,0x75,0x39,0x54,0x20,0x35,0x33,0x53,0x38,0x61,0x33,0x68, + 0x43,0x57,0x38,0x4B,0x49,0x4A,0x52,0x6D,0x49,0x42,0x57,0x42,0x4A,0x63,0x74, + 0x35,0x59,0x6C,0x79,0x35,0x31,0x48,0x78,0x77,0x64,0x6C,0x36,0x5A,0x7A,0x67, + 0x69,0x36,0x2B,0x46,0x43,0x6B,0x54,0x63,0x7A,0x50,0x35,0x69,0x39,0x48,0x37, + 0x31,0x4D,0x2B,0x6D,0x51,0x2B,0x73,0x6F,0x6A,0x47,0x30,0x49,0x4E,0x63,0x57, + 0x4A,0x69,0x6F,0x73,0x34,0x20,0x68,0x51,0x6B,0x4D,0x43,0x71,0x45,0x56,0x67, + 0x49,0x63,0x39,0x32,0x4E,0x31,0x71,0x53,0x32,0x73,0x6F,0x4E,0x34,0x78,0x7A, + 0x7A,0x58,0x67,0x37,0x52,0x32,0x38,0x42,0x4B,0x58,0x77,0x4A,0x7A,0x73,0x32, + 0x6B,0x45,0x74,0x30,0x5A,0x57,0x35,0x2B,0x36,0x6F,0x4B,0x4D,0x30,0x6E,0x56, + 0x70,0x4C,0x5A,0x6D,0x79,0x76,0x55,0x65,0x56,0x4C,0x61,0x31,0x52,0x52,0x2B, + 0x67,0x6F,0x56,0x20,0x55,0x34,0x55,0x67,0x67,0x63,0x45,0x67,0x74,0x41,0x4A, + 0x67,0x4E,0x33,0x62,0x49,0x41,0x32,0x56,0x39,0x39,0x2B,0x6E,0x62,0x69,0x70, + 0x6E,0x32,0x4C,0x57,0x43,0x4A,0x2F,0x59,0x79,0x2B,0x32,0x75,0x76,0x58,0x5A, + 0x58,0x6A,0x4A,0x56,0x77,0x48,0x4E,0x4B,0x7A,0x77,0x2F,0x45,0x6D,0x2B,0x4E, + 0x76,0x6B,0x71,0x31,0x61,0x39,0x48,0x34,0x65,0x7A,0x68,0x5A,0x4E,0x58,0x48, + 0x4E,0x20,0x66,0x6C,0x33,0x2B,0x53,0x33,0x67,0x48,0x74,0x64,0x35,0x57,0x6E, + 0x79,0x49,0x48,0x67,0x39,0x41,0x4B,0x51,0x47,0x31,0x32,0x56,0x68,0x73,0x2F, + 0x4E,0x74,0x7A,0x59,0x41,0x58,0x72,0x38,0x70,0x7A,0x33,0x32,0x5A,0x57,0x5A, + 0x48,0x70,0x79,0x36,0x46,0x6A,0x78,0x78,0x6C,0x35,0x68,0x76,0x57,0x6B,0x43, + 0x65,0x4D,0x38,0x58,0x50,0x72,0x30,0x4F,0x64,0x77,0x45,0x7A,0x67,0x47,0x20, + 0x6E,0x35,0x67,0x4A,0x38,0x71,0x6B,0x4C,0x4F,0x34,0x4F,0x2B,0x66,0x39,0x53, + 0x4E,0x6F,0x66,0x6B,0x31,0x72,0x4F,0x41,0x6E,0x2B,0x42,0x30,0x36,0x2B,0x41, + 0x45,0x47,0x67,0x39,0x41,0x4B,0x67,0x44,0x62,0x62,0x68,0x7A,0x5A,0x2B,0x62, + 0x44,0x67,0x54,0x49,0x44,0x66,0x36,0x57,0x47,0x70,0x71,0x48,0x4E,0x74,0x6E, + 0x4E,0x39,0x33,0x2F,0x71,0x74,0x64,0x49,0x35,0x62,0x2F,0x61,0x20,0x4C,0x2B, + 0x47,0x43,0x4A,0x6A,0x4F,0x32,0x5A,0x61,0x72,0x47,0x2B,0x37,0x6A,0x31,0x6C, + 0x51,0x33,0x6B,0x6B,0x72,0x46,0x6E,0x48,0x65,0x50,0x6C,0x2F,0x78,0x48,0x4F, + 0x34,0x4B,0x70,0x31,0x35,0x59,0x77,0x70,0x34,0x41,0x32,0x38,0x68,0x31,0x4E, + 0x6F,0x6F,0x61,0x4C,0x33,0x73,0x54,0x45,0x6D,0x74,0x76,0x4D,0x74,0x36,0x36, + 0x48,0x39,0x51,0x52,0x42,0x74,0x37,0x70,0x4F,0x33,0x20,0x6F,0x54,0x58,0x79, + 0x65,0x30,0x38,0x66,0x53,0x39,0x54,0x42,0x79,0x7A,0x33,0x6E,0x52,0x38,0x69, + 0x6C,0x70,0x34,0x38,0x68,0x36,0x73,0x41,0x58,0x6E,0x75,0x50,0x50,0x79,0x4E, + 0x65,0x65,0x76,0x6B,0x78,0x55,0x6E,0x68,0x36,0x68,0x32,0x68,0x59,0x4F,0x34, + 0x52,0x41,0x71,0x5A,0x38,0x74,0x51,0x30,0x4B,0x6E,0x59,0x4C,0x54,0x54,0x2B, + 0x41,0x4B,0x36,0x61,0x31,0x34,0x37,0x76,0x20,0x61,0x67,0x75,0x4D,0x56,0x39, + 0x42,0x66,0x6A,0x78,0x31,0x58,0x59,0x66,0x42,0x6A,0x5A,0x45,0x76,0x47,0x61, + 0x7A,0x30,0x35,0x46,0x4F,0x54,0x7A,0x47,0x6B,0x36,0x67,0x35,0x70,0x51,0x4E, + 0x61,0x64,0x34,0x2B,0x51,0x6E,0x73,0x44,0x71,0x4E,0x6C,0x53,0x35,0x32,0x31, + 0x72,0x67,0x71,0x78,0x4E,0x48,0x78,0x75,0x56,0x43,0x58,0x42,0x71,0x39,0x44, + 0x48,0x55,0x69,0x58,0x46,0x71,0x20,0x31,0x32,0x43,0x36,0x66,0x31,0x4E,0x72, + 0x4E,0x50,0x76,0x36,0x6E,0x57,0x4B,0x37,0x2F,0x32,0x33,0x55,0x63,0x79,0x58, + 0x42,0x64,0x47,0x48,0x4D,0x43,0x33,0x54,0x35,0x65,0x77,0x33,0x6D,0x54,0x46, + 0x62,0x52,0x72,0x4A,0x59,0x34,0x79,0x65,0x6A,0x4C,0x50,0x53,0x5A,0x4C,0x78, + 0x71,0x70,0x72,0x44,0x6C,0x50,0x34,0x41,0x63,0x36,0x67,0x35,0x73,0x74,0x2F, + 0x43,0x63,0x50,0x42,0x20,0x53,0x48,0x39,0x78,0x5A,0x5A,0x2F,0x2F,0x45,0x6F, + 0x72,0x2B,0x79,0x6F,0x79,0x50,0x4B,0x35,0x53,0x78,0x31,0x35,0x76,0x35,0x41, + 0x5A,0x48,0x31,0x31,0x33,0x38,0x32,0x2B,0x63,0x73,0x2F,0x6D,0x36,0x35,0x76, + 0x30,0x68,0x46,0x76,0x55,0x78,0x38,0x61,0x50,0x7A,0x4E,0x2B,0x70,0x4E,0x37, + 0x41,0x50,0x6C,0x39,0x64,0x34,0x39,0x4D,0x6C,0x34,0x2F,0x76,0x38,0x4C,0x4C, + 0x4D,0x58,0x20,0x2B,0x48,0x75,0x45,0x4C,0x38,0x55,0x4E,0x45,0x35,0x66,0x35, + 0x44,0x36,0x6F,0x76,0x74,0x4B,0x38,0x41,0x71,0x75,0x77,0x54,0x71,0x42,0x2B, + 0x53,0x57,0x6A,0x67,0x45,0x76,0x52,0x4B,0x4F,0x6A,0x55,0x63,0x43,0x70,0x46, + 0x36,0x51,0x53,0x2B,0x53,0x5A,0x70,0x77,0x38,0x70,0x36,0x70,0x4D,0x36,0x39, + 0x78,0x7A,0x4F,0x6B,0x63,0x38,0x38,0x66,0x52,0x50,0x52,0x2B,0x74,0x4C,0x63, + 0x20,0x42,0x5A,0x53,0x2F,0x57,0x6B,0x71,0x44,0x6E,0x46,0x5A,0x6A,0x66,0x56, + 0x79,0x6A,0x36,0x4B,0x76,0x48,0x47,0x4E,0x41,0x2B,0x48,0x73,0x4F,0x73,0x59, + 0x56,0x63,0x4D,0x72,0x61,0x39,0x71,0x2B,0x49,0x38,0x6E,0x64,0x34,0x30,0x4E, + 0x30,0x68,0x5A,0x69,0x41,0x64,0x42,0x47,0x36,0x33,0x65,0x41,0x78,0x4E,0x74, + 0x78,0x48,0x65,0x61,0x35,0x70,0x34,0x38,0x68,0x54,0x6E,0x47,0x71,0x20,0x37, + 0x37,0x45,0x2B,0x39,0x4A,0x31,0x61,0x42,0x33,0x52,0x49,0x44,0x42,0x31,0x48, + 0x65,0x64,0x4C,0x46,0x7A,0x73,0x77,0x69,0x74,0x57,0x35,0x64,0x37,0x68,0x4A, + 0x4F,0x34,0x41,0x33,0x55,0x32,0x42,0x59,0x31,0x77,0x67,0x46,0x55,0x75,0x79, + 0x33,0x6B,0x54,0x61,0x43,0x4B,0x64,0x70,0x74,0x78,0x74,0x2F,0x56,0x38,0x67, + 0x38,0x63,0x4A,0x74,0x51,0x44,0x4D,0x79,0x4F,0x53,0x46,0x20,0x6C,0x30,0x32, + 0x48,0x72,0x4D,0x4D,0x36,0x4A,0x68,0x4B,0x63,0x50,0x30,0x4B,0x31,0x4C,0x58, + 0x52,0x51,0x6A,0x2B,0x42,0x51,0x68,0x7A,0x58,0x44,0x6C,0x79,0x36,0x72,0x48, + 0x32,0x4F,0x42,0x66,0x67,0x4A,0x66,0x41,0x2F,0x6D,0x7A,0x61,0x31,0x2F,0x6C, + 0x54,0x7A,0x45,0x56,0x4F,0x32,0x4B,0x50,0x4D,0x78,0x44,0x61,0x6A,0x34,0x44, + 0x74,0x56,0x73,0x78,0x62,0x6F,0x57,0x6C,0x54,0x20,0x32,0x6C,0x6B,0x6A,0x6A, + 0x39,0x58,0x55,0x4F,0x4E,0x61,0x62,0x68,0x6F,0x38,0x4D,0x78,0x56,0x35,0x59, + 0x76,0x33,0x38,0x54,0x75,0x63,0x75,0x58,0x59,0x75,0x70,0x54,0x2B,0x72,0x57, + 0x51,0x6E,0x30,0x4E,0x59,0x72,0x65,0x6E,0x6F,0x6D,0x6E,0x47,0x4C,0x4E,0x63, + 0x66,0x47,0x59,0x54,0x76,0x4D,0x51,0x4B,0x67,0x46,0x77,0x4A,0x48,0x7A,0x53, + 0x35,0x50,0x33,0x43,0x2F,0x54,0x4D,0x20,0x32,0x49,0x5A,0x57,0x64,0x53,0x6E, + 0x73,0x78,0x56,0x42,0x4D,0x46,0x59,0x45,0x55,0x76,0x68,0x52,0x54,0x4A,0x6E, + 0x59,0x56,0x45,0x6C,0x31,0x2B,0x39,0x31,0x4B,0x6E,0x5A,0x70,0x37,0x38,0x36, + 0x47,0x33,0x6C,0x32,0x74,0x69,0x74,0x71,0x72,0x77,0x4F,0x55,0x58,0x53,0x73, + 0x33,0x36,0x69,0x50,0x6B,0x49,0x46,0x51,0x76,0x77,0x49,0x6F,0x6C,0x51,0x6E, + 0x38,0x42,0x6C,0x50,0x59,0x20,0x6F,0x6B,0x59,0x34,0x67,0x47,0x72,0x48,0x67, + 0x75,0x4C,0x71,0x73,0x6D,0x59,0x6D,0x67,0x47,0x4C,0x71,0x38,0x6C,0x77,0x62, + 0x2B,0x7A,0x49,0x31,0x70,0x31,0x4F,0x46,0x53,0x36,0x32,0x46,0x2F,0x49,0x78, + 0x31,0x45,0x62,0x58,0x32,0x63,0x36,0x68,0x57,0x72,0x4F,0x45,0x43,0x33,0x73, + 0x49,0x53,0x52,0x76,0x77,0x68,0x47,0x51,0x69,0x35,0x41,0x47,0x69,0x4C,0x63, + 0x71,0x6A,0x4C,0x20,0x36,0x4B,0x4E,0x43,0x4F,0x59,0x48,0x4F,0x4E,0x77,0x34, + 0x73,0x4A,0x2F,0x6A,0x72,0x4B,0x67,0x49,0x4B,0x6F,0x38,0x73,0x30,0x68,0x31, + 0x2B,0x68,0x31,0x69,0x4B,0x39,0x52,0x59,0x6F,0x67,0x48,0x73,0x4E,0x4A,0x49, + 0x39,0x4D,0x38,0x67,0x77,0x72,0x4A,0x37,0x4A,0x6B,0x31,0x47,0x6D,0x49,0x47, + 0x54,0x41,0x5A,0x43,0x4C,0x77,0x42,0x4B,0x78,0x77,0x7A,0x71,0x55,0x39,0x53, + 0x48,0x20,0x4C,0x70,0x32,0x4B,0x51,0x4F,0x6B,0x62,0x42,0x35,0x59,0x54,0x2F, + 0x4E,0x31,0x41,0x58,0x65,0x53,0x68,0x6F,0x48,0x57,0x66,0x77,0x63,0x56,0x51, + 0x44,0x71,0x4F,0x66,0x74,0x35,0x32,0x42,0x55,0x48,0x38,0x44,0x38,0x48,0x64, + 0x31,0x68,0x6A,0x4C,0x33,0x44,0x63,0x69,0x36,0x6E,0x50,0x71,0x45,0x31,0x67, + 0x57,0x56,0x2F,0x46,0x4A,0x6B,0x54,0x4D,0x78,0x68,0x6C,0x34,0x38,0x61,0x20, + 0x75,0x34,0x71,0x4D,0x4C,0x71,0x7A,0x6B,0x31,0x32,0x4B,0x4F,0x67,0x77,0x4F, + 0x34,0x65,0x4B,0x32,0x6A,0x4F,0x44,0x2B,0x63,0x44,0x4D,0x51,0x33,0x67,0x50, + 0x2F,0x32,0x57,0x70,0x65,0x39,0x2B,0x45,0x2F,0x39,0x54,0x5A,0x71,0x6A,0x36, + 0x5A,0x56,0x38,0x6E,0x63,0x75,0x56,0x4D,0x57,0x34,0x43,0x39,0x5A,0x6F,0x75, + 0x57,0x61,0x6A,0x67,0x34,0x55,0x2B,0x70,0x2B,0x35,0x38,0x45,0x20,0x38,0x78, + 0x53,0x65,0x77,0x68,0x53,0x75,0x69,0x35,0x71,0x42,0x43,0x33,0x67,0x4A,0x48, + 0x59,0x79,0x49,0x47,0x64,0x67,0x6F,0x41,0x37,0x45,0x41,0x2F,0x4A,0x34,0x75, + 0x58,0x63,0x4B,0x72,0x33,0x30,0x33,0x50,0x74,0x42,0x4B,0x4C,0x4C,0x74,0x34, + 0x2F,0x58,0x73,0x39,0x48,0x35,0x41,0x54,0x6D,0x6E,0x73,0x32,0x4B,0x4B,0x67, + 0x43,0x56,0x4E,0x58,0x62,0x6F,0x47,0x62,0x59,0x4A,0x20,0x2F,0x41,0x54,0x54, + 0x68,0x6A,0x51,0x2F,0x34,0x66,0x68,0x58,0x6C,0x4A,0x38,0x48,0x75,0x49,0x41, + 0x52,0x4D,0x51,0x4D,0x76,0x7A,0x6B,0x41,0x73,0x41,0x4D,0x39,0x54,0x70,0x77, + 0x75,0x6F,0x74,0x77,0x47,0x31,0x51,0x36,0x48,0x47,0x30,0x51,0x46,0x55,0x47, + 0x78,0x45,0x7A,0x73,0x44,0x63,0x5A,0x69,0x4C,0x38,0x42,0x50,0x4E,0x2B,0x4B, + 0x43,0x70,0x4D,0x2B,0x72,0x63,0x2B,0x67,0x20,0x67,0x36,0x2F,0x46,0x48,0x41, + 0x64,0x48,0x4D,0x46,0x37,0x2B,0x31,0x32,0x59,0x79,0x7A,0x68,0x38,0x38,0x41, + 0x2F,0x45,0x4E,0x59,0x48,0x56,0x4B,0x4D,0x34,0x62,0x6F,0x75,0x33,0x6B,0x4F, + 0x4A,0x61,0x2B,0x43,0x43,0x6B,0x67,0x4A,0x39,0x59,0x71,0x75,0x4E,0x6C,0x35, + 0x38,0x6B,0x68,0x43,0x78,0x6E,0x78,0x6D,0x49,0x42,0x57,0x44,0x7A,0x66,0x56, + 0x45,0x52,0x53,0x44,0x71,0x6D,0x20,0x36,0x61,0x4A,0x58,0x48,0x66,0x5A,0x6F, + 0x69,0x68,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41,0x72,0x43,0x33,0x57,0x78,0x4D, + 0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x62,0x69,0x62,0x77,0x44,0x6A,0x35,0x7A, + 0x68,0x47,0x69,0x42,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41,0x72,0x43,0x33,0x57, + 0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x5A,0x69,0x41,0x52,0x67,0x2F, + 0x78,0x7A,0x46,0x43,0x20,0x7A,0x4D,0x44,0x65,0x5A,0x69,0x41,0x57,0x67,0x4C, + 0x33,0x64,0x6D,0x72,0x69,0x77,0x6D,0x49,0x48,0x78,0x4D,0x78,0x41,0x4C,0x77, + 0x50,0x67,0x35,0x6A,0x68,0x46,0x69,0x42,0x76,0x59,0x32,0x41,0x37,0x45,0x41, + 0x37,0x4F,0x33,0x57,0x78,0x49,0x58,0x46,0x44,0x49,0x79,0x66,0x67,0x56,0x67, + 0x41,0x78,0x73,0x39,0x78,0x6A,0x42,0x41,0x7A,0x73,0x4C,0x63,0x5A,0x2B,0x44, + 0x2F,0x67,0x20,0x6B,0x56,0x6D,0x37,0x6B,0x69,0x4A,0x4A,0x36,0x67,0x41,0x41, + 0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D, + 0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x70,0x6C,0x61,0x6E,0x65, + 0x74,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x64,0x35,0x6B,0x6C,0x45,0x51,0x56,0x52,0x34,0x6E,0x4F,0x32,0x64,0x66, + 0x5A,0x42,0x63,0x31,0x58,0x6E,0x6D,0x66,0x37,0x64,0x37,0x20,0x50,0x71,0x55, + 0x5A,0x7A,0x57,0x6A,0x30,0x4D,0x66,0x70,0x41,0x51,0x69,0x4E,0x45,0x4A,0x41, + 0x47,0x79,0x51,0x4D,0x45,0x73,0x77,0x6F,0x41,0x4D,0x43,0x56,0x35,0x69,0x78, + 0x53,0x6E,0x6A,0x73,0x47,0x56,0x58,0x4A,0x62,0x76,0x72,0x4C,0x55,0x78,0x43, + 0x63,0x4A,0x6D,0x74,0x70,0x4C,0x4C,0x6C,0x53,0x72,0x41,0x68,0x41,0x64,0x74, + 0x4A,0x4F,0x61,0x6D,0x34,0x6A,0x41,0x74,0x77,0x20,0x58,0x48,0x61,0x74,0x64, + 0x31,0x31,0x4F,0x78,0x52,0x56,0x32,0x6C,0x58,0x56,0x46,0x57,0x44,0x5A,0x6C, + 0x73,0x41,0x4F,0x78,0x4D,0x49,0x73,0x52,0x57,0x42,0x69,0x51,0x73,0x4E,0x43, + 0x33,0x72,0x4E,0x46,0x49,0x6F,0x35,0x6E,0x52,0x6A,0x4F,0x61,0x7A,0x37,0x38, + 0x30,0x66,0x70,0x78,0x76,0x64,0x61,0x63,0x31,0x6F,0x7A,0x72,0x6C,0x39,0x75, + 0x2F,0x74,0x32,0x33,0x2B,0x64,0x58,0x20,0x64,0x59,0x76,0x70,0x34,0x66,0x53, + 0x64,0x6F,0x2B,0x37,0x7A,0x50,0x50,0x63,0x39,0x35,0x37,0x7A,0x6E,0x48,0x43, + 0x38,0x49,0x41,0x6F,0x51,0x51,0x36,0x53,0x52,0x54,0x37,0x51,0x6F,0x49,0x49, + 0x61,0x71,0x48,0x44,0x45,0x43,0x49,0x46,0x43,0x4D,0x44,0x45,0x43,0x4C,0x46, + 0x79,0x41,0x43,0x45,0x53,0x44,0x45,0x79,0x41,0x43,0x46,0x53,0x6A,0x41,0x78, + 0x41,0x69,0x42,0x51,0x6A,0x20,0x41,0x78,0x41,0x69,0x78,0x63,0x67,0x41,0x68, + 0x45,0x67,0x78,0x44,0x61,0x58,0x65,0x34,0x49,0x6C,0x58,0x78,0x75,0x4F,0x6F, + 0x68,0x78,0x41,0x69,0x41,0x76,0x64,0x76,0x61,0x53,0x37,0x70,0x2F,0x59,0x6F, + 0x41,0x68,0x45,0x67,0x78,0x4A,0x55,0x63,0x41,0x6F,0x71,0x62,0x78,0x5A,0x76, + 0x6D,0x39,0x38,0x73,0x4E,0x54,0x67,0x67,0x79,0x67,0x2F,0x70,0x67,0x48,0x58, + 0x41,0x56,0x73,0x20,0x41,0x6A,0x72,0x79,0x50,0x77,0x4F,0x73,0x42,0x70,0x61, + 0x45,0x79,0x71,0x30,0x48,0x35,0x73,0x39,0x79,0x6A,0x78,0x46,0x67,0x58,0x2B, + 0x68,0x31,0x48,0x33,0x41,0x6B,0x2F,0x2F,0x4D,0x62,0x77,0x43,0x43,0x77,0x4E, + 0x2F,0x2F,0x7A,0x2B,0x56,0x68,0x71,0x4C,0x61,0x71,0x43,0x44,0x4B,0x41,0x32, + 0x38,0x59,0x42,0x31,0x6F,0x57,0x73,0x54,0x52,0x75,0x67,0x39,0x77,0x49,0x6F, + 0x59,0x20,0x37,0x6A,0x38,0x66,0x32,0x47,0x4A,0x5A,0x39,0x67,0x52,0x77,0x45, + 0x47,0x4D,0x47,0x65,0x34,0x46,0x66,0x68,0x69,0x35,0x46,0x45,0x67,0x6C,0x48, + 0x42,0x6C,0x41,0x62,0x58,0x41,0x6C,0x73,0x42,0x57,0x34,0x47,0x62,0x67,0x41, + 0x32,0x56,0x37,0x63,0x36,0x30,0x31,0x69,0x52,0x76,0x39,0x34,0x33,0x77,0x2F, + 0x39,0x37,0x44,0x58,0x67,0x4A,0x65,0x41,0x48,0x59,0x44,0x62,0x78,0x64,0x20, + 0x77,0x58,0x6F,0x4A,0x43,0x32,0x51,0x41,0x79,0x65,0x51,0x47,0x34,0x42,0x61, + 0x4D,0x34,0x47,0x38,0x47,0x46,0x6C,0x65,0x33,0x4F,0x70,0x48,0x5A,0x6E,0x4C, + 0x2F,0x75,0x7A,0x62,0x38,0x2B,0x6A,0x54,0x47,0x43,0x46,0x34,0x44,0x6E,0x38, + 0x7A,0x2B,0x4C,0x4B,0x69,0x49,0x44,0x53,0x41,0x61,0x62,0x67,0x4F,0x33,0x41, + 0x48,0x52,0x6A,0x42,0x4E,0x31,0x57,0x33,0x4F,0x6D,0x56,0x6A,0x20,0x4D,0x66, + 0x43,0x68,0x2F,0x41,0x57,0x51,0x77,0x35,0x6A,0x42,0x4C,0x6D,0x41,0x6E,0x70, + 0x67,0x73,0x68,0x4B,0x6F,0x67,0x4D,0x6F,0x44,0x70,0x30,0x59,0x63,0x52,0x2B, + 0x4F,0x33,0x41,0x58,0x30,0x77,0x66,0x6E,0x30,0x6B,0x51,0x57,0x32,0x4A,0x61, + 0x2F,0x2F,0x67,0x6F,0x7A,0x32,0x4C,0x67,0x44,0x65,0x42,0x5A,0x34,0x42,0x75, + 0x69,0x76,0x58,0x74,0x58,0x53,0x67,0x51,0x79,0x67,0x20,0x73,0x6E,0x77,0x55, + 0x75,0x44,0x74,0x2F,0x69,0x59,0x74,0x5A,0x41,0x76,0x78,0x42,0x2F,0x67,0x4A, + 0x34,0x4B,0x6E,0x2F,0x4A,0x44,0x4D,0x71,0x45,0x44,0x4B,0x44,0x38,0x33,0x41, + 0x6E,0x63,0x67,0x33,0x6E,0x53,0x5A,0x36,0x74,0x63,0x6C,0x31,0x6F,0x6A,0x62, + 0x4A,0x5A,0x50,0x41,0x64,0x2F,0x41,0x64,0x42,0x64,0x45,0x54,0x4D,0x67,0x41, + 0x79,0x6B,0x4D,0x50,0x38,0x48,0x47,0x4D,0x20,0x38,0x46,0x64,0x57,0x74,0x79, + 0x70,0x31,0x51,0x38,0x45,0x4D,0x6A,0x6D,0x4F,0x4D,0x34,0x4A,0x75,0x59,0x36, + 0x55,0x64,0x52,0x41,0x6C,0x55,0x33,0x67,0x47,0x2B,0x38,0x31,0x56,0x6A,0x74, + 0x4B,0x70,0x54,0x45,0x50,0x52,0x73,0x6D,0x77,0x79,0x38,0x2F,0x43,0x4E,0x79, + 0x50,0x47,0x64,0x41,0x54,0x35,0x57,0x45,0x6C,0x38,0x46,0x44,0x2B,0x32,0x67, + 0x6B,0x38,0x41,0x54,0x78,0x64,0x20,0x2B,0x4A,0x2B,0x31,0x31,0x70,0x36,0x4B, + 0x32,0x6B,0x2F,0x46,0x71,0x62,0x6F,0x42,0x31,0x43,0x49,0x7A,0x66,0x47,0x6E, + 0x33,0x59,0x59,0x53,0x2F,0x71,0x66,0x4B,0x31,0x6D,0x55,0x34,0x75,0x67,0x4C, + 0x50,0x6A,0x48,0x6D,0x66,0x48,0x50,0x53,0x5A,0x38,0x47,0x42,0x67,0x33,0x32, + 0x62,0x37,0x44,0x6B,0x78,0x35,0x6A,0x75,0x51,0x76,0x6C,0x42,0x69,0x63,0x38, + 0x4A,0x76,0x32,0x5A,0x20,0x37,0x39,0x47,0x59,0x67,0x59,0x36,0x6D,0x43,0x7A, + 0x6B,0x38,0x4C,0x56,0x6C,0x6F,0x61,0x7A,0x53,0x76,0x4F,0x35,0x73,0x44,0x6D, + 0x6A,0x4B,0x77,0x73,0x44,0x6C,0x67,0x59,0x58,0x4E,0x41,0x64,0x72,0x5A,0x6B, + 0x34,0x73,0x71,0x77,0x50,0x58,0x2F,0x74,0x78,0x52,0x6A,0x42,0x56,0x38,0x50, + 0x66,0x54,0x61,0x32,0x5A,0x51,0x54,0x57,0x51,0x41,0x54,0x68,0x51,0x4A,0x50, + 0x77,0x75,0x20,0x34,0x4A,0x4D,0x59,0x34,0x53,0x2B,0x72,0x64,0x46,0x32,0x47, + 0x4A,0x6A,0x79,0x47,0x4A,0x73,0x31,0x2F,0x43,0x34,0x49,0x2F,0x4E,0x77,0x6E, + 0x6E,0x70,0x30,0x70,0x58,0x35,0x4B,0x51,0x50,0x70,0x38,0x65,0x4B,0x37,0x7A, + 0x50,0x7A,0x66,0x65,0x63,0x31,0x42,0x4C,0x51,0x33,0x58,0x6A,0x43,0x45,0x42, + 0x55,0x30,0x42,0x43,0x78,0x70,0x68,0x51,0x56,0x4E,0x46,0x6B,0x77,0x41,0x33, + 0x20,0x41,0x55,0x38,0x43,0x44,0x32,0x4F,0x4D,0x34,0x48,0x47,0x67,0x76,0x2F, + 0x42,0x39,0x79,0x51,0x68,0x6D,0x52,0x77,0x5A,0x67,0x53,0x55,0x6A,0x38,0x6A, + 0x63,0x43,0x44,0x6D,0x4D,0x5A,0x57,0x45,0x59,0x59,0x6D,0x50,0x45,0x36,0x4E, + 0x65,0x76,0x53,0x4F,0x65,0x76,0x53,0x4E,0x65,0x5A,0x79,0x35,0x53,0x4A,0x7A, + 0x56,0x34,0x2F,0x79,0x55,0x78,0x2F,0x6B,0x70,0x36,0x42,0x32,0x39,0x20,0x75, + 0x45,0x36,0x4C,0x57,0x67,0x4B,0x57,0x74,0x41,0x52,0x30,0x74,0x77,0x59,0x73, + 0x62,0x51,0x30,0x71,0x59,0x51,0x72,0x4C,0x67,0x45,0x66,0x79,0x31,0x31,0x38, + 0x43,0x6E,0x77,0x63,0x6D,0x37,0x39,0x6B,0x77,0x4B,0x52,0x4F,0x59,0x42,0x52, + 0x6E,0x41,0x48,0x42,0x51,0x39,0x39,0x66,0x38,0x63,0x38,0x38,0x51,0x76,0x36, + 0x38,0x44,0x65,0x38,0x4B,0x54,0x48,0x30,0x52,0x47,0x50,0x20,0x34,0x79,0x4D, + 0x65,0x76,0x65,0x63,0x7A,0x30,0x30,0x4C,0x33,0x57,0x75,0x4A,0x4D,0x33,0x71, + 0x7A,0x65,0x47,0x6A,0x43,0x76,0x57,0x37,0x4B,0x77,0x74,0x4E,0x58,0x6E,0x73, + 0x72,0x61,0x41,0x56,0x66,0x4F,0x44,0x64,0x37,0x73,0x56,0x5A,0x65,0x4A,0x68, + 0x34,0x42,0x4F,0x59,0x69,0x4F,0x41,0x4C,0x69,0x67,0x5A,0x6D,0x52,0x67,0x59, + 0x77,0x43,0x30,0x58,0x43,0x66,0x77,0x41,0x6A,0x20,0x2F,0x50,0x58,0x6C,0x2B, + 0x46,0x73,0x42,0x63,0x48,0x7A,0x45,0x34,0x38,0x52,0x49,0x68,0x73,0x50,0x44, + 0x48,0x6B,0x4D,0x54,0x79,0x58,0x6E,0x43,0x78,0x38,0x6C,0x59,0x44,0x6F,0x34, + 0x4D,0x5A,0x7A,0x67,0x79,0x62,0x46,0x34,0x76,0x61,0x41,0x71,0x34,0x76,0x43, + 0x31,0x67,0x78,0x58,0x79,0x66,0x6C,0x66,0x4F,0x44,0x57,0x64,0x63,0x6D,0x6C, + 0x38,0x42,0x4B,0x54,0x42,0x54,0x77,0x20,0x58,0x7A,0x42,0x47,0x38,0x4A,0x69, + 0x4D,0x59,0x44,0x6F,0x79,0x67,0x43,0x49,0x71,0x4F,0x61,0x70,0x2F,0x62,0x4D, + 0x54,0x6A,0x34,0x4C,0x6B,0x4D,0x68,0x38,0x39,0x6C,0x47,0x4B,0x2F,0x52,0x70, + 0x33,0x77,0x70,0x44,0x45,0x31,0x34,0x37,0x4F,0x33,0x33,0x32,0x4E,0x75,0x66, + 0x6F,0x54,0x6B,0x4C,0x6C,0x37,0x66,0x37,0x39,0x4C,0x53,0x58,0x78,0x51,0x7A, + 0x57,0x41,0x31,0x38,0x47,0x20,0x50,0x6B,0x42,0x2B,0x31,0x6B,0x42,0x47,0x59, + 0x4A,0x41,0x42,0x68,0x41,0x69,0x4A,0x66,0x77,0x32,0x6D,0x6E,0x2F,0x2B,0x4A, + 0x75,0x50,0x2F,0x47,0x71,0x56,0x47,0x50,0x66,0x59,0x50,0x70,0x46,0x66,0x31, + 0x73,0x6A,0x4F,0x64,0x67,0x2F,0x30,0x43,0x47,0x2F,0x51,0x4D,0x58,0x7A,0x47, + 0x42,0x39,0x68,0x38,0x2F,0x53,0x31,0x6C,0x69,0x37,0x43,0x59,0x56,0x5A,0x67, + 0x36,0x39,0x6A,0x20,0x49,0x6F,0x4E,0x44,0x61,0x52,0x38,0x66,0x6B,0x41,0x46, + 0x77,0x30,0x56,0x50,0x2F,0x73,0x35,0x68,0x42,0x70,0x4E,0x67,0x59,0x7A,0x38, + 0x48,0x62,0x67,0x78,0x6E,0x32,0x44,0x57,0x62,0x65,0x6E,0x5A,0x59,0x54,0x73, + 0x78,0x4D,0x32,0x67,0x38,0x37,0x6D,0x67,0x50,0x55,0x64,0x50,0x6C,0x64,0x32, + 0x2B,0x44,0x54,0x48,0x6C,0x30,0x66,0x35,0x69,0x66,0x7A,0x31,0x45,0x50,0x42, + 0x6F,0x20,0x6D,0x71,0x4F,0x42,0x31,0x4F,0x38,0x4A,0x47,0x42,0x4C,0x2F,0x65, + 0x34,0x48,0x76,0x45,0x61,0x50,0x34,0x2B,0x38,0x59,0x38,0x66,0x6E,0x51,0x69, + 0x79,0x7A,0x2F,0x38,0x73,0x70,0x47,0x66,0x6E,0x73,0x70,0x4B,0x2F,0x42,0x45, + 0x59,0x47,0x50,0x66,0x34,0x36,0x53,0x6E,0x7A,0x47,0x66,0x37,0x6F,0x52,0x4A, + 0x61,0x2B,0x65,0x47,0x64,0x41,0x48,0x73,0x46,0x38,0x35,0x2B,0x2B,0x46,0x20, + 0x36,0x69,0x66,0x6C,0x56,0x49,0x50,0x55,0x52,0x67,0x42,0x46,0x58,0x2F,0x61, + 0x6A,0x77,0x47,0x66,0x69,0x75,0x76,0x65,0x52,0x34,0x51,0x77,0x2F,0x50,0x35, + 0x4F,0x5A,0x63,0x57,0x70,0x4D,0x52,0x4D,0x4D,0x50,0x34,0x4D,0x42,0x51,0x68, + 0x67,0x4E,0x44,0x47,0x62,0x70,0x62,0x41,0x39,0x36,0x7A,0x79,0x47,0x64,0x31, + 0x32,0x79,0x79,0x5A,0x54,0x47,0x37,0x63,0x6D,0x62,0x38,0x2B,0x20,0x42,0x33, + 0x77,0x32,0x62,0x64,0x46,0x41,0x4B,0x69,0x4F,0x41,0x6B,0x50,0x6A,0x58,0x59, + 0x35,0x61,0x65,0x6C,0x69,0x7A,0x2B,0x41,0x42,0x4F,0x32,0x50,0x76,0x56,0x4F, + 0x41,0x38,0x38,0x63,0x79,0x30,0x72,0x38,0x5A,0x61,0x52,0x33,0x31,0x4F,0x4F, + 0x5A,0x59,0x31,0x6D,0x65,0x65,0x71,0x65,0x42,0x2F,0x51,0x4F,0x5A,0x75,0x50, + 0x59,0x64,0x2B,0x77,0x79,0x6D,0x4C,0x61,0x79,0x48,0x20,0x39,0x45,0x51,0x44, + 0x71,0x54,0x4F,0x41,0x30,0x42,0x66,0x37,0x2B,0x35,0x67,0x74,0x71,0x32,0x34, + 0x72,0x39,0x5A,0x35,0x76,0x44,0x78,0x72,0x68,0x50,0x33,0x38,0x79,0x79,0x32, + 0x43,0x64,0x54,0x75,0x45,0x6C,0x6B,0x63,0x45,0x4A,0x6A,0x2B,0x64,0x50,0x47, + 0x69,0x4E,0x34,0x65,0x7A,0x43,0x57,0x70,0x6E,0x77,0x62,0x70,0x6B,0x33,0x38, + 0x50,0x71,0x54,0x44,0x42,0x46,0x4C,0x54,0x20,0x42,0x53,0x6A,0x36,0x4D,0x70, + 0x2F,0x45,0x35,0x4F,0x2B,0x58,0x78,0x44,0x74,0x44,0x47,0x66,0x61,0x63,0x30, + 0x63,0x42,0x65,0x74,0x52,0x6D,0x61,0x38,0x50,0x6A,0x58,0x58,0x32,0x58,0x35, + 0x65,0x58,0x2B,0x47,0x36,0x78,0x62,0x35,0x72,0x46,0x31,0x51,0x55,0x74,0x65, + 0x67,0x47,0x66,0x67,0x57,0x5A,0x6F,0x2F,0x44,0x50,0x36,0x72,0x33,0x4C,0x6B, + 0x45,0x71,0x49,0x6F,0x43,0x51,0x20,0x2B,0x44,0x64,0x6A,0x48,0x4C,0x34,0x6B, + 0x38,0x66,0x65,0x4E,0x65,0x58,0x7A,0x33,0x55,0x41,0x50,0x50,0x6E,0x64,0x44, + 0x41,0x58,0x70,0x49,0x59,0x47,0x50,0x64,0x34,0x37,0x6B,0x53,0x57,0x37,0x78, + 0x35,0x71,0x69,0x47,0x4F,0x77,0x38,0x44,0x35,0x4D,0x57,0x39,0x6B,0x4D,0x39, + 0x52,0x73,0x4E,0x31,0x48,0x55,0x45,0x55,0x50,0x53,0x6C,0x2F,0x56,0x66,0x67, + 0x66,0x7A,0x4C,0x37,0x20,0x59,0x52,0x68,0x7A,0x4D,0x6A,0x7A,0x70,0x38,0x58, + 0x4B,0x66,0x47,0x59,0x67,0x53,0x79,0x61,0x56,0x67,0x30,0x46,0x63,0x73,0x38, + 0x4C,0x6C,0x2B,0x69,0x56,0x39,0x4B,0x79,0x76,0x46,0x37,0x67,0x44,0x33,0x41, + 0x66,0x77,0x50,0x2B,0x56,0x7A,0x31,0x47,0x41,0x33,0x58,0x62,0x6B,0x6B,0x50, + 0x69,0x7A,0x77,0x4A,0x66,0x77,0x32,0x77,0x67,0x45,0x55,0x6E,0x38,0x66,0x67, + 0x43,0x76,0x20,0x6E,0x6A,0x48,0x39,0x66,0x49,0x6D,0x2F,0x64,0x6A,0x67,0x77, + 0x5A,0x4C,0x36,0x7A,0x56,0x38,0x39,0x6B,0x38,0x4B,0x4F,0x50,0x46,0x48,0x71, + 0x59,0x74,0x76,0x4D,0x31,0x38,0x6A,0x73,0x36,0x31,0x56,0x4D,0x30,0x55,0x4A, + 0x65,0x74,0x4F,0x66,0x51,0x46,0x58,0x59,0x73,0x4A,0x34,0x2B,0x36,0x64,0x76, + 0x66,0x53,0x6C,0x36,0x52,0x76,0x7A,0x32,0x48,0x47,0x6F,0x67,0x5A,0x2F,0x31, + 0x20,0x5A,0x63,0x6E,0x70,0x6D,0x49,0x75,0x61,0x49,0x78,0x66,0x41,0x7A,0x2F, + 0x71,0x79,0x37,0x43,0x69,0x39,0x57,0x33,0x41,0x76,0x70,0x69,0x31,0x64,0x43, + 0x2F,0x56,0x6A,0x41,0x6E,0x56,0x6E,0x41,0x4B,0x45,0x76,0x35,0x73,0x4F,0x59, + 0x38,0x4F,0x33,0x71,0x4B,0x50,0x65,0x5A,0x39,0x4F,0x48,0x46,0x58,0x74,0x4F, + 0x66,0x56,0x44,0x2B,0x2F,0x39,0x68,0x6B,0x59,0x4E,0x39,0x32,0x43,0x20,0x46, + 0x33,0x75,0x7A,0x73,0x32,0x36,0x45,0x59,0x73,0x48,0x56,0x6D,0x44,0x62,0x31, + 0x59,0x61,0x67,0x50,0x45,0x36,0x67,0x72,0x41,0x77,0x68,0x39,0x49,0x51,0x39, + 0x67,0x74,0x70,0x65,0x4F,0x52,0x4F,0x2B,0x6F,0x78,0x34,0x36,0x44,0x44,0x66, + 0x7A,0x69,0x62,0x46,0x31,0x39,0x50,0x41,0x4C,0x34,0x78,0x64,0x6B,0x4D,0x4F, + 0x77,0x34,0x32,0x6C,0x4A,0x71,0x6E,0x73,0x51,0x50,0x54,0x20,0x78,0x6D,0x72, + 0x65,0x42,0x4F,0x70,0x69,0x45,0x4C,0x44,0x6F,0x53,0x33,0x67,0x4D,0x2B,0x46, + 0x54,0x55,0x65,0x37,0x31,0x32,0x4A,0x73,0x50,0x50,0x2B,0x72,0x49,0x36,0x31, + 0x4B,0x36,0x4F,0x4F,0x54,0x66,0x70,0x73,0x66,0x4E,0x77,0x41,0x37,0x2B,0x2B, + 0x4A,0x4D,0x66,0x6D,0x52,0x5A,0x48,0x44,0x67,0x53,0x39,0x6A,0x7A,0x6D,0x56, + 0x38,0x6F,0x4A,0x59,0x48,0x42,0x32,0x76,0x2B,0x20,0x45,0x52,0x63,0x53,0x2F, + 0x79,0x72,0x67,0x58,0x34,0x67,0x6F,0x2F,0x72,0x45,0x63,0x66,0x50,0x39,0x6F, + 0x41,0x79,0x39,0x4C,0x2F,0x4B,0x6B,0x67,0x41,0x46,0x37,0x75,0x79,0x2F,0x4C, + 0x39,0x6F,0x77,0x32,0x6C,0x62,0x4C,0x6A,0x79,0x4B,0x55,0x79,0x62,0x57,0x77, + 0x57,0x31,0x47,0x51,0x33,0x55,0x74,0x41,0x45,0x55,0x4C,0x64,0x2F,0x39,0x4E, + 0x68,0x48,0x58,0x37,0x52,0x64,0x43,0x20,0x2F,0x6D,0x4D,0x6A,0x36,0x75,0x75, + 0x6E,0x6A,0x57,0x4D,0x6A,0x58,0x71,0x6C,0x64,0x67,0x75,0x33,0x41,0x50,0x32, + 0x4C,0x61,0x59,0x4D,0x32,0x5A,0x51,0x4D,0x30,0x61,0x51,0x4F,0x69,0x44,0x76, + 0x67,0x4C,0x34,0x4A,0x38,0x78,0x68,0x6D,0x73,0x37,0x73,0x4F,0x5A,0x31,0x68, + 0x35,0x2B,0x47,0x47,0x57,0x44,0x62,0x54,0x46,0x4C,0x58,0x4A,0x2B,0x53,0x6E, + 0x54,0x4A,0x64,0x68,0x7A,0x20,0x4F,0x72,0x49,0x63,0x62,0x73,0x4B,0x30,0x77, + 0x53,0x75,0x67,0x74,0x6B,0x79,0x67,0x4A,0x67,0x32,0x67,0x53,0x50,0x7A,0x2F, + 0x41,0x6C,0x7A,0x76,0x65,0x6F,0x2B,0x78,0x48,0x4F,0x77,0x36,0x32,0x73,0x41, + 0x72,0x70,0x78,0x58,0x79,0x43,0x39,0x4D,0x6C,0x65,0x4F,0x56,0x30,0x6C,0x6C, + 0x33,0x52,0x75,0x77,0x54,0x58,0x59,0x39,0x70,0x69,0x54,0x5A,0x6C,0x41,0x7A, + 0x52,0x6C,0x41,0x20,0x6B,0x66,0x68,0x2F,0x41,0x47,0x78,0x77,0x76,0x55,0x66, + 0x66,0x6D,0x4D,0x66,0x2F,0x50,0x64,0x6A,0x49,0x63,0x59,0x58,0x38,0x6F,0x6F, + 0x6A,0x6A,0x49,0x36,0x5A,0x74,0x52,0x4D,0x77,0x5A,0x32,0x49,0x42,0x70,0x6B, + 0x7A,0x56,0x6A,0x41,0x6A,0x56,0x6C,0x41,0x45,0x56,0x39,0x2F,0x76,0x38,0x48, + 0x72,0x48,0x57,0x39,0x78,0x38,0x46,0x7A,0x4A,0x75,0x51,0x66,0x6E,0x59,0x71, + 0x78,0x20,0x59,0x71,0x4B,0x75,0x47,0x4A,0x32,0x43,0x6E,0x59,0x63,0x62,0x4F, + 0x48,0x67,0x75,0x6B,0x6A,0x7A,0x57,0x59,0x74,0x72,0x6D,0x47,0x6B,0x69,0x2B, + 0x43,0x64,0x53,0x4D,0x41,0x52,0x53,0x4A,0x2F,0x35,0x2B,0x49,0x6B,0x4F,0x44, + 0x7A,0x32,0x70,0x6B,0x4D,0x7A,0x78,0x35,0x58,0x52,0x70,0x2B,0x59,0x6D,0x31, + 0x77,0x41,0x7A,0x78,0x37,0x50,0x38,0x74,0x71,0x5A,0x53,0x42,0x4B,0x35,0x20, + 0x47,0x74,0x4E,0x47,0x31,0x30,0x43,0x79,0x54,0x61,0x42,0x6D,0x44,0x43,0x44, + 0x50,0x4B,0x75,0x42,0x2F,0x34,0x39,0x6A,0x6E,0x44,0x34,0x44,0x64,0x76,0x56, + 0x6C,0x65,0x37,0x74,0x50,0x68,0x76,0x4D,0x4B,0x4E,0x6C,0x2F,0x75,0x79,0x37, + 0x4F,0x36,0x4E,0x4E,0x45,0x35,0x30,0x50,0x61,0x61,0x74,0x72,0x6F,0x71,0x37, + 0x54,0x6E,0x46,0x53,0x45,0x77,0x59,0x51,0x63,0x74,0x41,0x6E,0x20,0x63,0x52, + 0x7A,0x74,0x39,0x77,0x50,0x34,0x30,0x59,0x6B,0x73,0x62,0x79,0x69,0x72,0x54, + 0x30,0x54,0x6B,0x6A,0x62,0x4D,0x5A,0x6E,0x6A,0x75,0x65,0x6A,0x62,0x4B,0x67, + 0x36,0x42,0x5A,0x4D,0x6D,0x30,0x31,0x73,0x46,0x4A,0x42,0x34,0x56,0x59,0x51, + 0x2B,0x75,0x4D,0x64,0x77,0x6E,0x4F,0x66,0x50,0x42,0x66,0x44,0x44,0x34,0x31, + 0x6E,0x65,0x30,0x51,0x6F,0x2B,0x55,0x53,0x49,0x48,0x20,0x7A,0x32,0x58,0x34, + 0x59,0x62,0x54,0x75,0x34,0x33,0x5A,0x4D,0x32,0x30,0x32,0x6B,0x43,0x53,0x52, + 0x61,0x47,0x61,0x45,0x50,0x37,0x44,0x34,0x63,0x4D,0x2F,0x78,0x79,0x41,0x66, + 0x7A,0x67,0x61,0x41,0x4E,0x48,0x68,0x68,0x50,0x39,0x54,0x78,0x51,0x31,0x78, + 0x4A,0x48,0x68,0x44,0x44,0x38,0x34,0x32,0x68,0x44,0x46,0x42,0x44,0x35,0x46, + 0x66,0x68,0x4F,0x61,0x70,0x4A,0x6C,0x41,0x20,0x59,0x74,0x56,0x52,0x74,0x4B, + 0x72,0x76,0x53,0x5A,0x66,0x33,0x35,0x67,0x4C,0x34,0x33,0x70,0x45,0x47,0x54, + 0x70,0x7A,0x58,0x4E,0x4A,0x2B,0x49,0x6C,0x78,0x50,0x6E,0x50,0x62,0x35,0x33, + 0x4A,0x4A,0x49,0x4A,0x50,0x45,0x6B,0x43,0x56,0x78,0x45,0x6D,0x30,0x67,0x42, + 0x43,0x48,0x39,0x41,0x57,0x48,0x46,0x66,0x31,0x2B,0x51,0x45,0x38,0x63,0x36, + 0x7A,0x6B,0x31,0x56,0x35,0x43,0x20,0x7A,0x49,0x72,0x5A,0x6C,0x62,0x67,0x68, + 0x79,0x70,0x6A,0x41,0x44,0x6B,0x79,0x62,0x54,0x6F,0x77,0x4A,0x4A,0x4E,0x49, + 0x41,0x38,0x71,0x7A,0x42,0x54,0x4B,0x56,0x59,0x34,0x2B,0x66,0x37,0x2F,0x45, + 0x72,0x77,0x45,0x65,0x58,0x6D,0x2B,0x49,0x6A,0x48,0x44,0x36,0x4D,0x4E,0x44, + 0x4C,0x34,0x37,0x50,0x5A,0x67,0x45,0x45,0x6D,0x63,0x41,0x52,0x53,0x50,0x2B, + 0x31,0x6F,0x6B,0x2B,0x20,0x41,0x66,0x44,0x6A,0x58,0x32,0x58,0x56,0x35,0x78, + 0x63,0x56,0x34,0x38,0x68,0x77,0x68,0x68,0x2F,0x2F,0x79,0x6E,0x6D,0x4B,0x63, + 0x43,0x30,0x4A,0x6D,0x68,0x6C,0x49,0x6C,0x46,0x70,0x43,0x48,0x38,0x68,0x6E, + 0x4D,0x61,0x65,0x31,0x57,0x4C,0x50,0x37,0x70,0x45,0x62,0x37,0x52,0x65,0x56, + 0x35,0x5A,0x79,0x6A,0x44,0x37,0x70,0x50,0x4F,0x2B,0x53,0x56,0x33,0x59,0x74, + 0x70,0x34,0x20,0x31,0x55,0x6D,0x4D,0x59,0x6B,0x4C,0x69,0x76,0x77,0x33,0x48, + 0x38,0x2F,0x6C,0x65,0x4F,0x35,0x50,0x68,0x7A,0x59,0x48,0x45,0x2F,0x46,0x4E, + 0x45,0x79,0x6E,0x68,0x7A,0x49,0x42,0x4D,0x6C,0x59,0x2F,0x41,0x52,0x59,0x6A, + 0x69,0x55,0x70,0x6C,0x53,0x53,0x70,0x70,0x6F,0x31,0x6D,0x48,0x58,0x39,0x31, + 0x68,0x77,0x5A,0x4E,0x6A,0x76,0x34,0x43,0x46,0x46,0x4E,0x58,0x75,0x36,0x4C, + 0x20,0x31,0x50,0x33,0x38,0x4E,0x6C,0x55,0x65,0x44,0x30,0x69,0x45,0x41,0x52, + 0x54,0x31,0x2B,0x35,0x66,0x62,0x76,0x71,0x39,0x76,0x7A,0x4F,0x50,0x5A,0x34, + 0x31,0x72,0x4F,0x4B,0x35,0x4C,0x42,0x73,0x38,0x65,0x64,0x54,0x79,0x39,0x65, + 0x6A,0x75,0x4D,0x55,0x64,0x39,0x78,0x55,0x33,0x51,0x43,0x69,0x39,0x76,0x74, + 0x48,0x70,0x38,0x78,0x30,0x6E,0x78,0x62,0x32,0x69,0x4B,0x53,0x51,0x20,0x79, + 0x30,0x39,0x42,0x4F,0x36,0x34,0x30,0x72,0x65,0x70,0x34,0x51,0x4E,0x55,0x4E, + 0x49,0x4D,0x38,0x31,0x4F,0x50,0x54,0x37,0x7A,0x58,0x53,0x66,0x6C,0x76,0x53, + 0x4B,0x35,0x44,0x45,0x36,0x5A,0x64,0x71,0x6D,0x34,0x2F,0x54,0x67,0x49,0x78, + 0x67,0x4E,0x56,0x4A,0x79,0x6B,0x47,0x4D,0x44,0x6A,0x4C,0x6F,0x56,0x66,0x4F, + 0x71,0x58,0x6A,0x74,0x30,0x56,0x79,0x36,0x52,0x33,0x31,0x20,0x2B,0x4F,0x6B, + 0x70,0x35,0x33,0x45,0x70,0x4A,0x77,0x33,0x45,0x52,0x52,0x49,0x4D,0x34,0x41, + 0x76,0x41,0x72,0x62,0x61,0x46,0x33,0x78,0x37,0x4D,0x61,0x4C,0x39,0x2B,0x6B, + 0x58,0x6A,0x65,0x4F,0x4A,0x74,0x78,0x50,0x62,0x4C,0x38,0x56,0x6F,0x77,0x57, + 0x4B,0x6B,0x71,0x31,0x6C,0x58,0x51,0x6A,0x38,0x47,0x65,0x32,0x68,0x51,0x63, + 0x6E,0x50,0x48,0x62,0x33,0x61,0x73,0x52,0x66,0x20,0x31,0x41,0x61,0x37,0x65, + 0x37,0x4D,0x4D,0x54,0x6A,0x68,0x46,0x71,0x6E,0x2B,0x47,0x30,0x55,0x54,0x46, + 0x71,0x4C,0x59,0x42,0x50,0x47,0x78,0x62,0x73,0x4C,0x43,0x75,0x76,0x34,0x52, + 0x6A,0x6E,0x59,0x53,0x6F,0x4B,0x4A,0x4F,0x2B,0x61,0x62,0x4F,0x4F,0x34,0x77, + 0x48,0x57,0x6D,0x6F,0x69,0x44,0x61,0x68,0x71,0x41,0x30,0x36,0x6A,0x2F,0x4B, + 0x36,0x65,0x7A,0x6E,0x43,0x37,0x39,0x20,0x7A,0x48,0x63,0x68,0x4B,0x73,0x72, + 0x70,0x4D,0x59,0x39,0x58,0x54,0x6A,0x74,0x46,0x72,0x52,0x57,0x64,0x46,0x61, + 0x69,0x57,0x41,0x61,0x7A,0x43,0x59,0x64,0x54,0x2F,0x78,0x48,0x6D,0x50,0x6E, + 0x30,0x66,0x62,0x6D,0x30,0x32,0x49,0x71,0x76,0x50,0x7A,0x4D,0x78,0x6E,0x58, + 0x70,0x65,0x6D,0x50,0x55,0x4B,0x47,0x74,0x78,0x4B,0x71,0x6C,0x71,0x67,0x64, + 0x74,0x43,0x30,0x37,0x36,0x20,0x38,0x4C,0x7A,0x37,0x67,0x67,0x73,0x68,0x45, + 0x6B,0x4F,0x41,0x61,0x63,0x4F,0x4F,0x33,0x56,0x64,0x72,0x6A,0x5A,0x52,0x43, + 0x4E,0x51,0x7A,0x67,0x67,0x38,0x41,0x66,0x32,0x68,0x5A,0x2B,0x75,0x53,0x2F, + 0x4C,0x38,0x4B,0x52,0x43,0x66,0x31,0x48,0x62,0x44,0x45,0x39,0x36,0x72,0x70, + 0x76,0x53,0x2F,0x69,0x46,0x47,0x4B,0x32,0x57,0x6C,0x47,0x67,0x5A,0x77,0x76, + 0x32,0x33,0x42,0x20,0x55,0x36,0x4D,0x65,0x62,0x32,0x72,0x4B,0x54,0x39,0x51, + 0x4A,0x62,0x35,0x37,0x4E,0x63,0x4D,0x6F,0x74,0x66,0x38,0x56,0x61,0x4B,0x31, + 0x47,0x70,0x74,0x4C,0x72,0x2B,0x46,0x4D,0x75,0x4E,0x50,0x66,0x30,0x41,0x6E, + 0x6A,0x2B,0x70,0x30,0x46,0x2F,0x55,0x44,0x77,0x47,0x6D,0x54,0x54,0x76,0x4D, + 0x43,0x6D,0x77,0x48,0x2F,0x72,0x68,0x73,0x46,0x61,0x4C,0x79,0x42,0x6D,0x44, + 0x74,0x20,0x61,0x48,0x76,0x37,0x4D,0x77,0x79,0x4D,0x4B,0x2F,0x51,0x58,0x39, + 0x63,0x58,0x41,0x75,0x4D,0x66,0x65,0x66,0x69,0x66,0x5A,0x6C,0x54,0x55,0x4B, + 0x71,0x4B,0x51,0x42,0x2F,0x44,0x6E,0x51,0x59,0x31,0x50,0x77,0x2F,0x4A,0x54, + 0x48,0x61,0x32,0x65,0x55,0x38,0x43,0x50,0x71,0x6B,0x39,0x66,0x4F,0x5A,0x46, + 0x31,0x4F,0x6F,0x31,0x36,0x48,0x30,0x55,0x35,0x5A,0x71,0x4A,0x51,0x42,0x20, + 0x64,0x41,0x47,0x66,0x74,0x79,0x33,0x38,0x30,0x71,0x6D,0x4D,0x45,0x6E,0x35, + 0x45,0x33,0x54,0x4C,0x70,0x6D,0x7A,0x62,0x75,0x77,0x4F,0x63,0x78,0x47,0x6F, + 0x71,0x64,0x53,0x68,0x6E,0x41,0x41,0x37,0x59,0x46,0x65,0x30,0x63,0x39,0x44, + 0x6D,0x68,0x72,0x4C,0x31,0x48,0x6E,0x48,0x42,0x6A,0x4B,0x75,0x43,0x35,0x6F, + 0x73,0x39,0x61,0x51,0x43,0x35,0x56,0x51,0x57,0x68,0x63,0x4F,0x20,0x36,0x59, + 0x33,0x4B,0x39,0x52,0x64,0x70,0x34,0x55,0x57,0x33,0x74,0x76,0x34,0x77,0x5A, + 0x59,0x67,0x43,0x4B,0x6D,0x45,0x41,0x39,0x39,0x6B,0x57,0x66,0x47,0x63,0x6F, + 0x77,0x78,0x6D,0x6C,0x2B,0x34,0x71,0x55,0x63,0x48,0x72,0x4D,0x63,0x7A,0x32, + 0x43,0x33,0x46,0x70,0x4C,0x74,0x6C,0x54,0x43,0x41,0x4B,0x78,0x47,0x4D,0x51, + 0x4E,0x67,0x6A,0x39,0x4A,0x39,0x52,0x63,0x70,0x34,0x20,0x35,0x58,0x54,0x47, + 0x5A,0x61,0x6F,0x37,0x39,0x68,0x6D,0x42,0x63,0x69,0x76,0x75,0x58,0x6D,0x43, + 0x6C,0x54,0x63,0x45,0x44,0x67,0x35,0x72,0x32,0x45,0x2B,0x6C,0x6A,0x59,0x4E, + 0x7A,0x6A,0x67,0x50,0x32,0x2B,0x41,0x53,0x73,0x78,0x6D,0x6F,0x71,0x4E,0x63, + 0x68,0x75,0x41,0x6E,0x76,0x35,0x43,0x7A,0x4D,0x47,0x65,0x4D,0x39,0x57,0x4C, + 0x41,0x73,0x71,0x70,0x75,0x67,0x38,0x43,0x20,0x31,0x39,0x6F,0x55,0x66,0x48, + 0x73,0x67,0x77,0x35,0x44,0x62,0x78,0x67,0x6C,0x43,0x31,0x41,0x31,0x44,0x45, + 0x78,0x35,0x76,0x32,0x35,0x39,0x72,0x63,0x53,0x30,0x78,0x72,0x68,0x45,0x6F, + 0x70,0x77,0x48,0x59,0x5A,0x2F,0x30,0x70,0x33,0x31,0x2B,0x6B,0x48,0x45,0x63, + 0x4E,0x78,0x42,0x59,0x46,0x6C,0x45,0x74,0x35,0x50,0x56,0x6A,0x6D,0x2F,0x42, + 0x38,0x5A,0x56,0x74,0x39,0x66,0x20,0x69,0x49,0x46,0x78,0x7A,0x2B,0x56,0x67, + 0x6B,0x65,0x31,0x59,0x5A,0x74,0x58,0x4F,0x52,0x62,0x6B,0x4D,0x34,0x44,0x2F, + 0x62,0x46,0x6E,0x54,0x4D,0x69,0x78,0x61,0x69,0x62,0x6E,0x48,0x55,0x67,0x72, + 0x58,0x47,0x4C,0x6B,0x57,0x35,0x31,0x48,0x65,0x50,0x54,0x61,0x48,0x54,0x59, + 0x78,0x34,0x6E,0x33,0x58,0x5A,0x4B,0x45,0x61,0x4A,0x75,0x4F,0x58,0x6E,0x65, + 0x63,0x7A,0x6C,0x5A,0x20,0x36,0x42,0x36,0x41,0x4A,0x31,0x34,0x5A,0x4C,0x2B, + 0x6C,0x76,0x6C,0x73,0x4D,0x41,0x37,0x67,0x42,0x57,0x32,0x78,0x52,0x38,0x58, + 0x55,0x39,0x2F,0x49,0x61,0x62,0x78,0x43,0x33,0x74,0x4E,0x72,0x4D,0x62,0x78, + 0x42,0x4F,0x32,0x5A,0x4B,0x49,0x63,0x43,0x72,0x5A,0x37,0x2B,0x34,0x7A,0x6B, + 0x34,0x35,0x4A,0x59,0x46,0x4A,0x55,0x54,0x64,0x63,0x2B,0x68,0x63,0x68,0x76, + 0x47,0x63,0x20,0x64,0x66,0x47,0x50,0x51,0x32,0x6C,0x52,0x51,0x4E,0x77,0x4B, + 0x37,0x41,0x49,0x2B,0x61,0x6C,0x50,0x77,0x6C,0x30,0x4D,0x5A,0x6E,0x65,0x73, + 0x6E,0x52,0x42,0x47,0x35,0x77,0x47,0x6A,0x44,0x6B,0x6F,0x39,0x53,0x34,0x76, + 0x71,0x41,0x75,0x41,0x33,0x67,0x44,0x74,0x75,0x43,0x2B,0x2B,0x7A,0x6E,0x50, + 0x59,0x56,0x49,0x46,0x59,0x37,0x61,0x73,0x4E,0x62,0x63,0x54,0x4D,0x53,0x74, + 0x20,0x77,0x72,0x74,0x74,0x43,0x76,0x57,0x4E,0x65,0x5A,0x7A,0x56,0x31,0x4A, + 0x38,0x51,0x4D,0x33,0x4A,0x32,0x33,0x48,0x50,0x5A,0x4F,0x2F,0x42,0x75,0x69, + 0x4E,0x34,0x4E,0x69,0x4E,0x4D,0x41,0x6C,0x6D,0x42,0x70,0x41,0x50,0x76,0x31, + 0x39,0x42,0x66,0x69,0x6B,0x6A,0x69,0x63,0x4B,0x33,0x67,0x33,0x52,0x6E,0x75, + 0x52,0x69,0x46,0x4F,0x4A,0x56,0x71,0x46,0x49,0x41,0x4B,0x35,0x4C,0x20,0x49, + 0x49,0x56,0x49,0x48,0x51,0x66,0x50,0x4F,0x61,0x30,0x50,0x69,0x4E,0x77,0x4E, + 0x71,0x4C,0x67,0x42,0x48,0x42,0x2F,0x78,0x58,0x45,0x59,0x35,0x68,0x55,0x67, + 0x6C,0x34,0x7A,0x6D,0x6A,0x46,0x55,0x73,0x53,0x59,0x51,0x43,0x33,0x32,0x78, + 0x54,0x53,0x30,0x31,0x38,0x49,0x4F,0x78,0x79,0x30,0x63,0x6A,0x74,0x45,0x47, + 0x77,0x65,0x49,0x53,0x34,0x32,0x62,0x73,0x45,0x6A,0x2B,0x20,0x38,0x51,0x4D, + 0x34,0x4C,0x41,0x4D,0x51,0x77,0x6F,0x72,0x44,0x35,0x7A,0x4B,0x32,0x5A,0x77, + 0x69,0x73,0x78,0x6D,0x6A,0x51,0x6D,0x62,0x6A,0x55,0x61,0x4C,0x58,0x77,0x52, + 0x2B,0x47,0x2F,0x45,0x50,0x59,0x34,0x64,0x67,0x4F,0x73,0x4E,0x46,0x68,0x4D, + 0x53,0x51,0x59,0x51,0x43,0x6A,0x6D,0x73,0x55,0x68,0x4B,0x50,0x6A,0x2B,0x6A, + 0x70,0x4C,0x34,0x51,0x4C,0x44,0x70,0x71,0x35,0x20,0x45,0x39,0x79,0x37,0x41, + 0x58,0x45,0x6F,0x73,0x67,0x76,0x59,0x5A,0x6C,0x50,0x51,0x38,0x59,0x68,0x6B, + 0x49,0x56,0x4B,0x50,0x67,0x32,0x61,0x32,0x45,0x53,0x45,0x72,0x4D,0x41,0x34, + 0x44,0x75,0x4E,0x6D,0x6D,0x30,0x50,0x43,0x6B,0x6B,0x6E,0x2B,0x45,0x63,0x4F, + 0x58,0x73,0x75,0x4F,0x64,0x79,0x4F,0x72,0x61,0x56,0x46,0x73,0x4E,0x55,0x7A, + 0x41,0x43,0x4F,0x32,0x76,0x64,0x6C,0x20,0x68,0x42,0x41,0x68,0x48,0x4C,0x52, + 0x54,0x4F,0x51,0x4D,0x49,0x39,0x54,0x56,0x75,0x73,0x53,0x6C,0x2F,0x62,0x46, + 0x67,0x47,0x49,0x45,0x51,0x55,0x48,0x4C,0x52,0x7A,0x43,0x37,0x69,0x4E,0x41, + 0x35,0x51,0x61,0x41,0x54,0x51,0x41,0x4E,0x38,0x35,0x56,0x4B,0x41,0x42,0x36, + 0x52,0x7A,0x55,0x41,0x4B,0x45,0x51,0x55,0x65,0x6B,0x65,0x74,0x73,0x77,0x4A, + 0x76,0x78,0x47,0x6A,0x53,0x20,0x6D,0x6C,0x4A,0x56,0x65,0x5A,0x56,0x4E,0x6F, + 0x59,0x46,0x78,0x54,0x66,0x38,0x4A,0x45,0x5A,0x58,0x78,0x48,0x43,0x37,0x37, + 0x5A,0x6C,0x70,0x70,0x73,0x6B,0x43,0x70,0x42,0x72,0x44,0x56,0x70,0x70,0x44, + 0x6A,0x49,0x59,0x68,0x43,0x69,0x43,0x49,0x63,0x4E,0x47,0x53,0x6C,0x79,0x51, + 0x49,0x56,0x4D,0x51,0x43,0x48,0x70,0x59,0x31,0x43,0x69,0x42,0x6C,0x77,0x30, + 0x46,0x44,0x35,0x20,0x44,0x53,0x41,0x30,0x79,0x48,0x43,0x44,0x54,0x58,0x6D, + 0x48,0x6A,0x51,0x36,0x46,0x45,0x44,0x50,0x67,0x6F,0x4B,0x45,0x62,0x77,0x48, + 0x34,0x67,0x73,0x4A,0x51,0x49,0x6F,0x42,0x6E,0x59,0x4F,0x46,0x63,0x68,0x50, + 0x34,0x42,0x42,0x7A,0x66,0x38,0x4C,0x55,0x52,0x4B,0x44,0x34,0x35,0x37,0x74, + 0x75,0x6F,0x43,0x4E,0x47,0x47,0x31,0x61,0x55,0x59,0x6F,0x42,0x57,0x41,0x30, + 0x32,0x20,0x6E,0x42,0x33,0x33,0x58,0x4E,0x59,0x31,0x43,0x79,0x46,0x6D,0x49, + 0x41,0x43,0x58,0x52,0x44,0x72,0x72,0x67,0x63,0x42,0x53,0x44,0x4D,0x44,0x71, + 0x33,0x4C,0x39,0x2B,0x50,0x66,0x32,0x46,0x69,0x41,0x55,0x48,0x4C,0x56,0x6C, + 0x70,0x45,0x30,0x6F,0x7A,0x41,0x4B,0x76,0x6C,0x68,0x7A,0x49,0x41,0x49,0x65, + 0x4C,0x42,0x51,0x55,0x76,0x57,0x53,0x34,0x50,0x4C,0x33,0x67,0x58,0x51,0x20, + 0x75,0x58,0x39,0x43,0x78,0x45,0x4D,0x35,0x63,0x67,0x47,0x63,0x44,0x53,0x41, + 0x30,0x75,0x72,0x6A,0x65,0x70,0x76,0x7A,0x67,0x68,0x4F,0x74,0x66,0x45,0x45, + 0x4C,0x4D,0x68,0x49,0x4F,0x57,0x31,0x6F,0x50,0x64,0x54,0x45,0x44,0x55,0x43, + 0x4B,0x41,0x42,0x57,0x44,0x4E,0x58,0x6F,0x51,0x41,0x59,0x6D,0x56,0x49,0x45, + 0x49,0x45,0x51,0x63,0x6A,0x45,0x78,0x5A,0x44,0x36,0x69,0x76,0x20,0x77,0x54, + 0x49,0x6C,0x4F,0x4B,0x6F,0x42,0x72,0x4C,0x51,0x70,0x4E,0x44,0x4A,0x70,0x50, + 0x58,0x55,0x68,0x68,0x4A,0x67,0x44,0x50,0x7A,0x43,0x61,0x73,0x73,0x52,0x4B, + 0x6F,0x31,0x45,0x4E,0x77,0x4F,0x70,0x73,0x38,0x75,0x48,0x4A,0x69,0x48,0x63, + 0x58,0x51,0x73,0x79,0x49,0x67,0x36,0x61,0x73,0x4E,0x46,0x70,0x57,0x41,0x7A, + 0x68,0x6E,0x37,0x31,0x5A,0x43,0x43,0x41,0x73,0x63,0x20,0x4E,0x46,0x56,0x57, + 0x41,0x37,0x41,0x36,0x2F,0x6C,0x73,0x52,0x67,0x42,0x44,0x78,0x34,0x71,0x41, + 0x70,0x4B,0x34,0x31,0x47,0x4E,0x51,0x43,0x72,0x76,0x63,0x66,0x47,0x63,0x34, + 0x6F,0x41,0x68,0x49,0x67,0x54,0x42,0x30,0x31,0x5A,0x61,0x62,0x53,0x73,0x67, + 0x34,0x44,0x6E,0x70,0x79,0x4C,0x65,0x58,0x51,0x67,0x78,0x49,0x77,0x36,0x61, + 0x4B,0x75,0x73,0x67,0x59,0x49,0x64,0x4E,0x20,0x6F,0x51,0x6C,0x66,0x45,0x59, + 0x41,0x51,0x63,0x65,0x4B,0x67,0x4B,0x53,0x75,0x4E,0x6C,0x72,0x6B,0x4C,0x45, + 0x50,0x48,0x75,0x51,0x6F,0x67,0x5A,0x63,0x64,0x42,0x55,0x57,0x62,0x73,0x41, + 0x6C,0x68,0x46,0x41,0x78,0x4C,0x73,0x4C,0x49,0x57,0x62,0x45,0x51,0x56,0x4E, + 0x6C,0x6A,0x51,0x42,0x61,0x62,0x51,0x70,0x4E,0x79,0x51,0x43,0x45,0x69,0x42, + 0x55,0x48,0x54,0x56,0x6C,0x70,0x20,0x4E,0x4B,0x6F,0x42,0x74,0x4E,0x6B,0x55, + 0x6D,0x74,0x49,0x59,0x67,0x42,0x43,0x78,0x34,0x71,0x41,0x70,0x4B,0x34,0x30, + 0x36,0x47,0x55,0x42,0x6F,0x63,0x55,0x47,0x54,0x54,0x66,0x6D,0x63,0x30,0x6F, + 0x43,0x46,0x69,0x42,0x55,0x48,0x53,0x57,0x56,0x68,0x37,0x67,0x56,0x42,0x55, + 0x53,0x49,0x41,0x44,0x32,0x69,0x78,0x4B,0x53,0x67,0x44,0x45,0x43,0x4A,0x65, + 0x4A,0x75,0x32,0x37,0x20,0x41,0x50,0x4D,0x78,0x57,0x72,0x30,0x6B,0x4F,0x71, + 0x31,0x44,0x69,0x42,0x51,0x6A,0x41,0x78,0x41,0x69,0x78,0x63,0x67,0x41,0x68, + 0x4B,0x67,0x68,0x47,0x75,0x30,0x56,0x4F,0x34,0x4C,0x46,0x6B,0x45,0x45,0x55, + 0x41,0x77,0x69,0x41,0x4D,0x5A,0x75,0x43,0x57,0x55,0x30,0x43,0x43,0x42,0x45, + 0x72,0x44,0x70,0x4C,0x4B,0x41,0x64,0x79,0x2F,0x35,0x64,0x49,0x37,0x68,0x44, + 0x73,0x5A,0x20,0x51,0x4F,0x68,0x6D,0x56,0x70,0x73,0x54,0x79,0x51,0x43,0x45, + 0x69,0x4A,0x65,0x4D,0x76,0x61,0x61,0x73,0x4E,0x42,0x71,0x31,0x43,0x7A,0x42, + 0x73,0x55,0x36,0x67,0x68,0x6F,0x32,0x6B,0x41,0x49,0x65,0x4C,0x45,0x51,0x56, + 0x4F,0x6A,0x4E,0x6F,0x57,0x69,0x47,0x6F,0x44,0x56,0x7A,0x52,0x73,0x30,0x77, + 0x69,0x42,0x45,0x72,0x43,0x51,0x6C,0x41,0x68,0x69,0x30,0x4B,0x64,0x51,0x6B, + 0x20,0x41,0x78,0x41,0x69,0x56,0x68,0x77,0x30,0x5A,0x61,0x58,0x52,0x71,0x42, + 0x4C,0x74,0x74,0x79,0x6E,0x55,0x6E,0x49,0x31,0x34,0x64,0x79,0x48,0x45,0x6A, + 0x44,0x68,0x6F,0x79,0x6B,0x71,0x6A,0x5A,0x59,0x34,0x41,0x4E,0x41,0x59,0x67, + 0x52,0x4A,0x77,0x34,0x61,0x4B,0x71,0x73,0x45,0x63,0x42,0x78,0x6D,0x30,0x4C, + 0x7A,0x72,0x48,0x59,0x6D,0x46,0x30,0x4C,0x59,0x30,0x6D,0x71,0x76,0x20,0x71, + 0x5A,0x4D,0x32,0x68,0x63,0x72,0x63,0x42,0x56,0x41,0x45,0x49,0x45,0x53,0x63, + 0x74,0x4E,0x68,0x72,0x71,0x73,0x2B,0x6D,0x55,0x46,0x51,0x44,0x4F,0x47,0x4A, + 0x54,0x71,0x4B,0x30,0x78,0x34,0x74,0x32,0x46,0x45,0x44,0x50,0x69,0x6F,0x43, + 0x6B,0x72,0x6A,0x55,0x59,0x31,0x67,0x49,0x4D,0x32,0x68,0x64,0x6F,0x62,0x46, + 0x51,0x45,0x49,0x45,0x53,0x63,0x4F,0x6D,0x72,0x4C,0x53,0x20,0x61,0x46,0x6B, + 0x6A,0x67,0x50,0x6D,0x4B,0x41,0x49,0x53,0x49,0x46,0x51,0x64,0x4E,0x6C,0x54, + 0x55,0x43,0x73,0x4F,0x77,0x43,0x42,0x43,0x36,0x35,0x79,0x30,0x4B,0x49,0x53, + 0x35,0x44,0x78,0x6A,0x4B,0x59,0x73,0x4B,0x61,0x73,0x42,0x54,0x41,0x47,0x48, + 0x35,0x69,0x72,0x6B,0x34,0x56,0x52,0x68,0x49,0x63,0x51,0x6C,0x6D,0x4E,0x39, + 0x67,0x2F,0x55,0x41,0x39,0x68,0x4E,0x48,0x6F,0x20,0x6E,0x44,0x67,0x62,0x51, + 0x47,0x68,0x42,0x30,0x44,0x36,0x62,0x38,0x68,0x31,0x57,0x6D,0x34,0x63,0x4A, + 0x49,0x65,0x62,0x43,0x51,0x55,0x76,0x37,0x59,0x4F,0x36,0x56,0x67,0x46,0x44, + 0x61,0x66,0x67,0x42,0x76,0x32,0x42,0x54,0x71,0x62,0x46,0x59,0x45,0x49,0x45, + 0x51,0x63,0x4F,0x47,0x6A,0x4A,0x53,0x70,0x74,0x51,0x6D,0x67,0x48,0x73,0x74, + 0x53,0x6E,0x55,0x4A,0x51,0x4D,0x51,0x20,0x49,0x68,0x59,0x63,0x74,0x47,0x53, + 0x6C,0x54,0x61,0x69,0x41,0x41,0x53,0x79,0x55,0x41,0x51,0x67,0x52,0x43,0x77, + 0x35,0x61,0x71,0x6F,0x67,0x42,0x57,0x49,0x55,0x5A,0x43,0x35,0x73,0x31,0x45, + 0x79,0x42,0x45,0x71,0x58,0x67,0x6B,0x4C,0x77,0x49,0x34,0x44,0x37,0x77,0x35, + 0x56,0x36,0x47,0x73,0x42,0x78,0x32,0x4B,0x41,0x6F,0x51,0x6F,0x69,0x59,0x37, + 0x6D,0x77,0x48,0x59,0x76,0x20,0x67,0x44,0x65,0x42,0x53,0x78,0x38,0x47,0x45, + 0x43,0x4B,0x53,0x41,0x59,0x52,0x47,0x46,0x31,0x2B,0x79,0x4B,0x62,0x2B,0x6B, + 0x52,0x51,0x59,0x67,0x52,0x43,0x6B,0x34,0x61,0x4F,0x67,0x6C,0x73,0x4A,0x73, + 0x42,0x67,0x4E,0x4A,0x33,0x42,0x64,0x35,0x74,0x55,0x32,0x68,0x70,0x71,0x77, + 0x78,0x41,0x69,0x46,0x4A,0x77,0x30,0x4A,0x43,0x56,0x4A,0x67,0x74,0x55,0x78, + 0x41,0x43,0x36,0x20,0x5A,0x51,0x42,0x43,0x6C,0x49,0x53,0x44,0x68,0x69,0x70, + 0x71,0x41,0x4E,0x61,0x35,0x41,0x4E,0x6F,0x64,0x53,0x49,0x68,0x6F,0x4E,0x47, + 0x66,0x4C,0x6B,0x77,0x4D,0x41,0x70,0x52,0x76,0x41,0x46,0x50,0x44,0x69,0x58, + 0x49,0x55,0x38,0x6F,0x4C,0x74,0x56,0x5A,0x34,0x55,0x4C,0x45,0x59,0x58,0x75, + 0x56,0x74,0x39,0x32,0x4A,0x75,0x31,0x46,0x4C,0x46,0x4F,0x41,0x43,0x30,0x51, + 0x32,0x20,0x67,0x4E,0x41,0x67,0x77,0x2F,0x4D,0x32,0x35,0x53,0x39,0x72,0x55, + 0x7A,0x64,0x41,0x69,0x43,0x67,0x34,0x61,0x4F,0x64,0x35,0x73,0x42,0x38,0x41, + 0x68,0x48,0x69,0x4F,0x42,0x6E,0x76,0x42,0x70,0x74,0x43,0x71,0x2B,0x54,0x49, + 0x41,0x49,0x61,0x4C,0x67,0x6F,0x42,0x30,0x72,0x4C,0x59,0x61,0x70,0x6D,0x41, + 0x47,0x30,0x4E,0x51,0x62,0x4B,0x43,0x68,0x54,0x43,0x6B,0x59,0x58,0x4E,0x20, + 0x67,0x63,0x75,0x4B,0x32,0x71,0x6F,0x59,0x51,0x44,0x2F,0x77,0x59,0x35,0x75, + 0x43,0x79,0x7A,0x51,0x62,0x49,0x49,0x51,0x54,0x44,0x70,0x72,0x35,0x4D,0x5A, + 0x5A,0x37,0x64,0x59,0x59,0x70,0x79,0x51,0x42,0x43,0x66,0x59,0x31,0x64,0x4E, + 0x75,0x56,0x58,0x74,0x57,0x6B,0x67,0x55,0x41,0x67,0x58,0x48,0x44,0x53,0x7A, + 0x43,0x39,0x7A,0x36,0x2F,0x78,0x44,0x66,0x38,0x65,0x41,0x37,0x20,0x62,0x51, + 0x71,0x74,0x6E,0x4B,0x2F,0x70,0x51,0x43,0x46,0x73,0x61,0x63,0x34,0x61,0x7A, + 0x56,0x68,0x69,0x70,0x63,0x46,0x69,0x34,0x6A,0x4B,0x41,0x76,0x56,0x68,0x73, + 0x51,0x5A,0x54,0x78,0x59,0x4C,0x57,0x69,0x41,0x43,0x47,0x73,0x57,0x4E,0x33, + 0x6D,0x32,0x2B,0x62,0x2F,0x48,0x38,0x46,0x68,0x41,0x56,0x43,0x59,0x4F,0x45, + 0x2F,0x76,0x73,0x78,0x71,0x41,0x36,0x47,0x6D,0x58,0x20,0x41,0x51,0x68,0x68, + 0x67,0x34,0x4E,0x57,0x58,0x67,0x44,0x33,0x38,0x42,0x2F,0x69,0x4E,0x51,0x43, + 0x72,0x45,0x4F,0x53,0x79,0x4E,0x6E,0x55,0x44,0x68,0x4A,0x69,0x4C,0x35,0x71, + 0x7A,0x54,0x2F,0x48,0x2B,0x6B,0x38,0x42,0x2F,0x69,0x4E,0x59,0x42,0x6E,0x62, + 0x41,0x70,0x35,0x4B,0x41,0x6F,0x51,0x59,0x69,0x35,0x36,0x32,0x71,0x32,0x7A, + 0x2F,0x38,0x42,0x53,0x65,0x7A,0x4D,0x52,0x20,0x70,0x77,0x48,0x30,0x41,0x54, + 0x74,0x73,0x43,0x71,0x37,0x72,0x6B,0x41,0x45,0x49,0x63,0x53,0x6B,0x63,0x4E, + 0x4C,0x49,0x44,0x79,0x32,0x50,0x41,0x5A,0x69,0x4A,0x4F,0x41,0x77,0x42,0x34, + 0x79,0x71,0x5A,0x51,0x64,0x32,0x74,0x41,0x52,0x35,0x4E,0x79,0x41,0x6F,0x53, + 0x59,0x69,0x59,0x36,0x6D,0x77,0x47,0x58,0x31,0x33,0x31,0x4D,0x51,0x72,0x66, + 0x38,0x50,0x38,0x52,0x75,0x41,0x20,0x56,0x54,0x34,0x41,0x77,0x4D,0x61,0x46, + 0x69,0x67,0x4B,0x45,0x6D,0x49,0x6B,0x4E,0x6E,0x55,0x37,0x61,0x73,0x4E,0x62, + 0x63,0x54,0x4D,0x52,0x74,0x41,0x50,0x33,0x41,0x64,0x32,0x77,0x4B,0x72,0x6C, + 0x76,0x67,0x6B,0x39,0x56,0x6D,0x67,0x55,0x4A,0x4D,0x49,0x2B,0x76,0x42,0x6C, + 0x66,0x62,0x68,0x2F,0x33,0x65,0x49,0x6B,0x50,0x30,0x58,0x4A,0x6D,0x34,0x44, + 0x41,0x50,0x69,0x57,0x20,0x54,0x61,0x48,0x6D,0x4C,0x4B,0x7A,0x52,0x59,0x4B, + 0x41,0x51,0x30,0x31,0x6A,0x54,0x37,0x72,0x76,0x4D,0x6B,0x6E,0x30,0x4C,0x6F, + 0x6F,0x66,0x2F,0x55,0x42,0x34,0x44,0x32,0x41,0x6D,0x63,0x74,0x43,0x6C,0x34, + 0x64,0x5A,0x63,0x4D,0x51,0x49,0x67,0x77,0x56,0x39,0x6C,0x33,0x6A,0x55,0x39, + 0x53,0x77,0x76,0x52,0x66,0x67,0x58,0x49,0x59,0x41,0x4D,0x43,0x54,0x4E,0x6F, + 0x57,0x57,0x20,0x74,0x41,0x51,0x73,0x6D,0x36,0x66,0x42,0x51,0x43,0x45,0x41, + 0x6C,0x73,0x30,0x4C,0x58,0x50,0x62,0x2B,0x2B,0x78,0x71,0x55,0x39,0x76,0x53, + 0x48,0x38,0x68,0x6D,0x41,0x56,0x54,0x63,0x41,0x59,0x4A,0x4F,0x69,0x41,0x43, + 0x45,0x41,0x5A,0x79,0x31,0x38,0x4D,0x34,0x36,0x2F,0x57,0x53,0x34,0x44,0x4F, + 0x49,0x68,0x6C,0x65,0x4C,0x4B,0x71,0x7A,0x64,0x66,0x35,0x67,0x53,0x4C,0x31, + 0x20,0x64,0x44,0x51,0x46,0x4C,0x69,0x76,0x2F,0x64,0x6D,0x49,0x30,0x56,0x6A, + 0x4C,0x6C,0x4D,0x67,0x43,0x41,0x4A,0x32,0x77,0x4B,0x65,0x63,0x41,0x6D,0x54, + 0x51,0x6D,0x4B,0x6C,0x50,0x4F,0x65,0x4C,0x71,0x66,0x4D,0x50,0x79,0x74,0x74, + 0x32,0x56,0x42,0x4F,0x41,0x33,0x67,0x61,0x65,0x4E,0x57,0x6D,0x34,0x4A,0x57, + 0x64,0x50,0x75,0x33,0x32,0x75,0x35,0x34,0x49,0x55,0x56,0x65,0x30,0x20,0x4E, + 0x77,0x5A,0x63,0x61,0x54,0x2F,0x33,0x2F,0x79,0x70,0x47,0x57,0x37,0x46,0x51, + 0x54,0x67,0x4D,0x41,0x68,0x79,0x6A,0x67,0x75,0x73,0x57,0x4B,0x41,0x6B,0x51, + 0x36,0x75,0x57,0x35,0x78,0x64,0x5A,0x37,0x2B,0x55,0x48,0x34,0x44,0x2B,0x44, + 0x2B,0x32,0x42,0x64,0x64,0x31,0x2B,0x45,0x6F,0x50,0x46,0x71,0x6D,0x6A,0x6F, + 0x79,0x6C,0x77,0x58,0x52,0x74,0x6A,0x72,0x53,0x6B,0x62,0x20,0x79,0x6D,0x30, + 0x41,0x2F,0x63,0x43,0x44,0x4E,0x67,0x55,0x39,0x59,0x49,0x75,0x69,0x41,0x4A, + 0x45,0x79,0x74,0x72,0x67,0x39,0x2F,0x52,0x2B,0x69,0x78,0x4D,0x79,0x2F,0x59, + 0x73,0x70,0x74,0x41,0x41,0x42,0x66,0x74,0x53,0x33,0x59,0x73,0x38,0x42,0x6E, + 0x6B,0x51,0x34,0x53,0x46,0x53,0x6C,0x68,0x55,0x55,0x74,0x41,0x7A,0x77,0x4B, + 0x6E,0x68,0x39,0x37,0x6A,0x63,0x64,0x65,0x68,0x20,0x45,0x67,0x62,0x51,0x44, + 0x33,0x7A,0x4F,0x70,0x71,0x41,0x48,0x62,0x4F,0x33,0x4F,0x6C,0x62,0x63,0x32, + 0x51,0x69,0x53,0x45,0x72,0x64,0x30,0x35,0x6C,0x36,0x66,0x2F,0x35,0x34,0x6A, + 0x35,0x36,0x51,0x2B,0x56,0x4D,0x51,0x43,0x41,0x4C,0x39,0x6B,0x57,0x37,0x47, + 0x34,0x4E,0x75,0x4D,0x4C,0x4E,0x46,0x59,0x57,0x6F,0x4F,0x61,0x35,0x59,0x34, + 0x4C,0x73,0x65,0x6D,0x6D,0x75,0x74,0x20,0x49,0x52,0x63,0x71,0x5A,0x51,0x44, + 0x39,0x6D,0x50,0x36,0x4C,0x46,0x54,0x63,0x73,0x39,0x57,0x6D,0x73,0x56,0x4D, + 0x32,0x45,0x71,0x44,0x43,0x4E,0x47,0x64,0x50,0x47,0x48,0x59,0x69,0x39,0x37, + 0x31,0x2B,0x67,0x6B,0x6A,0x4B,0x7A,0x37,0x72,0x2F,0x4D,0x61,0x77,0x69,0x34, + 0x52,0x69,0x6E,0x43,0x6F,0x6B,0x37,0x5A,0x31,0x4A,0x56,0x6A,0x58,0x6F,0x50, + 0x54,0x30,0x7A,0x2F,0x32,0x20,0x76,0x6E,0x2B,0x42,0x53,0x68,0x71,0x41,0x39, + 0x59,0x77,0x41,0x77,0x4C,0x57,0x4C,0x63,0x70,0x6F,0x57,0x46,0x48,0x56,0x48, + 0x5A,0x33,0x50,0x41,0x35,0x6B,0x56,0x4F,0x44,0x37,0x63,0x48,0x4B,0x64,0x50, + 0x54,0x48,0x79,0x70,0x72,0x41,0x41,0x42,0x66,0x77,0x48,0x4B,0x4E,0x51,0x4D, + 0x61,0x44,0x57,0x35,0x59,0x37,0x44,0x5A,0x49,0x49,0x6B,0x57,0x67,0x38,0x34, + 0x4F,0x5A,0x6C,0x20,0x4F,0x64,0x75,0x39,0x2F,0x73,0x46,0x6F,0x35,0x51,0x74, + 0x6C,0x71,0x78,0x43,0x56,0x4E,0x77,0x42,0x77,0x79,0x47,0x54,0x71,0x62,0x67, + 0x31,0x63,0x74,0x30,0x63,0x53,0x49,0x72,0x46,0x73,0x58,0x4F,0x67,0x38,0x38, + 0x42,0x64,0x72,0x31,0x74,0x39,0x4D,0x56,0x4D,0x4D,0x41,0x6E,0x67,0x62,0x2B, + 0x33,0x72,0x62,0x77,0x65,0x35,0x63,0x36,0x39,0x35,0x65,0x45,0x53,0x42,0x7A, + 0x7A,0x20,0x47,0x67,0x4B,0x75,0x58,0x2B,0x49,0x30,0x78,0x66,0x33,0x33,0x78, + 0x4A,0x6A,0x7A,0x50,0x78,0x76,0x56,0x47,0x6D,0x76,0x2F,0x4F,0x39,0x75,0x43, + 0x6A,0x52,0x6E,0x59,0x74,0x6B,0x4A,0x64,0x41,0x56,0x47,0x37,0x65,0x4A,0x67, + 0x32,0x37,0x44,0x69,0x7A,0x39,0x54,0x66,0x6C,0x71,0x63,0x31,0x30,0x71,0x6D, + 0x55,0x41,0x2B,0x33,0x47,0x59,0x46,0x6C,0x77,0x78,0x54,0x37,0x4D,0x43,0x20, + 0x6F,0x6E,0x61,0x35,0x70,0x73,0x74,0x6E,0x68,0x64,0x76,0x4F,0x56,0x77,0x38, + 0x42,0x42,0x38,0x70,0x55,0x6E,0x57,0x6C,0x55,0x63,0x37,0x62,0x39,0x55,0x65, + 0x44,0x37,0x74,0x6F,0x57,0x76,0x58,0x35,0x4A,0x54,0x6D,0x72,0x43,0x6F,0x4F, + 0x52,0x61,0x31,0x4F,0x49,0x66,0x2B,0x75,0x7A,0x44,0x61,0x71,0x41,0x6A,0x56, + 0x54,0x72,0x65,0x78,0x2F,0x6F,0x64,0x6D,0x50,0x4C,0x68,0x74,0x20,0x52,0x55, + 0x35,0x62,0x69,0x59,0x75,0x61,0x49,0x5A,0x74,0x76,0x73,0x77,0x36,0x6A,0x2F, + 0x67,0x42,0x2F,0x57,0x61,0x62,0x71,0x7A,0x45,0x69,0x31,0x44,0x65,0x44,0x66, + 0x67,0x43,0x2F,0x61,0x46,0x75,0x35,0x6F,0x43,0x6E,0x6A,0x66,0x4D,0x71,0x30, + 0x56,0x45,0x4C,0x58,0x42,0x2B,0x35,0x59,0x35,0x35,0x37,0x4A,0x38,0x45,0x58, + 0x69,0x78,0x54,0x4E,0x57,0x5A,0x6B,0x57,0x6F,0x62,0x20,0x41,0x4D,0x43,0x6E, + 0x4D,0x55,0x5A,0x67,0x78,0x5A,0x55,0x64,0x50,0x68,0x73,0x31,0x4E,0x53,0x67, + 0x53,0x7A,0x73,0x5A,0x4F,0x33,0x2B,0x57,0x41,0x44,0x7A,0x41,0x61,0x2B,0x48, + 0x53,0x5A,0x71,0x6A,0x4D,0x72,0x53,0x54,0x41,0x41,0x67,0x45,0x2B,0x36,0x46, + 0x4C,0x36,0x78,0x4F,0x2B,0x65,0x79,0x66,0x62,0x49,0x51,0x46,0x57,0x56,0x70, + 0x61,0x38,0x43,0x4E,0x37,0x71,0x74,0x61,0x20,0x6E,0x54,0x51,0x51,0x46,0x30, + 0x6B,0x78,0x67,0x4E,0x64,0x77,0x6D,0x42,0x58,0x49,0x65,0x50,0x41,0x62,0x4B, + 0x33,0x4F,0x30,0x32,0x4A,0x2B,0x67,0x49,0x6B,0x52,0x46,0x61,0x4D,0x6D,0x61, + 0x74,0x75,0x6E,0x59,0x37,0x33,0x38,0x49,0x6F,0x34,0x47,0x4B,0x55,0x33,0x55, + 0x44,0x2B,0x4D,0x5A,0x62,0x6A,0x59,0x55,0x66,0x48,0x38,0x58,0x68,0x6F,0x4D, + 0x4E,0x35,0x44,0x51,0x45,0x66,0x20,0x57,0x44,0x57,0x6C,0x51,0x55,0x47,0x52, + 0x47,0x4C,0x49,0x65,0x66,0x47,0x44,0x56,0x6C,0x47,0x76,0x69,0x57,0x6B,0x56, + 0x48,0x2F,0x59,0x75,0x70,0x75,0x67,0x48,0x41,0x4E,0x42,0x50,0x34,0x49,0x2B, + 0x43,0x55,0x37,0x66,0x75,0x57,0x74,0x41,0x54,0x63,0x75,0x6C,0x79,0x44,0x67, + 0x69,0x49,0x5A,0x33,0x4C,0x6F,0x38,0x78,0x78,0x4B,0x33,0x71,0x65,0x70,0x54, + 0x6D,0x44,0x5A,0x66,0x20,0x4E,0x52,0x4A,0x68,0x41,0x43,0x45,0x4F,0x41,0x52, + 0x39,0x7A,0x65,0x63,0x50,0x61,0x42,0x62,0x37,0x72,0x50,0x4B,0x73,0x51,0x73, + 0x58,0x50,0x39,0x6B,0x68,0x78,0x72,0x33,0x54,0x65,0x79,0x2B,0x52,0x69,0x6D, + 0x7A,0x56,0x65,0x4E,0x78,0x42,0x68,0x41,0x4B,0x41,0x70,0x34,0x44,0x6F,0x66, + 0x78,0x41,0x49,0x44,0x4E,0x69,0x7A,0x51,0x7A,0x49,0x4B,0x72,0x48,0x78,0x6B, + 0x37,0x66,0x20,0x64,0x59,0x6B,0x76,0x6D,0x44,0x62,0x2B,0x58,0x42,0x6D,0x71, + 0x34,0x30,0x52,0x69,0x44,0x41,0x43,0x69,0x6A,0x77,0x63,0x41,0x62,0x46,0x32, + 0x57,0x6F,0x30,0x66,0x48,0x6A,0x59,0x73,0x4B,0x30,0x39,0x50,0x75,0x73,0x39, + 0x55,0x39,0x4E,0x36,0x57,0x71,0x2F,0x66,0x34,0x77,0x69,0x54,0x49,0x41,0x75, + 0x47,0x67,0x38,0x34,0x4C,0x44,0x74,0x2B,0x7A,0x7A,0x67,0x2F,0x53,0x74,0x79, + 0x20,0x72,0x47,0x72,0x54,0x39,0x4B,0x43,0x6F,0x44,0x4B,0x76,0x61,0x41,0x74, + 0x37,0x76,0x76,0x6C,0x44,0x74,0x4D,0x50,0x6C,0x2B,0x66,0x36,0x69,0x74,0x56, + 0x34,0x33,0x45,0x47,0x55,0x43,0x49,0x51,0x38,0x42,0x2F,0x63,0x6E,0x6D,0x44, + 0x6D,0x52,0x36,0x63,0x63,0x6C,0x31,0x34,0x49,0x59,0x51,0x7A,0x4B,0x2B,0x59, + 0x46,0x2F,0x4D,0x62,0x4B,0x4B,0x64,0x66,0x70,0x50,0x6A,0x42,0x74,0x20,0x2B, + 0x6C,0x44,0x73,0x46,0x59,0x70,0x49,0x49,0x67,0x30,0x67,0x35,0x49,0x7A,0x2F, + 0x48,0x37,0x6A,0x4C,0x35,0x62,0x32,0x46,0x71,0x52,0x67,0x6C,0x43,0x6F,0x6C, + 0x79,0x73,0x62,0x51,0x31,0x38,0x68,0x54,0x30,0x58,0x5A,0x67,0x32,0x6E,0x59, + 0x69,0x6E,0x50,0x79,0x54,0x55,0x41,0x47,0x44,0x61,0x42,0x2F,0x54,0x50,0x77, + 0x4A,0x2B,0x34,0x76,0x44,0x66,0x72,0x77,0x5A,0x32,0x72,0x20,0x46,0x41,0x6D, + 0x49,0x2B,0x46,0x6B,0x78,0x4C,0x2B,0x44,0x4F,0x61,0x4F,0x4C,0x2F,0x45,0x30, + 0x78,0x62,0x54,0x6F,0x7A,0x34,0x49,0x63,0x45,0x47,0x41,0x4E,0x4D,0x2B,0x71, + 0x43,0x38,0x42,0x58,0x33,0x46,0x35,0x62,0x32,0x50,0x47,0x52,0x41,0x49,0x61, + 0x45,0x78,0x42,0x78,0x73,0x61,0x72,0x4E,0x50,0x50,0x6B,0x6A,0x62,0x46,0x6E, + 0x2F,0x46,0x66,0x4C,0x37,0x2B,0x69,0x64,0x4A,0x20,0x2F,0x4A,0x42,0x77,0x41, + 0x34,0x42,0x70,0x48,0x39,0x67,0x44,0x57,0x47,0x34,0x6F,0x57,0x69,0x44,0x72, + 0x77,0x57,0x2B,0x75,0x6E,0x4E,0x4C,0x73,0x67,0x43,0x69,0x5A,0x6E,0x6E,0x61, + 0x66,0x33,0x31,0x77,0x5A,0x36,0x63,0x6D,0x2F,0x45,0x39,0x4E,0x32,0x45,0x79, + 0x64,0x2B,0x71,0x41,0x45,0x44,0x67,0x49,0x74,0x6D,0x42,0x6E,0x37,0x69,0x38, + 0x74,0x36,0x4D,0x42,0x37,0x65,0x74,0x20,0x7A,0x48,0x48,0x56,0x51,0x70,0x6D, + 0x41,0x69,0x4D,0x5A,0x56,0x43,0x33,0x31,0x75,0x63,0x38,0x2F,0x76,0x42,0x39, + 0x4E,0x57,0x45,0x7A,0x50,0x69,0x50,0x78,0x4D,0x31,0x59,0x51,0x41,0x68,0x6A, + 0x67,0x4B,0x2F,0x42,0x2B,0x78,0x78,0x65,0x56,0x50,0x68,0x7A,0x45,0x46,0x6C, + 0x44,0x41,0x70,0x58,0x72,0x6C,0x2B,0x53,0x63,0x7A,0x33,0x44,0x72,0x38,0x41, + 0x65,0x54,0x46,0x73,0x39,0x20,0x47,0x6E,0x65,0x64,0x34,0x71,0x52,0x6D,0x44, + 0x43,0x44,0x6B,0x6F,0x49,0x63,0x77,0x55,0x79,0x6C,0x76,0x75,0x64,0x35,0x6A, + 0x38,0x79,0x4B,0x66,0x32,0x31,0x64,0x71,0x56,0x79,0x45,0x78,0x4E,0x31,0x6B, + 0x50,0x62,0x6C,0x2B,0x5A,0x69,0x35,0x4C,0x68,0x42,0x36,0x5A,0x74,0x76,0x6A, + 0x76,0x64,0x6C,0x39,0x53,0x6E,0x50,0x39,0x53,0x51,0x41,0x63,0x43,0x30,0x44, + 0x2F,0x49,0x41,0x20,0x38,0x4E,0x73,0x34,0x4A,0x41,0x6F,0x56,0x36,0x47,0x6E, + 0x33,0x32,0x58,0x37,0x35,0x46,0x4B,0x30,0x4E,0x63,0x64,0x5A,0x4D,0x31,0x42, + 0x4F,0x74,0x44,0x62,0x44,0x39,0x38,0x73,0x68,0x6A,0x52,0x34,0x63,0x78,0x62, + 0x66,0x4D,0x41,0x4A,0x46,0x76,0x38,0x55,0x47,0x4D,0x47,0x41,0x42,0x65,0x5A, + 0x77,0x41,0x65,0x49,0x45,0x41,0x6B,0x73,0x61,0x51,0x6E,0x34,0x38,0x42,0x72, + 0x6C,0x20,0x43,0x6F,0x69,0x4C,0x57,0x64,0x70,0x71,0x32,0x6F,0x62,0x6A,0x71, + 0x72,0x34,0x43,0x62,0x32,0x48,0x61,0x5A,0x45,0x32,0x49,0x48,0x32,0x72,0x51, + 0x41,0x47,0x44,0x61,0x42,0x37,0x73,0x66,0x34,0x37,0x5A,0x4F,0x59,0x77,0x4A, + 0x67,0x39,0x68,0x50,0x59,0x76,0x6E,0x70,0x4B,0x69,0x34,0x6A,0x45,0x75,0x32, + 0x7A,0x73,0x39,0x4E,0x6D,0x2B,0x32,0x6E,0x6B,0x39,0x66,0x34,0x45,0x39,0x20, + 0x6D,0x4C,0x61,0x34,0x48,0x32,0x70,0x44,0x2F,0x46,0x43,0x6A,0x42,0x67,0x41, + 0x58,0x52,0x51,0x49,0x66,0x77,0x58,0x46,0x32,0x41,0x4D,0x77,0x4D,0x77,0x55, + 0x33,0x4C,0x63,0x6D,0x78,0x62,0x72,0x6E,0x47,0x42,0x4E,0x4A,0x50,0x31,0x59, + 0x4E,0x76,0x79,0x48,0x44,0x65,0x35,0x6E,0x64,0x73,0x58,0x35,0x69,0x65,0x59, + 0x4E,0x6C,0x67,0x7A,0x54,0x2F,0x34,0x43,0x4E,0x57,0x73,0x41,0x20,0x63,0x4E, + 0x48,0x41,0x34,0x4D,0x64,0x77,0x7A,0x42,0x4D,0x6F,0x73,0x4B,0x37,0x44,0x35, + 0x36,0x36,0x65,0x4B,0x52,0x62,0x72,0x33,0x49,0x48,0x55,0x73,0x61,0x67,0x6C, + 0x34,0x4B,0x36,0x65,0x4B,0x64,0x61,0x35,0x62,0x65,0x41,0x5A,0x5A,0x69,0x65, + 0x68,0x64,0x66,0x32,0x31,0x4A,0x48,0x36,0x6F,0x63,0x51,0x4F,0x41,0x61,0x52, + 0x2F,0x34,0x55,0x55,0x77,0x49,0x35,0x70,0x51,0x78,0x20,0x57,0x4B,0x43,0x6A, + 0x4B,0x65,0x42,0x44,0x6C,0x30,0x39,0x46,0x48,0x66,0x55,0x56,0x4E,0x63,0x6A, + 0x6D,0x52,0x54,0x36,0x2F,0x63,0x2F,0x6C,0x55,0x4B,0x63,0x66,0x51,0x66,0x77, + 0x58,0x54,0x35,0x6F,0x35,0x43,0x37,0x59,0x6B,0x66,0x6F,0x43,0x37,0x47,0x77, + 0x67,0x73,0x66,0x2F,0x44,0x30,0x62,0x4A,0x73,0x46,0x6B,0x58,0x66,0x30,0x53, + 0x2B,0x4C,0x4C,0x72,0x66,0x54,0x4B,0x65,0x20,0x6D,0x66,0x65,0x39,0x62,0x4C, + 0x37,0x50,0x63,0x79,0x65,0x79,0x6E,0x4A,0x39,0x53,0x76,0x36,0x41,0x65,0x6D, + 0x64,0x63,0x51,0x73,0x47,0x31,0x46,0x72,0x74,0x53,0x31,0x49,0x76,0x38,0x64, + 0x65,0x41,0x78,0x71,0x55,0x2F,0x67,0x46,0x61,0x6A,0x34,0x43,0x43,0x42,0x50, + 0x36,0x49,0x68,0x37,0x44,0x63,0x52,0x56,0x68,0x6D,0x47,0x58,0x7A,0x41,0x75, + 0x35,0x65,0x4F,0x36,0x58,0x73,0x20,0x77,0x54,0x72,0x6B,0x71,0x6F,0x55,0x2B, + 0x64,0x36,0x38,0x74,0x65,0x61,0x48,0x59,0x58,0x64,0x53,0x42,0x2B,0x4B,0x48, + 0x4F,0x44,0x41,0x41,0x75,0x57,0x6B,0x56,0x34,0x41,0x78,0x46,0x79,0x42,0x63, + 0x41,0x73,0x4A,0x74,0x72,0x61,0x6E,0x65,0x4E,0x44,0x70,0x59,0x57,0x49,0x49, + 0x69,0x45,0x55,0x75,0x6E,0x68,0x62,0x75,0x35,0x31,0x50,0x36,0x51,0x31,0x7A, + 0x47,0x4E,0x4F,0x6D,0x20,0x45,0x72,0x65,0x71,0x4C,0x79,0x70,0x31,0x5A,0x77, + 0x42,0x77,0x30,0x58,0x34,0x43,0x37,0x38,0x64,0x78,0x65,0x37,0x45,0x77,0x53, + 0x31,0x73,0x44,0x50,0x74,0x49,0x7A,0x78,0x58,0x57,0x4C,0x66,0x63,0x30,0x55, + 0x31,0x43,0x42,0x5A,0x44,0x36,0x35,0x62,0x37,0x50,0x4F,0x52,0x6E,0x70,0x4C, + 0x7A,0x50,0x6E,0x5A,0x68,0x32,0x6C,0x4B,0x69,0x31,0x76,0x4F,0x58,0x53,0x6C, + 0x30,0x61,0x20,0x41,0x46,0x77,0x30,0x51,0x2F,0x42,0x62,0x4F,0x47,0x34,0x30, + 0x47,0x69,0x62,0x6A,0x77,0x5A,0x62,0x46,0x4F,0x65,0x35,0x65,0x4F,0x38,0x55, + 0x56,0x37,0x6A,0x75,0x2F,0x69,0x69,0x70,0x78,0x78,0x51,0x49,0x54,0x37,0x6D, + 0x39,0x5A,0x48,0x48,0x6C,0x36,0x72,0x38,0x42,0x44,0x6D,0x44,0x5A,0x30,0x43, + 0x4F,0x70,0x48,0x2F,0x46,0x41,0x6E,0x67,0x34,0x43,0x7A,0x55,0x54,0x51,0x34, + 0x20,0x2B,0x43,0x6A,0x77,0x41,0x76,0x42,0x74,0x59,0x48,0x6D,0x55,0x2B,0x37, + 0x55,0x31,0x6D,0x6A,0x33,0x67,0x72,0x6C,0x72,0x6F,0x38,0x35,0x50,0x65,0x4C, + 0x47,0x66,0x47,0x46,0x42,0x49,0x6B,0x6B,0x55,0x55,0x74,0x41,0x54,0x66,0x46, + 0x63,0x33,0x7A,0x63,0x4B,0x63,0x77,0x55,0x33,0x33,0x4E,0x51,0x58,0x38,0x49, + 0x76,0x55,0x4C,0x63,0x52,0x51,0x4A,0x69,0x69,0x4C,0x63,0x64,0x76,0x20,0x6F, + 0x6F,0x51,0x75,0x41,0x56,0x78,0x49,0x46,0x39,0x32,0x32,0x33,0x50,0x6E,0x30, + 0x56,0x31,0x46,0x47,0x4F,0x70,0x6F,0x43,0x74,0x69,0x33,0x50,0x78,0x5A,0x58, + 0x6D,0x76,0x51,0x76,0x34,0x44,0x39,0x53,0x78,0x2B,0x43,0x45,0x6C,0x42,0x67, + 0x44,0x78,0x64,0x67,0x6B,0x4B,0x72,0x4F,0x76,0x77,0x2B,0x64,0x32,0x31,0x55, + 0x39,0x79,0x36,0x50,0x45,0x64,0x37,0x6F,0x34,0x79,0x67,0x20,0x57,0x72,0x51, + 0x33,0x6D,0x68,0x4F,0x69,0x66,0x6E,0x64,0x74,0x53,0x51,0x6B,0x39,0x59,0x65, + 0x6F,0x32,0x35,0x43,0x2B,0x6D,0x72,0x72,0x73,0x41,0x78,0x63,0x7A,0x51,0x4A, + 0x66,0x68,0x6E,0x34,0x45,0x6E,0x67,0x66,0x56,0x48,0x76,0x36,0x57,0x47,0x4F, + 0x4C,0x46,0x2F,0x58,0x34,0x62,0x4E,0x76,0x49,0x4D,0x50,0x72,0x2F,0x52,0x6B, + 0x47,0x4A,0x39,0x51,0x31,0x71,0x41,0x51,0x64,0x20,0x54,0x51,0x48,0x58,0x64, + 0x50,0x6D,0x73,0x37,0x2F,0x53,0x6A,0x72,0x4E,0x65,0x66,0x69,0x58,0x2F,0x44, + 0x62,0x4F,0x43,0x78,0x46,0x2B,0x70,0x62,0x2B,0x41,0x56,0x53,0x45,0x77,0x47, + 0x45,0x43,0x58,0x32,0x78,0x65,0x34,0x47,0x62,0x67,0x53,0x2B,0x57,0x65,0x6B, + 0x38,0x50,0x32,0x4E,0x42,0x70,0x42,0x70,0x33,0x75,0x75,0x43,0x78,0x48,0x74, + 0x31,0x59,0x61,0x6C,0x6F,0x33,0x75,0x20,0x31,0x6F,0x41,0x37,0x4C,0x6A,0x4F, + 0x44,0x73,0x68,0x76,0x69,0x45,0x2F,0x38,0x58,0x4D,0x57,0x30,0x68,0x4E,0x65, + 0x4B,0x48,0x6C,0x45,0x55,0x41,0x59,0x59,0x71,0x69,0x67,0x55,0x38,0x44,0x4F, + 0x34,0x43,0x2F,0x41,0x50,0x35,0x6A,0x71,0x66,0x64,0x65,0x33,0x65,0x61,0x7A, + 0x75,0x73,0x32,0x6E,0x62,0x38,0x7A,0x6A,0x39,0x66,0x34,0x4D,0x68,0x38,0x35, + 0x6C,0x38,0x4F,0x55,0x48,0x20,0x4A,0x5A,0x48,0x78,0x7A,0x46,0x34,0x4F,0x56, + 0x33,0x66,0x35,0x55,0x5A,0x66,0x71,0x7A,0x73,0x62,0x33,0x4D,0x64,0x2F,0x37, + 0x69,0x35,0x41,0x65,0x34,0x52,0x64,0x49,0x72,0x51,0x45,0x55,0x2B,0x4D,0x5A, + 0x62,0x6A,0x51,0x55,0x54,0x65,0x42,0x47,0x34,0x45,0x2F,0x67,0x73,0x38,0x45, + 0x67,0x63,0x39,0x31,0x37,0x53,0x45,0x6E,0x44,0x62,0x69,0x68,0x7A,0x6A,0x75, + 0x52,0x78,0x76,0x20,0x44,0x32,0x5A,0x34,0x61,0x30,0x44,0x64,0x41,0x31,0x63, + 0x36,0x6D,0x67,0x49,0x32,0x64,0x50,0x70,0x63,0x32,0x65,0x48,0x54,0x6E,0x49, + 0x33,0x39,0x39,0x67,0x38,0x52,0x4F,0x71,0x49,0x72,0x62,0x65,0x49,0x48,0x47, + 0x51,0x41,0x77,0x34,0x39,0x6A,0x41,0x64,0x34,0x44,0x2F,0x41,0x58,0x77,0x69, + 0x6A,0x76,0x73,0x33,0x5A,0x2B,0x47,0x61,0x4C,0x70,0x39,0x72,0x75,0x6E,0x78, + 0x36,0x20,0x52,0x7A,0x33,0x32,0x44,0x32,0x59,0x34,0x66,0x43,0x37,0x44,0x75, + 0x4C,0x59,0x6F,0x6E,0x4A,0x48,0x6D,0x4C,0x46,0x7A,0x65,0x37,0x76,0x4E,0x72, + 0x48,0x58,0x36,0x35,0x75,0x6C,0x4A,0x66,0x42,0x2F,0x36,0x47,0x47,0x6C,0x75, + 0x37,0x58,0x77,0x35,0x6B,0x41,0x43,0x46,0x43,0x30,0x63,0x42,0x2B,0x34,0x46, + 0x35,0x4D,0x74,0x2B,0x42,0x2B,0x59,0x48,0x74,0x63,0x66,0x36,0x4F,0x37,0x20, + 0x4E,0x61,0x43,0x37,0x4E,0x63,0x66,0x4E,0x79,0x33,0x49,0x63,0x47,0x2F,0x5A, + 0x34,0x35,0x31,0x79,0x47,0x49,0x2B,0x63,0x79,0x54,0x4B,0x51,0x38,0x76,0x36, + 0x67,0x70,0x41,0x36,0x76,0x62,0x66,0x64,0x61,0x32,0x2B,0x31,0x7A,0x57,0x46, + 0x73,0x54,0x56,0x72,0x79,0x39,0x6D,0x4A,0x2F,0x41,0x45,0x38,0x48,0x54,0x68, + 0x46,0x32,0x6B,0x57,0x50,0x38,0x67,0x41,0x4C,0x71,0x49,0x6F,0x20,0x47,0x6E, + 0x67,0x36,0x66,0x2F,0x30,0x70,0x78,0x67,0x68,0x36,0x34,0x76,0x6F,0x37,0x48, + 0x75,0x61,0x67,0x69,0x56,0x56,0x74,0x4F,0x66,0x78,0x6C,0x4F,0x59,0x36,0x50, + 0x65,0x42,0x77,0x66,0x79,0x58,0x42,0x30,0x78,0x47,0x4D,0x6F,0x4A,0x64,0x32, + 0x45,0x39,0x73,0x61,0x41,0x31,0x57,0x30,0x42,0x4B,0x2B,0x66,0x37,0x72,0x4A, + 0x77,0x66,0x6C,0x4A,0x71,0x74,0x64,0x79,0x6B,0x4F,0x20,0x59,0x6F,0x54,0x2F, + 0x74,0x34,0x56,0x66,0x70,0x46,0x33,0x34,0x42,0x57,0x51,0x41,0x73,0x31,0x42, + 0x6B,0x42,0x48,0x38,0x4C,0x2F,0x42,0x33,0x77,0x49,0x44,0x47,0x4E,0x44,0x34, + 0x54,0x4A,0x65,0x42,0x66,0x4D,0x34,0x45,0x5A,0x67,0x65,0x4E,0x4C,0x6A,0x36, + 0x49,0x6A,0x48,0x73,0x57,0x47,0x50,0x55,0x36,0x4D,0x5A,0x78,0x75,0x71,0x6B, + 0x71,0x39,0x43,0x53,0x68,0x61,0x57,0x74,0x20,0x50,0x69,0x76,0x6D,0x47,0x2B, + 0x46,0x58,0x4B,0x48,0x66,0x69,0x49,0x65,0x44,0x7A,0x67,0x41,0x38,0x53,0x66, + 0x6A,0x45,0x79,0x67,0x44,0x6B,0x49,0x64,0x51,0x74,0x38,0x7A,0x50,0x6A,0x41, + 0x34,0x38,0x41,0x66,0x41,0x35,0x38,0x70,0x31,0x39,0x39,0x73,0x61,0x77,0x7A, + 0x59,0x32,0x42,0x6D,0x77,0x73,0x52,0x4D,0x67,0x78,0x39,0x43,0x45,0x52,0x2B, + 0x2B,0x6F,0x78,0x36,0x2F,0x4F,0x20,0x65,0x35,0x77,0x65,0x38,0x7A,0x67,0x37, + 0x58,0x68,0x73,0x52,0x77,0x73,0x4C,0x6D,0x67,0x4D,0x55,0x74,0x41,0x63,0x76, + 0x6E,0x42,0x58,0x53,0x33,0x42,0x69,0x79,0x6F,0x62,0x4E,0x62,0x6B,0x35,0x7A, + 0x44,0x48,0x63,0x66,0x55,0x58,0x66,0x69,0x48,0x78,0x58,0x34,0x77,0x4D,0x77, + 0x49,0x4B,0x69,0x61,0x4B,0x41,0x66,0x4D,0x31,0x50,0x77,0x4A,0x65,0x43,0x54, + 0x6D,0x4B,0x37,0x42,0x20,0x73,0x6E,0x4C,0x2B,0x2F,0x51,0x56,0x4E,0x52,0x6A, + 0x78,0x58,0x64,0x6C,0x7A,0x34,0x33,0x63,0x43,0x34,0x78,0x37,0x6C,0x4A,0x47, + 0x4A,0x72,0x30,0x47,0x42,0x6A,0x33,0x36,0x42,0x38,0x33,0x58,0x59,0x64,0x4B, + 0x52,0x77,0x73,0x74,0x57,0x56,0x4F,0x2F,0x72,0x75,0x61,0x41,0x7A,0x75,0x61, + 0x41,0x42,0x59,0x30,0x42,0x37,0x59,0x33,0x51,0x32,0x56,0x79,0x56,0x65,0x63, + 0x2B,0x54,0x20,0x6D,0x46,0x44,0x2F,0x63,0x53,0x52,0x38,0x4B,0x32,0x51,0x41, + 0x44,0x73,0x78,0x67,0x42,0x49,0x2F,0x6D,0x72,0x2F,0x73,0x77,0x52,0x72,0x43, + 0x70,0x55,0x6E,0x58,0x70,0x62,0x41,0x37,0x6F,0x62,0x41,0x61,0x59,0x4C,0x72, + 0x51,0x4A,0x48,0x34,0x59,0x6D,0x50,0x50,0x72,0x48,0x50,0x45,0x5A,0x7A,0x70, + 0x6A,0x73,0x42,0x35,0x6E,0x65,0x46,0x67,0x63,0x5A,0x4A,0x6E,0x31,0x6D,0x6E, + 0x20,0x49,0x78,0x63,0x32,0x42,0x39,0x4F,0x57,0x50,0x52,0x65,0x2F,0x37,0x6D, + 0x6F,0x4A,0x79,0x4F,0x62,0x2F,0x75,0x36,0x41,0x70,0x6F,0x43,0x6B,0x5A,0x71, + 0x57,0x52,0x37,0x4D,0x63,0x4C,0x2F,0x61,0x76,0x69,0x58,0x45,0x76,0x37,0x63, + 0x79,0x41,0x41,0x69,0x45,0x47,0x35,0x59,0x65,0x54,0x50,0x34,0x61,0x76,0x37, + 0x36,0x45,0x4D,0x59,0x49,0x37,0x71,0x78,0x4B,0x78,0x54,0x43,0x6A,0x20,0x36, + 0x59,0x74,0x62,0x67,0x72,0x52,0x73,0x63,0x4B,0x70,0x52,0x2F,0x52,0x4C,0x78, + 0x67,0x71,0x43,0x30,0x68,0x76,0x4C,0x45,0x4B,0x2B,0x4D,0x78,0x56,0x61,0x57, + 0x75,0x36,0x41,0x45,0x2B,0x44,0x76,0x77,0x42,0x5A,0x65,0x34,0x65,0x70,0x4A, + 0x43,0x54,0x77,0x4E,0x65,0x41,0x62,0x32,0x4A,0x47,0x39,0x31,0x50,0x4E,0x2F, + 0x56,0x75,0x61,0x53,0x33,0x70,0x2F,0x4D,0x67,0x4B,0x34,0x20,0x2B,0x75,0x4D, + 0x67,0x38,0x44,0x42,0x6D,0x33,0x34,0x48,0x66,0x42,0x70,0x36,0x71,0x62,0x6E, + 0x58,0x71,0x67,0x71,0x63,0x77,0x6E,0x2B,0x56,0x79,0x7A,0x47,0x65,0x62,0x65, + 0x76,0x48,0x48,0x67,0x62,0x6F,0x41,0x35,0x57,0x64,0x6E,0x2F,0x75,0x72,0x43, + 0x64,0x41,0x30,0x2B,0x43,0x76,0x78,0x4F,0x56,0x57,0x74,0x55,0x4F,0x33,0x77, + 0x58,0x6B,0x35,0x57,0x35,0x69,0x39,0x43,0x67,0x20,0x6E,0x6F,0x67,0x50,0x47, + 0x55,0x44,0x6C,0x36,0x41,0x66,0x2B,0x49,0x58,0x38,0x74,0x41,0x65,0x37,0x49, + 0x58,0x39,0x76,0x7A,0x72,0x34,0x58,0x35,0x6A,0x4C,0x34,0x4C,0x50,0x4A,0x4F, + 0x2F,0x2B,0x71,0x70,0x62,0x6E,0x66,0x70,0x48,0x42,0x6C,0x41,0x64,0x2B,0x72, + 0x68,0x67,0x42,0x6D,0x42,0x6D,0x44,0x37,0x5A,0x6A,0x49,0x6F,0x53,0x62,0x67, + 0x66,0x69,0x58,0x76,0x53,0x53,0x54,0x20,0x48,0x47,0x61,0x62,0x74,0x6D,0x63, + 0x78,0x77,0x6E,0x2B,0x31,0x75,0x74,0x56,0x4A,0x48,0x7A,0x4B,0x41,0x5A,0x4C, + 0x41,0x33,0x66,0x2F,0x31,0x31,0x2F,0x76,0x56,0x57,0x34,0x42,0x61,0x4D,0x47, + 0x57,0x77,0x46,0x46,0x6C,0x65,0x70,0x58,0x6E,0x46,0x7A,0x47,0x74,0x69,0x4E, + 0x45,0x66,0x33,0x7A,0x2B,0x5A,0x39,0x46,0x46,0x5A,0x45,0x42,0x4A,0x4A,0x50, + 0x64,0x2B,0x61,0x75,0x77,0x20,0x55,0x63,0x6C,0x36,0x4C,0x68,0x6A,0x43,0x72, + 0x77,0x50,0x58,0x56,0x4B,0x6C,0x65,0x72,0x72,0x77,0x4F,0x2F,0x49,0x77,0x4C, + 0x67,0x74,0x39,0x58,0x33,0x65,0x71,0x49,0x59,0x6D,0x51,0x41,0x74,0x63,0x47, + 0x2B,0x2F,0x50,0x58,0x31,0x2F,0x47,0x73,0x50,0x75,0x41,0x6F,0x7A,0x33,0x62, + 0x67,0x75,0x2F,0x2F,0x4F,0x6D,0x2F,0x4D,0x2B,0x56,0x6A,0x68,0x5A,0x4F,0x59, + 0x34,0x35,0x69,0x20,0x32,0x77,0x75,0x38,0x6B,0x66,0x2F,0x35,0x59,0x50,0x37, + 0x6E,0x56,0x43,0x51,0x6A,0x31,0x44,0x49,0x79,0x67,0x4E,0x6F,0x6B,0x41,0x48, + 0x36,0x52,0x76,0x34,0x72,0x70,0x78,0x42,0x6A,0x42,0x74,0x5A,0x6A,0x42,0x78, + 0x63,0x49,0x4B,0x78,0x6E,0x56,0x41,0x49,0x5A,0x6D,0x34,0x44,0x66,0x69,0x31, + 0x57,0x65,0x37,0x39,0x4F,0x6A,0x41,0x52,0x65,0x72,0x32,0x33,0x36,0x50,0x57, + 0x72,0x20,0x2B,0x64,0x65,0x76,0x59,0x73,0x51,0x2B,0x34,0x46,0x35,0x39,0x6B, + 0x52,0x52,0x6B,0x41,0x50,0x58,0x48,0x41,0x50,0x42,0x79,0x2F,0x72,0x6F,0x55, + 0x73,0x36,0x30,0x6F,0x30,0x6C,0x4D,0x37,0x52,0x63,0x67,0x41,0x30,0x6F,0x75, + 0x45,0x4C,0x70,0x51,0x4A,0x4B,0x45,0x53,0x61,0x4B,0x58,0x6B,0x74,0x67,0x42, + 0x43,0x69,0x64,0x6C,0x45,0x45,0x49,0x45,0x53,0x4B,0x6B,0x51,0x45,0x49,0x20, + 0x6B,0x57,0x4A,0x6B,0x41,0x45,0x4B,0x6B,0x47,0x42,0x6D,0x41,0x45,0x43,0x6C, + 0x47,0x42,0x69,0x42,0x45,0x69,0x70,0x45,0x42,0x43,0x4A,0x46,0x69,0x2F,0x68, + 0x30,0x37,0x77,0x4F,0x37,0x35,0x36,0x2F,0x2B,0x71,0x74,0x67,0x41,0x41,0x41, + 0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D,0x3D, + 0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x74,0x61,0x72,0x31,0x5F, + 0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x43,0x41,0x41,0x41,0x41,0x41,0x67,0x43, + 0x41,0x59,0x41,0x41,0x41,0x42,0x7A,0x65,0x6E,0x72,0x30,0x41,0x41,0x41,0x42, + 0x53,0x45,0x6C,0x45,0x51,0x56,0x52,0x59,0x68,0x65,0x32,0x57,0x30,0x57,0x33, + 0x43,0x4D,0x42,0x43,0x47,0x76,0x31,0x53,0x38,0x20,0x4E,0x79,0x4E,0x55,0x36, + 0x67,0x4B,0x77,0x51,0x64,0x6D,0x6B,0x33,0x53,0x42,0x4D,0x41,0x45,0x78,0x41, + 0x6D,0x51,0x42,0x31,0x41,0x74,0x6F,0x4A,0x6D,0x6B,0x35,0x51,0x47,0x41,0x43, + 0x4A,0x45,0x63,0x49,0x45,0x36,0x59,0x4D,0x64,0x39,0x62,0x42,0x51,0x66,0x4F, + 0x65,0x6B,0x53,0x68,0x2F,0x79,0x50,0x7A,0x6D,0x4F,0x37,0x66,0x2F,0x2F,0x7A, + 0x33,0x65,0x32,0x73,0x37,0x71,0x75,0x20,0x47,0x52,0x4A,0x33,0x67,0x37,0x4B, + 0x50,0x41,0x6B,0x59,0x42,0x2F,0x30,0x48,0x41,0x70,0x4B,0x2B,0x46,0x54,0x70, + 0x66,0x72,0x37,0x38,0x64,0x37,0x33,0x62,0x7A,0x4F,0x45,0x54,0x68,0x64,0x72, + 0x73,0x68,0x58,0x77,0x4E,0x51,0x79,0x58,0x78,0x57,0x42,0x30,0x42,0x30,0x34, + 0x68,0x36,0x49,0x2F,0x42,0x7A,0x62,0x41,0x4D,0x31,0x44,0x32,0x4C,0x73,0x42, + 0x6A,0x41,0x78,0x77,0x39,0x20,0x77,0x54,0x6B,0x67,0x2F,0x38,0x54,0x6F,0x50, + 0x45,0x56,0x41,0x44,0x75,0x78,0x38,0x2B,0x2B,0x43,0x46,0x66,0x50,0x6D,0x2B, + 0x50,0x49,0x55,0x63,0x49,0x4E,0x50,0x63,0x42,0x64,0x37,0x74,0x46,0x50,0x68, + 0x57,0x72,0x44,0x6B,0x48,0x79,0x72,0x39,0x49,0x77,0x73,0x5A,0x31,0x44,0x44, + 0x6E,0x63,0x7A,0x70,0x74,0x6B,0x41,0x63,0x4C,0x4E,0x6D,0x32,0x4C,0x34,0x44, + 0x69,0x67,0x61,0x20,0x45,0x54,0x45,0x68,0x71,0x69,0x31,0x6F,0x46,0x76,0x50, + 0x51,0x33,0x74,0x38,0x6C,0x73,0x4D,0x42,0x46,0x44,0x72,0x68,0x39,0x4E,0x71, + 0x67,0x69,0x49,0x4D,0x67,0x4C,0x4A,0x54,0x6E,0x41,0x45,0x79,0x35,0x6E,0x56, + 0x72,0x51,0x6B,0x71,0x53,0x55,0x48,0x48,0x6F,0x43,0x6C,0x59,0x54,0x77,0x34, + 0x39,0x31,0x58,0x62,0x67,0x47,0x67,0x5A,0x43,0x76,0x66,0x61,0x63,0x6A,0x73, + 0x44,0x20,0x37,0x38,0x44,0x57,0x74,0x31,0x75,0x68,0x50,0x51,0x63,0x4B,0x58, + 0x45,0x68,0x6A,0x4F,0x41,0x41,0x7A,0x32,0x52,0x45,0x72,0x52,0x38,0x74,0x42, + 0x74,0x42,0x59,0x6B,0x46,0x62,0x38,0x48,0x6B,0x34,0x7A,0x4B,0x68,0x34,0x59, + 0x30,0x52,0x63,0x42,0x72,0x79,0x37,0x2B,0x39,0x61,0x4A,0x64,0x36,0x61,0x67, + 0x64,0x31,0x47,0x59,0x59,0x49,0x62,0x73,0x41,0x6D,0x4F,0x54,0x4F,0x77,0x20, + 0x52,0x53,0x42,0x5A,0x51,0x43,0x42,0x69,0x6A,0x39,0x75,0x4B,0x75,0x59,0x55, + 0x63,0x4F,0x72,0x34,0x48,0x42,0x4E,0x6B,0x4C,0x4C,0x75,0x76,0x4E,0x36,0x4F, + 0x74,0x4A,0x56,0x75,0x46,0x4B,0x7A,0x34,0x78,0x4F,0x57,0x39,0x41,0x48,0x42, + 0x6E,0x2B,0x55,0x6A,0x67,0x4A,0x47,0x41,0x54,0x2F,0x6D,0x2F,0x46,0x57,0x39, + 0x51,0x77,0x43,0x69,0x33,0x41,0x41,0x41,0x41,0x41,0x42,0x4A,0x20,0x52,0x55, + 0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F, + 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72, + 0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x63,0x61,0x6C,0x65, + 0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6E, + 0x20,0x7B,0x20,0x78,0x30,0x20,0x3D,0x20,0x2D,0x31,0x30,0x30,0x2C,0x20,0x78, + 0x20,0x3D,0x20,0x31,0x30,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D,0x20,0x6D,0x61, + 0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x36, + 0x30,0x30,0x2C,0x20,0x72,0x30,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72, + 0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x6D,0x61,0x74,0x68,0x2E, + 0x70,0x69,0x20,0x2A,0x20,0x32,0x2C,0x20,0x72,0x76,0x20,0x3D,0x20,0x6D,0x61, 0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x6D, - 0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x32,0x2C,0x20,0x72,0x76,0x20, - 0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29, - 0x20,0x2A,0x20,0x6D,0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x34,0x2C, - 0x20,0x74,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F, - 0x6D,0x28,0x29,0x2C,0x20,0x73,0x63,0x61,0x6C,0x65,0x20,0x3D,0x20,0x73,0x63, - 0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x20,0x3D,0x20,0x73,0x70, - 0x65,0x65,0x64,0x2C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61, - 0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x6E, - 0x75,0x6D,0x5F,0x73,0x74,0x61,0x72,0x73,0x2C,0x20,0x73,0x63,0x61,0x6C,0x65, - 0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x6C,0x61,0x79,0x65,0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F,0x72,0x20, - 0x69,0x20,0x3D,0x20,0x31,0x2C,0x6E,0x75,0x6D,0x5F,0x73,0x74,0x61,0x72,0x73, - 0x20,0x64,0x6F,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72, - 0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65, - 0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70, - 0x65,0x65,0x64,0x29,0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6E,0x20,0x6C,0x61,0x79,0x65,0x72,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63, - 0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64, - 0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x73,0x29, - 0x20,0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2B,0x20,0x30,0x2E, - 0x31,0x20,0x2A,0x20,0x73,0x2E,0x73,0x70,0x65,0x65,0x64,0x20,0x2A,0x20,0x64, - 0x74,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x73,0x2E,0x74,0x20,0x3E,0x20,0x31, - 0x20,0x64,0x6F,0x20,0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2D, - 0x20,0x31,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77, - 0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x78,0x20,0x3D,0x20,0x73,0x2E,0x78,0x30,0x20,0x2B,0x20,0x73,0x2E,0x78,0x20, - 0x2A,0x20,0x73,0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D, - 0x20,0x73,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x72,0x20,0x3D,0x20, - 0x73,0x2E,0x72,0x30,0x20,0x2B,0x20,0x73,0x2E,0x72,0x76,0x20,0x2A,0x20,0x73, - 0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x78,0x20,0x3D,0x20,0x73, - 0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x79, - 0x20,0x3D,0x20,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,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,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65, - 0x2C,0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20, - 0x32,0x35,0x35,0x2C,0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C, - 0x65,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63, - 0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x73,0x74,0x61,0x72,0x31,0x2C,0x20,0x78, - 0x2C,0x20,0x79,0x2C,0x20,0x72,0x2C,0x20,0x73,0x78,0x2C,0x20,0x73,0x79,0x2C, - 0x20,0x31,0x36,0x2C,0x20,0x31,0x36,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70, - 0x64,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72, - 0x28,0x64,0x74,0x2C,0x20,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x66,0x6F,0x72, - 0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28, - 0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61,0x74, - 0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20,0x65, + 0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x34,0x2C,0x20,0x74,0x20,0x3D, + 0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x2C, + 0x20,0x73,0x63,0x61,0x6C,0x65,0x20,0x3D,0x20,0x73,0x63,0x61,0x6C,0x65,0x2C, + 0x20,0x73,0x70,0x65,0x65,0x64,0x20,0x3D,0x20,0x73,0x70,0x65,0x65,0x64,0x2C, + 0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75, + 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73, + 0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x6E,0x75,0x6D,0x5F,0x73, + 0x74,0x61,0x72,0x73,0x2C,0x20,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70, + 0x65,0x65,0x64,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6C,0x61,0x79,0x65, + 0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F,0x72,0x20,0x69,0x20,0x3D,0x20, + 0x31,0x2C,0x6E,0x75,0x6D,0x5F,0x73,0x74,0x61,0x72,0x73,0x20,0x64,0x6F,0x20, + 0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61, + 0x79,0x65,0x72,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61, + 0x72,0x28,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29, + 0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x6C,0x61, + 0x79,0x65,0x72,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66, + 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F, + 0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x73,0x29,0x20,0x73,0x2E,0x74, + 0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2B,0x20,0x30,0x2E,0x31,0x20,0x2A,0x20, + 0x73,0x2E,0x73,0x70,0x65,0x65,0x64,0x20,0x2A,0x20,0x64,0x74,0x20,0x77,0x68, + 0x69,0x6C,0x65,0x20,0x73,0x2E,0x74,0x20,0x3E,0x20,0x31,0x20,0x64,0x6F,0x20, + 0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2D,0x20,0x31,0x20,0x65, 0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75, 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61, - 0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20, - 0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69, - 0x72,0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20,0x64,0x72, - 0x61,0x77,0x5F,0x73,0x74,0x61,0x72,0x28,0x76,0x29,0x20,0x65,0x6E,0x64,0x20, - 0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74, - 0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C, - 0x6C,0x28,0x70,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x7B,0x20,0x70, - 0x20,0x3D,0x20,0x70,0x2C,0x20,0x74,0x30,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68, - 0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x31,0x30,0x2C, - 0x20,0x74,0x20,0x3D,0x20,0x30,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72, - 0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x6E,0x29,0x20, - 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x74,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F, - 0x72,0x20,0x69,0x20,0x3D,0x20,0x31,0x2C,0x6E,0x20,0x64,0x6F,0x20,0x74,0x61, - 0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x74,0x2C,0x20,0x63, - 0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x28,0x6D,0x61, - 0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x32,0x20,0x2F,0x20,0x6E,0x29,0x20, - 0x2A,0x20,0x69,0x29,0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6E,0x20,0x74,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F, - 0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64,0x74,0x2C,0x20,0x6B,0x29,0x20,0x6B,0x2E, - 0x74,0x20,0x3D,0x20,0x6B,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x65,0x6E, - 0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x6B,0x29, - 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x78,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E, - 0x65,0x74,0x2E,0x78,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D,0x20, - 0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x61,0x20,0x3D,0x20,0x6B,0x2E,0x70,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x20,0x6C, - 0x6F,0x63,0x61,0x6C,0x20,0x68,0x20,0x3D,0x20,0x32,0x32,0x35,0x20,0x2B,0x20, - 0x32,0x30,0x20,0x2A,0x20,0x28,0x31,0x20,0x2B,0x20,0x6D,0x61,0x74,0x68,0x2E, - 0x73,0x69,0x6E,0x28,0x6B,0x2E,0x74,0x30,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x29, - 0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, - 0x2E,0x64,0x72,0x61,0x77,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2C,0x20,0x78, - 0x2C,0x20,0x79,0x2C,0x20,0x61,0x2C,0x20,0x2E,0x37,0x35,0x2C,0x20,0x2E,0x37, - 0x35,0x2C,0x20,0x36,0x34,0x2C,0x20,0x68,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C, - 0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75, - 0x70,0x64,0x61,0x74,0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20, - 0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72, - 0x20,0x2B,0x20,0x64,0x74,0x20,0x69,0x66,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72, - 0x20,0x3E,0x20,0x33,0x36,0x30,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x67, - 0x6F,0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x2D,0x20, - 0x33,0x36,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x20, - 0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x65,0x6E,0x64,0x20, + 0x72,0x28,0x73,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x78,0x20,0x3D,0x20, + 0x73,0x2E,0x78,0x30,0x20,0x2B,0x20,0x73,0x2E,0x78,0x20,0x2A,0x20,0x73,0x2E, + 0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D,0x20,0x73,0x2E,0x79, + 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x72,0x20,0x3D,0x20,0x73,0x2E,0x72,0x30, + 0x20,0x2B,0x20,0x73,0x2E,0x72,0x76,0x20,0x2A,0x20,0x73,0x2E,0x74,0x20,0x6C, + 0x6F,0x63,0x61,0x6C,0x20,0x73,0x78,0x20,0x3D,0x20,0x73,0x2E,0x73,0x63,0x61, + 0x6C,0x65,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x79,0x20,0x3D,0x20,0x73, + 0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,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,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x32,0x35, + 0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x32,0x35,0x35,0x2C, + 0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x29,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72, + 0x61,0x77,0x28,0x73,0x74,0x61,0x72,0x31,0x2C,0x20,0x78,0x2C,0x20,0x79,0x2C, + 0x20,0x72,0x2C,0x20,0x73,0x78,0x2C,0x20,0x73,0x79,0x2C,0x20,0x31,0x36,0x2C, + 0x20,0x31,0x36,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, + 0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65, + 0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x64,0x74,0x2C, + 0x20,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76, + 0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65, + 0x72,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x73,0x74, + 0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x65, + 0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, + 0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61, + 0x79,0x65,0x72,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x66,0x6F,0x72,0x20, + 0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6C, + 0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77,0x5F,0x73, + 0x74,0x61,0x72,0x28,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20, 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, - 0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x70,0x6C,0x61,0x6E,0x65,0x74,0x28,0x64, - 0x74,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x3D,0x20,0x70, - 0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x70,0x6C, - 0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x3D,0x20,0x33,0x30,0x30,0x20,0x2B,0x20, - 0x6D,0x61,0x74,0x68,0x2E,0x73,0x69,0x6E,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74, - 0x2E,0x74,0x29,0x2A,0x33,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x61,0x64, - 0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x62,0x36,0x34,0x2C, - 0x20,0x66,0x69,0x6C,0x65,0x6E,0x61,0x6D,0x65,0x29,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,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,0x62,0x36,0x34, - 0x2C,0x20,0x66,0x69,0x6C,0x65,0x6E,0x61,0x6D,0x65,0x2C,0x20,0x22,0x62,0x61, - 0x73,0x65,0x36,0x34,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x69,0x6D, - 0x61,0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x69,0x6D,0x61,0x67,0x65,0x2E,0x6E,0x65,0x77,0x49,0x6D,0x61,0x67,0x65, - 0x44,0x61,0x74,0x61,0x28,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,0x29, - 0x20,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,0x69,0x6D,0x61,0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x29,0x20,0x65,0x6E, - 0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x6C,0x6F,0x61,0x64,0x28,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x20, - 0x3D,0x20,0x7B,0x20,0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20, - 0x3D,0x20,0x33,0x30,0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x31,0x32,0x38,0x2C, - 0x20,0x68,0x20,0x3D,0x20,0x31,0x32,0x38,0x2C,0x20,0x74,0x20,0x3D,0x20,0x30, - 0x2C,0x20,0x69,0x6D,0x67,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D, - 0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x5F, - 0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x70,0x6C,0x61,0x6E,0x65,0x74, - 0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x7D,0x20,0x6C,0x6F,0x67,0x6F,0x20,0x3D, - 0x20,0x7B,0x20,0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D, - 0x20,0x33,0x30,0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x32,0x35,0x36,0x2C,0x20, - 0x68,0x20,0x3D,0x20,0x36,0x34,0x2C,0x20,0x72,0x20,0x3D,0x20,0x30,0x2C,0x20, - 0x69,0x6D,0x67,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67, - 0x65,0x5F,0x62,0x36,0x34,0x28,0x6C,0x6F,0x76,0x65,0x5F,0x62,0x61,0x73,0x65, - 0x36,0x34,0x2C,0x20,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x6E,0x67,0x22,0x29, - 0x20,0x7D,0x20,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,0x38,0x2C,0x20,0x31,0x38,0x2C,0x20,0x31, - 0x38,0x29,0x20,0x73,0x74,0x61,0x72,0x31,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64, - 0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x73,0x74,0x61,0x72, - 0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x73,0x74,0x61,0x72, - 0x31,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x20, + 0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x70,0x29, + 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x7B,0x20,0x70,0x20,0x3D,0x20,0x70, + 0x2C,0x20,0x74,0x30,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E, + 0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x31,0x30,0x2C,0x20,0x74,0x20,0x3D, + 0x20,0x30,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, + 0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65, + 0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x6E,0x29,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x74,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F,0x72,0x20,0x69,0x20, + 0x3D,0x20,0x31,0x2C,0x6E,0x20,0x64,0x6F,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E, + 0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x74,0x2C,0x20,0x63,0x72,0x65,0x61,0x74, + 0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x28,0x6D,0x61,0x74,0x68,0x2E,0x70, + 0x69,0x20,0x2A,0x20,0x32,0x20,0x2F,0x20,0x6E,0x29,0x20,0x2A,0x20,0x69,0x29, + 0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x74,0x20, + 0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74, + 0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C, + 0x6C,0x28,0x64,0x74,0x2C,0x20,0x6B,0x29,0x20,0x6B,0x2E,0x74,0x20,0x3D,0x20, + 0x6B,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, + 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72, + 0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x6B,0x29,0x20,0x6C,0x6F,0x63, + 0x61,0x6C,0x20,0x78,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x78, + 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E, + 0x65,0x74,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x61,0x20,0x3D,0x20, + 0x6B,0x2E,0x70,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C, + 0x20,0x68,0x20,0x3D,0x20,0x32,0x32,0x35,0x20,0x2B,0x20,0x32,0x30,0x20,0x2A, + 0x20,0x28,0x31,0x20,0x2B,0x20,0x6D,0x61,0x74,0x68,0x2E,0x73,0x69,0x6E,0x28, + 0x6B,0x2E,0x74,0x30,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x29,0x29,0x20,0x6C,0x6F, + 0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61, + 0x77,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2C,0x20,0x78,0x2C,0x20,0x79,0x2C, + 0x20,0x61,0x2C,0x20,0x2E,0x37,0x35,0x2C,0x20,0x2E,0x37,0x35,0x2C,0x20,0x36, + 0x34,0x2C,0x20,0x68,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C, + 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74, + 0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20,0x6C,0x6F,0x67,0x6F, + 0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x2B,0x20,0x64, + 0x74,0x20,0x69,0x66,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x3E,0x20,0x33, + 0x36,0x30,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20, + 0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x2D,0x20,0x33,0x36,0x30,0x20, + 0x65,0x6E,0x64,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x20,0x3D,0x20,0x70,0x6C, + 0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, + 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61, + 0x74,0x65,0x5F,0x70,0x6C,0x61,0x6E,0x65,0x74,0x28,0x64,0x74,0x29,0x20,0x70, + 0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65, + 0x74,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74, + 0x2E,0x79,0x20,0x3D,0x20,0x33,0x30,0x30,0x20,0x2B,0x20,0x6D,0x61,0x74,0x68, + 0x2E,0x73,0x69,0x6E,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x29,0x2A, + 0x33,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75, + 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61, + 0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x62,0x36,0x34,0x2C,0x20,0x66,0x69,0x6C, + 0x65,0x6E,0x61,0x6D,0x65,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x69, + 0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,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,0x62,0x36,0x34,0x2C,0x20,0x66,0x69, + 0x6C,0x65,0x6E,0x61,0x6D,0x65,0x2C,0x20,0x22,0x62,0x61,0x73,0x65,0x36,0x34, + 0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x69,0x6D,0x61,0x67,0x65,0x5F, + 0x64,0x61,0x74,0x61,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x69,0x6D,0x61, + 0x67,0x65,0x2E,0x6E,0x65,0x77,0x49,0x6D,0x61,0x67,0x65,0x44,0x61,0x74,0x61, + 0x28,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,0x29,0x20,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,0x69,0x6D,0x61, + 0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x75, + 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x6C,0x6F,0x61, + 0x64,0x28,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x20,0x3D,0x20,0x7B,0x20, + 0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D,0x20,0x33,0x30, + 0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x31,0x32,0x38,0x2C,0x20,0x68,0x20,0x3D, + 0x20,0x31,0x32,0x38,0x2C,0x20,0x74,0x20,0x3D,0x20,0x30,0x2C,0x20,0x69,0x6D, + 0x67,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F, + 0x62,0x36,0x34,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x5F,0x62,0x61,0x73,0x65, + 0x36,0x34,0x2C,0x20,0x22,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x70,0x6E,0x67, + 0x22,0x29,0x20,0x7D,0x20,0x6C,0x6F,0x67,0x6F,0x20,0x3D,0x20,0x7B,0x20,0x78, + 0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D,0x20,0x33,0x30,0x30, + 0x2C,0x20,0x77,0x20,0x3D,0x20,0x32,0x35,0x36,0x2C,0x20,0x68,0x20,0x3D,0x20, + 0x36,0x34,0x2C,0x20,0x72,0x20,0x3D,0x20,0x30,0x2C,0x20,0x69,0x6D,0x67,0x20, 0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36, - 0x34,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34, - 0x2C,0x20,0x22,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2E,0x70,0x6E,0x67,0x22,0x29, - 0x20,0x6C,0x61,0x79,0x65,0x72,0x73,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x6B,0x6E, - 0x6F,0x6C,0x6C,0x73,0x20,0x3D,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B, - 0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x31,0x30,0x29,0x20,0x74,0x61,0x62,0x6C,0x65, + 0x34,0x28,0x6C,0x6F,0x76,0x65,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20, + 0x22,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x7D,0x20,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,0x38,0x2C,0x20,0x31,0x38,0x2C,0x20,0x31,0x38,0x29,0x20,0x73, + 0x74,0x61,0x72,0x31,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61, + 0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x73,0x74,0x61,0x72,0x31,0x5F,0x62,0x61, + 0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x73,0x74,0x61,0x72,0x31,0x2E,0x70,0x6E, + 0x67,0x22,0x29,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x20,0x3D,0x20,0x6C,0x6F, + 0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x6B,0x6E, + 0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x6B, + 0x6E,0x6F,0x6C,0x6C,0x31,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x6C,0x61,0x79, + 0x65,0x72,0x73,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x73, + 0x20,0x3D,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C, + 0x73,0x28,0x31,0x30,0x29,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73, + 0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65, + 0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28, + 0x31,0x30,0x30,0x2C,0x20,0x30,0x2E,0x35,0x2C,0x20,0x30,0x2E,0x35,0x29,0x29, + 0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C, + 0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73, + 0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x37,0x30,0x2C,0x20,0x30, + 0x2E,0x37,0x2C,0x20,0x30,0x2E,0x37,0x29,0x29,0x20,0x74,0x61,0x62,0x6C,0x65, 0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C, 0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61, - 0x79,0x65,0x72,0x28,0x31,0x30,0x30,0x2C,0x20,0x30,0x2E,0x35,0x2C,0x20,0x30, - 0x2E,0x35,0x29,0x29,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65, - 0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65,0x61, - 0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x37, - 0x30,0x2C,0x20,0x30,0x2E,0x37,0x2C,0x20,0x30,0x2E,0x37,0x29,0x29,0x20,0x74, - 0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61,0x79, - 0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61, - 0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x35,0x30,0x2C,0x20,0x31,0x2C,0x20, - 0x31,0x29,0x29,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D, - 0x73,0x65,0x65,0x64,0x28,0x6F,0x73,0x2E,0x74,0x69,0x6D,0x65,0x28,0x29,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x66,0x6F,0x72,0x20, - 0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28, - 0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77, - 0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x76,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E, - 0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x29, - 0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28, - 0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61, - 0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x70,0x6C,0x61,0x6E, - 0x65,0x74,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E, - 0x78,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x2C,0x20,0x30,0x2C, - 0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x77, - 0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x68,0x29,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77, - 0x28,0x6C,0x6F,0x67,0x6F,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x6C,0x6F,0x67,0x6F, - 0x2E,0x78,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x2C,0x20,0x6C,0x6F,0x67, - 0x6F,0x2E,0x72,0x2C,0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x6C,0x6F,0x67,0x6F, - 0x2E,0x77,0x2F,0x32,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x68,0x2F,0x32,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x75,0x70,0x64,0x61,0x74,0x65,0x28,0x64,0x74,0x29,0x20, + 0x79,0x65,0x72,0x28,0x35,0x30,0x2C,0x20,0x31,0x2C,0x20,0x31,0x29,0x29,0x20, + 0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x73,0x65,0x65,0x64, + 0x28,0x6F,0x73,0x2E,0x74,0x69,0x6D,0x65,0x28,0x29,0x29,0x20,0x65,0x6E,0x64, + 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76, + 0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65, + 0x72,0x73,0x29,0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61, + 0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x76,0x29,0x20,0x65,0x6E,0x64,0x20, 0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61, - 0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64,0x6F,0x20, - 0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79, - 0x65,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x66, - 0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69, - 0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x29,0x20,0x64,0x6F,0x20,0x75, - 0x70,0x64,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64,0x74,0x2C, - 0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F, - 0x70,0x6C,0x61,0x6E,0x65,0x74,0x28,0x64,0x74,0x29,0x20,0x75,0x70,0x64,0x61, - 0x74,0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20,0x65,0x6E,0x64, - 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x63,0x6F,0x6E,0x66,0x28,0x74,0x29,0x20,0x74,0x2E,0x74,0x69,0x74,0x6C,0x65, - 0x20,0x3D,0x20,0x22,0x4C,0x4F,0x56,0x45,0x20,0x22,0x20,0x2E,0x2E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x5F,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x5F,0x73,0x74, - 0x72,0x69,0x6E,0x67,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, - 0x20,0x74,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x61,0x75,0x64,0x69, - 0x6F,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x20,0x74,0x2E,0x6D,0x6F,0x64, - 0x75,0x6C,0x65,0x73,0x2E,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20,0x66,0x61, - 0x6C,0x73,0x65,0x20,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,0x20, - 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,0x20,0x65,0x6E,0x64, - 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x64,0x65,0x62,0x75, - 0x67,0x20,0x3D,0x20,0x64,0x65,0x62,0x75,0x67,0x20,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,0x20,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,0x6D,0x73,0x67, - 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,0x20,0x65,0x6E,0x64, - 0x20,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,0x20,0x65,0x72, - 0x72,0x6F,0x72,0x5F,0x70,0x72,0x69,0x6E,0x74,0x65,0x72,0x28,0x6D,0x73,0x67, - 0x2C,0x20,0x32,0x29,0x20,0x69,0x66,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,0x6F, - 0x72,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,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65, + 0x69,0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x29,0x20,0x64,0x6F,0x20, + 0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x76,0x29,0x20,0x65, 0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63, - 0x73,0x2E,0x72,0x65,0x73,0x65,0x74,0x28,0x29,0x20,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,0x20,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,0x31,0x34,0x29,0x20,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,0x20,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,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69, - 0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x65,0x72,0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,0x74,0x61, - 0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x65,0x72,0x72,0x2C, - 0x20,0x6C,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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, - 0x20,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,0x20, - 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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, - 0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28, - 0x29,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, - 0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28,0x29,0x20,0x65, - 0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C, - 0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x77,0x68,0x69, - 0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64,0x6F,0x20,0x65,0x2C,0x20,0x61, - 0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65, - 0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69,0x74,0x28,0x29,0x20,0x69,0x66,0x20, - 0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72, - 0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x65,0x20, - 0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20,0x61,0x6E,0x64,0x20,0x61,0x20,0x3D, - 0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70,0x65,0x22,0x20,0x74,0x68,0x65,0x6E, - 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61, - 0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E, - 0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x65,0x6C,0x65, - 0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x28,0x6D,0x73,0x67,0x29, - 0x20,0x70,0x72,0x69,0x6E,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72,0x6F, - 0x72,0x20,0x68,0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x2C,0x20, - 0x74,0x68,0x65,0x20,0x67,0x61,0x6D,0x65,0x20,0x68,0x61,0x73,0x20,0x62,0x65, - 0x65,0x6E,0x20,0x73,0x74,0x6F,0x70,0x70,0x65,0x64,0x2E,0x22,0x29,0x20,0x69, - 0x66,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,0x6F,0x72,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,0x74,0x68,0x65,0x6E, - 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x52, - 0x65,0x6E,0x64,0x65,0x72,0x54,0x61,0x72,0x67,0x65,0x74,0x28,0x29,0x20,0x6C, + 0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x69, + 0x6D,0x67,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x78,0x2C,0x20,0x70, + 0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x2C,0x20,0x30,0x2C,0x20,0x31,0x2C,0x20, + 0x31,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x77,0x2C,0x20,0x70,0x6C, + 0x61,0x6E,0x65,0x74,0x2E,0x68,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, + 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x6C,0x6F,0x67, + 0x6F,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x78,0x2C,0x20, + 0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x2C, + 0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x77,0x2F,0x32, + 0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x68,0x2F,0x32,0x29,0x20,0x65,0x6E,0x64, + 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x75,0x70,0x64,0x61,0x74,0x65,0x28,0x64,0x74,0x29,0x20,0x66,0x6F,0x72,0x20, + 0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28, + 0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61, + 0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x64, + 0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x6F,0x72,0x20,0x6B, + 0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6B, + 0x6E,0x6F,0x6C,0x6C,0x73,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61,0x74, + 0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20, + 0x65,0x6E,0x64,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x70,0x6C,0x61,0x6E, + 0x65,0x74,0x28,0x64,0x74,0x29,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x6C, + 0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E, + 0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x63,0x6F,0x6E,0x66, + 0x28,0x74,0x29,0x20,0x74,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x22, + 0x4C,0x4F,0x56,0x45,0x20,0x22,0x20,0x2E,0x2E,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x5F,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x5F,0x73,0x74,0x72,0x69,0x6E,0x67, + 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,0x20,0x74,0x2E,0x6D, + 0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x61,0x75,0x64,0x69,0x6F,0x20,0x3D,0x20, + 0x66,0x61,0x6C,0x73,0x65,0x20,0x74,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73, + 0x2E,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x20, + 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,0x20,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,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64, + 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x64,0x65,0x62,0x75,0x67,0x20,0x3D,0x20, + 0x64,0x65,0x62,0x75,0x67,0x20,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,0x20,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,0x6D,0x73,0x67,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,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x65,0x72,0x72,0x6F,0x72,0x5F, + 0x70,0x72,0x69,0x6E,0x74,0x65,0x72,0x28,0x6D,0x73,0x67,0x2C,0x20,0x32,0x29, + 0x20,0x69,0x66,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,0x6F,0x72,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,0x74,0x68, + 0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x6C, 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x72,0x65, 0x73,0x65,0x74,0x28,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70, 0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x42,0x61,0x63,0x6B,0x67,0x72,0x6F, @@ -2005,65 +1939,137 @@ const unsigned char boot_lua[] = 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,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65, - 0x61,0x72,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x72,0x72,0x20, - 0x3D,0x20,0x7B,0x7D,0x20,0x70,0x20,0x3D,0x20,0x73,0x74,0x72,0x69,0x6E,0x67, - 0x2E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72, - 0x6F,0x72,0x20,0x68,0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x20, - 0x74,0x68,0x61,0x74,0x20,0x63,0x61,0x75,0x73,0x65,0x64,0x20,0x25,0x73,0x20, - 0x74,0x6F,0x20,0x73,0x74,0x6F,0x70,0x2E,0x5C,0x6E,0x59,0x6F,0x75,0x20,0x63, - 0x61,0x6E,0x20,0x6E,0x6F,0x74,0x69,0x66,0x79,0x20,0x25,0x73,0x20,0x61,0x62, - 0x6F,0x75,0x74,0x20,0x74,0x68,0x69,0x73,0x25,0x73,0x2E,0x22,0x2C,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x74,0x69, - 0x74,0x6C,0x65,0x20,0x6F,0x72,0x20,0x22,0x74,0x68,0x69,0x73,0x20,0x67,0x61, - 0x6D,0x65,0x22,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65, - 0x61,0x73,0x65,0x2E,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x22, - 0x74,0x68,0x65,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x22,0x2C,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75,0x72,0x6C, - 0x20,0x61,0x6E,0x64,0x20,0x22,0x20,0x61,0x74,0x20,0x22,0x20,0x2E,0x2E,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75, - 0x72,0x6C,0x20,0x6F,0x72,0x20,0x22,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C, - 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28, + 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,0x20, + 0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63, + 0x6C,0x65,0x61,0x72,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x72, + 0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,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,0x20,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,0x20,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,0x20,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,0x20, + 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,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E, + 0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x65,0x72,0x72,0x2C,0x20,0x6C,0x29,0x20, + 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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,0x20,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,0x20,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,0x20,0x6C, + 0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64, + 0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70, + 0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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, + 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E, + 0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x64, + 0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x2C,0x20, + 0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74, + 0x72,0x75,0x65,0x20,0x64,0x6F,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C, + 0x20,0x63,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74, + 0x2E,0x77,0x61,0x69,0x74,0x28,0x29,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D, + 0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72, + 0x6E,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22, + 0x6B,0x70,0x22,0x20,0x61,0x6E,0x64,0x20,0x61,0x20,0x3D,0x3D,0x20,0x22,0x65, + 0x73,0x63,0x61,0x70,0x65,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74, + 0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20, + 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, + 0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x65, + 0x72,0x72,0x68,0x61,0x6E,0x64,0x28,0x6D,0x73,0x67,0x29,0x20,0x70,0x72,0x69, + 0x6E,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72,0x6F,0x72,0x20,0x68,0x61, + 0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20, + 0x67,0x61,0x6D,0x65,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6E,0x20,0x73, + 0x74,0x6F,0x70,0x70,0x65,0x64,0x2E,0x22,0x29,0x20,0x69,0x66,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,0x6F,0x72,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,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74, + 0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, + 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x52,0x65,0x6E,0x64,0x65, + 0x72,0x54,0x61,0x72,0x67,0x65,0x74,0x28,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x72,0x65,0x73,0x65,0x74,0x28, 0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, - 0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73, - 0x65,0x6E,0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28, - 0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62, - 0x2C,0x20,0x63,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20, - 0x64,0x6F,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69, - 0x74,0x28,0x29,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22, - 0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E, - 0x64,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20, - 0x61,0x6E,0x64,0x20,0x61,0x20,0x3D,0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70, - 0x65,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20, - 0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20, - 0x65,0x6E,0x64,0x20,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,0x20,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,0x65,0x6E,0x64,0x20,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,0x6C,0x6F,0x76,0x65,0x2E, - 0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61, - 0x6E,0x64,0x20,0x6F,0x72,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68, - 0x61,0x6E,0x64,0x29,0x20,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,0x65,0x6E,0x64,0x20,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,0x72,0x75,0x6E,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65, - 0x6C,0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x20, - 0x6F,0x72,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68,0x61,0x6E,0x64, - 0x29,0x20,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,0x65,0x6E, - 0x64, + 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,0x20,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,0x31,0x34,0x29,0x20,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,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67, + 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29, + 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x72,0x72,0x20,0x3D,0x20,0x7B,0x7D, + 0x20,0x70,0x20,0x3D,0x20,0x73,0x74,0x72,0x69,0x6E,0x67,0x2E,0x66,0x6F,0x72, + 0x6D,0x61,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72,0x6F,0x72,0x20,0x68, + 0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x20,0x74,0x68,0x61,0x74, + 0x20,0x63,0x61,0x75,0x73,0x65,0x64,0x20,0x25,0x73,0x20,0x74,0x6F,0x20,0x73, + 0x74,0x6F,0x70,0x2E,0x5C,0x6E,0x59,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x6E, + 0x6F,0x74,0x69,0x66,0x79,0x20,0x25,0x73,0x20,0x61,0x62,0x6F,0x75,0x74,0x20, + 0x74,0x68,0x69,0x73,0x25,0x73,0x2E,0x22,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E, + 0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20, + 0x6F,0x72,0x20,0x22,0x74,0x68,0x69,0x73,0x20,0x67,0x61,0x6D,0x65,0x22,0x2C, + 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E, + 0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x22,0x74,0x68,0x65,0x20, + 0x61,0x75,0x74,0x68,0x6F,0x72,0x22,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F, + 0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75,0x72,0x6C,0x20,0x61,0x6E,0x64, + 0x20,0x22,0x20,0x61,0x74,0x20,0x22,0x20,0x2E,0x2E,0x20,0x6C,0x6F,0x76,0x65, + 0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75,0x72,0x6C,0x20,0x6F, + 0x72,0x20,0x22,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E, + 0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F, + 0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65, + 0x61,0x72,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, + 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28, + 0x29,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F, + 0x63,0x61,0x6C,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20, + 0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64,0x6F,0x20,0x65, + 0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D,0x20,0x6C,0x6F,0x76, + 0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69,0x74,0x28,0x29,0x20, + 0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65, + 0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x69,0x66, + 0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20,0x61,0x6E,0x64,0x20, + 0x61,0x20,0x3D,0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70,0x65,0x22,0x20,0x74, + 0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20, + 0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20, + 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,0x20,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,0x65, + 0x6E,0x64,0x20,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,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C, + 0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72, + 0x65,0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x20,0x6F, + 0x72,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x29, + 0x20,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,0x65,0x6E,0x64, + 0x20,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,0x72,0x75, + 0x6E,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73, + 0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x65,0x6C,0x65, + 0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x20,0x6F,0x72,0x20,0x6C, + 0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x29,0x20,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,0x65,0x6E,0x64, }; // [/boot.lua] From d52ba6e564ffadaba9309f72512e4d09ed4d469c Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 15 Jun 2011 13:16:13 +0200 Subject: [PATCH 067/384] Update changelog once again --- changes.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changes.txt b/changes.txt index 8938e49ea..a4320758a 100644 --- a/changes.txt +++ b/changes.txt @@ -8,9 +8,10 @@ LOVE 0.8.0 [Name pending] * Added seek and tell to Source objects. * Added color interpolation to ParticleSystem. * Added alpha masking. - * Added automatic PO2 padding. + * 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. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. From d34d907b001e8b08c12535910927983fdfeff750 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 21 Jun 2011 19:45:00 +0200 Subject: [PATCH 068/384] Rewrite auto.lua Biggest advantages being automatic header+footer generation, minimal code verification and smaller diffs (from now on) --- src/scripts/audio.lua.h | 119 +- src/scripts/auto.lua | 172 +- src/scripts/boot.lua.h | 4176 ++++++------- src/scripts/graphics.lua.h | 11009 ++++++++++++++++------------------- 4 files changed, 7319 insertions(+), 8157 deletions(-) diff --git a/src/scripts/audio.lua.h b/src/scripts/audio.lua.h index 9b9be15c7..79bdded43 100644 --- a/src/scripts/audio.lua.h +++ b/src/scripts/audio.lua.h @@ -24,35 +24,94 @@ namespace love // [audio.lua] const unsigned char audio_lua[] = { - 0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x61, - 0x75,0x64,0x69,0x6F,0x2E,0x6E,0x65,0x77,0x53,0x6F,0x75,0x72,0x63,0x65,0x28, - 0x61,0x2C,0x20,0x62,0x29,0x20,0x69,0x66,0x20,0x74,0x79,0x70,0x65,0x28,0x61, - 0x29,0x20,0x3D,0x3D,0x20,0x22,0x73,0x74,0x72,0x69,0x6E,0x67,0x22,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x61,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,0x28,0x61,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x74,0x79,0x70, - 0x65,0x28,0x61,0x29,0x20,0x3D,0x3D,0x20,0x22,0x75,0x73,0x65,0x72,0x64,0x61, - 0x74,0x61,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x69,0x66,0x20,0x61,0x3A,0x74, - 0x79,0x70,0x65,0x4F,0x66,0x28,0x22,0x46,0x69,0x6C,0x65,0x22,0x29,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x61,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x73,0x6F, - 0x75,0x6E,0x64,0x2E,0x6E,0x65,0x77,0x44,0x65,0x63,0x6F,0x64,0x65,0x72,0x28, - 0x61,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x61,0x3A,0x74,0x79,0x70, - 0x65,0x4F,0x66,0x28,0x22,0x44,0x65,0x63,0x6F,0x64,0x65,0x72,0x22,0x29,0x20, - 0x74,0x68,0x65,0x6E,0x20,0x69,0x66,0x20,0x62,0x20,0x3D,0x3D,0x20,0x22,0x73, - 0x74,0x61,0x74,0x69,0x63,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x61,0x20,0x3D, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x73,0x6F,0x75,0x6E,0x64,0x2E,0x6E,0x65,0x77, - 0x53,0x6F,0x75,0x6E,0x64,0x44,0x61,0x74,0x61,0x28,0x61,0x29,0x20,0x65,0x6E, - 0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x61, - 0x75,0x64,0x69,0x6F,0x2E,0x6E,0x65,0x77,0x53,0x6F,0x75,0x72,0x63,0x65,0x31, - 0x28,0x61,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x61,0x3A,0x74,0x79, - 0x70,0x65,0x4F,0x66,0x28,0x22,0x53,0x6F,0x75,0x6E,0x64,0x44,0x61,0x74,0x61, - 0x22,0x29,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x61,0x75,0x64,0x69,0x6F,0x2E,0x6E,0x65,0x77,0x53, - 0x6F,0x75,0x72,0x63,0x65,0x31,0x28,0x61,0x29,0x20,0x65,0x6E,0x64,0x20,0x65, - 0x6E,0x64,0x20,0x65,0x72,0x72,0x6F,0x72,0x28,0x22,0x4E,0x6F,0x20,0x6D,0x61, - 0x74,0x63,0x68,0x69,0x6E,0x67,0x20,0x6F,0x76,0x65,0x72,0x6C,0x6F,0x61,0x64, - 0x22,0x29,0x20,0x65,0x6E,0x64, -}; -// [/audio.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, 0x31, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a,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,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,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,0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x75, 0x64, 0x69, + 0x6f, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x61, 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, 0x28, 0x61, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x75, 0x73, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x4f, 0x66, 0x28, 0x22, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x61, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x2e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x61, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x4f, 0x66, 0x28, 0x22, 0x44, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x61, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x73, 0x6f, 0x75, 0x6e, 0x64, + 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x28, 0x61, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x75, 0x64, + 0x69, 0x6f, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x31, 0x28, 0x61, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x4f, 0x66, 0x28, 0x22, 0x53, 0x6f, 0x75, + 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x75, 0x64, + 0x69, 0x6f, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x31, 0x28, 0x61, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, +}; // [audio.lua] } // love \ No newline at end of file diff --git a/src/scripts/auto.lua b/src/scripts/auto.lua index 5b70df632..963c4b3d8 100644 --- a/src/scripts/auto.lua +++ b/src/scripts/auto.lua @@ -4,97 +4,113 @@ -- Example: -- lua auto.lua boot graphics -max_width = 15 +local max_width = 18 +local pattern = [[ +/** +* 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. +**/ + +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" - -- Read source Lua file + --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") - local src_data = src_file:read("*a") - -- remove comments - src_data = src_data:gsub("%-%-%[%[.-%-%-%]%]", ""):gsub("%-%-.-\n", "") - -- remove unneeded whitespaces - src_data = src_data:gsub("^%s+",""):gsub("%s*$",""):gsub("%s%s+", " ") - local src_len = #src_data + --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() - local lines = {} - local line = {} - table.insert(lines, line) - - for i=1,src_len do - table.insert(line, string.byte(src_data, i)) - if math.mod(i, max_width) == 0 then - line = {} - table.insert(lines, line) - end - end - - local src_output = "const unsigned char "..cpp_name.."[] = \n{\n" - - for i,line in ipairs(lines) do - local concat = {} - for j,b in ipairs(line) do - table.insert(concat, string.format("0x%02X,", b)) - end - src_output = src_output .. "\t" .. table.concat(concat, "").."\n" - end - - src_output = src_output .. "};" - - local include = true - - -- Read dst - local dst_lines = {} - for line in io.lines(dst) do - - if line == "// ["..src.."]" then - include = false - table.insert(dst_lines, line) - table.insert(dst_lines, src_output) - end - - if line == "// [/"..src.."]" then - include = true - end - - if include then - table.insert(dst_lines, line) - end - end - - local tmp_data = table.concat(dst_lines, "\n") - - -- Overwrite the old file only if they are different. - local dst_file = io.open(dst, "rb") - dst_data = dst_file:read("*a") - dst_file:close() - - if tmp_data == dst_data then - print(name .. ": no change") - else - - local dst_file = io.open(dst, "wb") - dst_file:write(tmp_data) - dst_file:close() - - print(name .. ": updated") - end + --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 - print("Usage: lua auto.lua .. ") -else - for i, v in ipairs(arg) do - local ok, err = pcall(auto, v:gsub("%.lua$","")) - if not ok then - print("cannot update "..v..": " .. err) - end + 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/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 1d9bbaeaa..dfa7a0bed 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -24,2053 +24,2133 @@ namespace love // [boot.lua] const unsigned char boot_lua[] = { - 0x69,0x66,0x20,0x6E,0x6F,0x74,0x20,0x6C,0x6F,0x76,0x65,0x20,0x74,0x68,0x65, - 0x6E,0x20,0x6C,0x6F,0x76,0x65,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x65,0x6E,0x64, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x61,0x74,0x68,0x20,0x3D,0x20,0x7B,0x7D, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x61,0x72,0x67,0x20,0x3D,0x20,0x7B,0x7D,0x20, - 0x61,0x72,0x67,0x76,0x20,0x3D,0x20,0x7B,0x7D,0x20,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, - 0x20,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,0x20,0x65,0x6E,0x64,0x20,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,0x20,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,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6E,0x20,0x70,0x20,0x2E,0x2E,0x20,0x22,0x2F,0x22,0x20,0x65,0x6C,0x73,0x65, - 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x70,0x20,0x65,0x6E,0x64,0x20,0x65, - 0x6E,0x64,0x20,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,0x20,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,0x20,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,0x20,0x72,0x65, - 0x74,0x75,0x72,0x6E,0x20,0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x74,0x72, - 0x75,0x65,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x66, - 0x61,0x6C,0x73,0x65,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x70,0x61,0x74,0x68,0x2E,0x61,0x62,0x73,0x28,0x70,0x29,0x20,0x74, - 0x68,0x65,0x6E,0x20,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,0x20,0x65,0x6E,0x64,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x61,0x20,0x3D,0x20,0x31,0x20, - 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6C,0x61,0x73,0x74,0x20,0x3D,0x20,0x70,0x20, - 0x77,0x68,0x69,0x6C,0x65,0x20,0x61,0x20,0x64,0x6F,0x20,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,0x20,0x69,0x66,0x20,0x61,0x20, - 0x74,0x68,0x65,0x6E,0x20,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, - 0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E, - 0x20,0x6C,0x61,0x73,0x74,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6D, - 0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x68,0x75,0x67,0x65,0x20,0x66,0x6F, - 0x72,0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x70,0x61,0x69,0x72,0x73,0x28, - 0x61,0x29,0x20,0x64,0x6F,0x20,0x69,0x66,0x20,0x6B,0x20,0x3C,0x20,0x6D,0x20, - 0x74,0x68,0x65,0x6E,0x20,0x6D,0x20,0x3D,0x20,0x6B,0x20,0x65,0x6E,0x64,0x20, - 0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x61,0x5B,0x6D,0x5D, - 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x61,0x72,0x67,0x2E,0x6F, - 0x70,0x74,0x69,0x6F,0x6E,0x73,0x20,0x3D,0x20,0x7B,0x20,0x63,0x6F,0x6E,0x73, - 0x6F,0x6C,0x65,0x20,0x3D,0x20,0x7B,0x20,0x61,0x20,0x3D,0x20,0x30,0x20,0x7D, - 0x2C,0x20,0x67,0x61,0x6D,0x65,0x20,0x3D,0x20,0x7B,0x20,0x61,0x20,0x3D,0x20, - 0x31,0x20,0x7D,0x20,0x7D,0x20,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,0x20,0x6D,0x2E, - 0x73,0x65,0x74,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x20,0x69,0x66,0x20,0x6D, - 0x2E,0x61,0x20,0x3E,0x20,0x30,0x20,0x74,0x68,0x65,0x6E,0x20,0x6D,0x2E,0x61, - 0x72,0x67,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F,0x72,0x20,0x6A,0x3D,0x69, - 0x2C,0x69,0x2B,0x6D,0x2E,0x61,0x2D,0x31,0x20,0x64,0x6F,0x20,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,0x20,0x69,0x20,0x3D,0x20,0x6A, - 0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E, - 0x20,0x69,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x67,0x61,0x6D,0x65,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x61,0x72, - 0x67,0x63,0x20,0x3D,0x20,0x23,0x61,0x72,0x67,0x20,0x66,0x6F,0x72,0x20,0x69, - 0x3D,0x31,0x2C,0x61,0x72,0x67,0x63,0x20,0x64,0x6F,0x20,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,0x20,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,0x20,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,0x20,0x65,0x6C,0x73,0x65,0x69, - 0x66,0x20,0x6E,0x6F,0x74,0x20,0x67,0x61,0x6D,0x65,0x20,0x74,0x68,0x65,0x6E, - 0x20,0x67,0x61,0x6D,0x65,0x20,0x3D,0x20,0x69,0x20,0x65,0x6E,0x64,0x20,0x65, - 0x6E,0x64,0x20,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,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,0x2E,0x67,0x61,0x6D,0x65,0x2C,0x20,0x67,0x61,0x6D,0x65, - 0x20,0x6F,0x72,0x20,0x30,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20, - 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, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x68,0x61,0x6E,0x64,0x6C,0x65,0x72,0x73,0x20, - 0x3D,0x20,0x7B,0x20,0x6B,0x70,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, - 0x6F,0x6E,0x20,0x28,0x62,0x2C,0x20,0x75,0x29,0x20,0x69,0x66,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x6B,0x65,0x79,0x70,0x72,0x65,0x73,0x73,0x65,0x64,0x20,0x74, - 0x68,0x65,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,0x20, - 0x65,0x6E,0x64,0x2C,0x20,0x6B,0x72,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74, - 0x69,0x6F,0x6E,0x20,0x28,0x62,0x29,0x20,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,0x6C,0x6F,0x76,0x65,0x2E,0x6B,0x65,0x79,0x72,0x65,0x6C,0x65, - 0x61,0x73,0x65,0x64,0x28,0x62,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64, - 0x2C,0x20,0x6D,0x70,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E, - 0x20,0x28,0x78,0x2C,0x79,0x2C,0x62,0x29,0x20,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,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,0x20,0x65,0x6E,0x64,0x2C,0x20,0x6D,0x72,0x20,0x3D,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x78,0x2C,0x79,0x2C,0x62,0x29, - 0x20,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,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,0x20,0x65,0x6E, - 0x64,0x2C,0x20,0x6A,0x70,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x28,0x6A,0x2C,0x62,0x29,0x20,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,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,0x20,0x65,0x6E,0x64,0x2C,0x20,0x6A,0x72,0x20, - 0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x6A,0x2C,0x62, - 0x29,0x20,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,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,0x20,0x65,0x6E,0x64,0x2C,0x20,0x66,0x20,0x3D,0x20,0x66,0x75,0x6E, - 0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x66,0x29,0x20,0x69,0x66,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x66,0x6F,0x63,0x75,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x66,0x6F,0x63,0x75,0x73,0x28,0x66,0x29,0x20,0x65,0x6E, - 0x64,0x20,0x65,0x6E,0x64,0x2C,0x20,0x71,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63, - 0x74,0x69,0x6F,0x6E,0x20,0x28,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20, - 0x65,0x6E,0x64,0x2C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, - 0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x62,0x6F,0x6F,0x74,0x28,0x29,0x20, - 0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x6C,0x6F,0x76,0x65,0x22,0x29, - 0x20,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,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6C,0x6C,0x5F,0x73, - 0x6F,0x75,0x72,0x63,0x65,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x61, - 0x74,0x68,0x2E,0x67,0x65,0x74,0x66,0x75,0x6C,0x6C,0x28,0x6F,0x2E,0x67,0x61, - 0x6D,0x65,0x2E,0x61,0x72,0x67,0x5B,0x31,0x5D,0x29,0x20,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,0x20,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,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,0x66, - 0x75,0x6C,0x6C,0x5F,0x73,0x6F,0x75,0x72,0x63,0x65,0x29,0x20,0x65,0x6E,0x64, - 0x20,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,0x20, - 0x6E,0x6F,0x5F,0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65,0x20,0x3D,0x20, - 0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6E,0x6F,0x74, - 0x20,0x63,0x61,0x6E,0x5F,0x68,0x61,0x73,0x5F,0x67,0x61,0x6D,0x65,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x6E,0x6F,0x67,0x61,0x6D,0x65, - 0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63, - 0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x69,0x6E,0x69,0x74,0x28, - 0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x63,0x20,0x3D,0x20,0x7B,0x20,0x74, - 0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x22,0x55,0x6E,0x74,0x69,0x74,0x6C,0x65, - 0x64,0x22,0x2C,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x3D,0x20,0x22,0x55, - 0x6E,0x6E,0x61,0x6D,0x65,0x64,0x22,0x2C,0x20,0x76,0x65,0x72,0x73,0x69,0x6F, - 0x6E,0x20,0x3D,0x20,0x30,0x2C,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x3D, - 0x20,0x7B,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3D,0x20,0x38,0x30,0x30,0x2C, - 0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x20,0x36,0x30,0x30,0x2C,0x20, - 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x3D,0x20,0x66,0x61, - 0x6C,0x73,0x65,0x2C,0x20,0x76,0x73,0x79,0x6E,0x63,0x20,0x3D,0x20,0x74,0x72, - 0x75,0x65,0x2C,0x20,0x66,0x73,0x61,0x61,0x20,0x3D,0x20,0x30,0x2C,0x20,0x7D, - 0x2C,0x20,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x20,0x3D,0x20,0x7B,0x20,0x65, - 0x76,0x65,0x6E,0x74,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x6B,0x65, - 0x79,0x62,0x6F,0x61,0x72,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, - 0x6D,0x6F,0x75,0x73,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x74, - 0x69,0x6D,0x65,0x72,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x6A,0x6F, - 0x79,0x73,0x74,0x69,0x63,0x6B,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, - 0x69,0x6D,0x61,0x67,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x67, - 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, - 0x20,0x61,0x75,0x64,0x69,0x6F,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, - 0x70,0x68,0x79,0x73,0x69,0x63,0x73,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C, - 0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20, - 0x66,0x6F,0x6E,0x74,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x74,0x68, - 0x72,0x65,0x61,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x2C,0x20,0x7D,0x2C, - 0x20,0x63,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73, - 0x65,0x2C,0x20,0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20,0x3D,0x20,0x66, - 0x61,0x6C,0x73,0x65,0x2C,0x20,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x3D, - 0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x7D,0x20,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, - 0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x22,0x63,0x6F,0x6E,0x66,0x2E, - 0x6C,0x75,0x61,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x63,0x6F,0x6E,0x66,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x20,0x69,0x66,0x20,0x6E,0x6F,0x74,0x20,0x6F,0x6B,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x70,0x72,0x69,0x6E,0x74,0x28,0x65,0x72,0x72,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x63,0x2E,0x72,0x65, - 0x6C,0x65,0x61,0x73,0x65,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x20,0x3D,0x20,0x7B,0x20,0x74, - 0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x63,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20, - 0x7E,0x3D,0x20,0x22,0x55,0x6E,0x74,0x69,0x74,0x6C,0x65,0x64,0x22,0x20,0x61, - 0x6E,0x64,0x20,0x63,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20,0x6F,0x72,0x20,0x6E, - 0x69,0x6C,0x2C,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x3D,0x20,0x63,0x2E, - 0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x7E,0x3D,0x20,0x22,0x55,0x6E,0x6E,0x61, - 0x6D,0x65,0x64,0x22,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x61,0x75,0x74,0x68, - 0x6F,0x72,0x20,0x6F,0x72,0x20,0x6E,0x69,0x6C,0x2C,0x20,0x75,0x72,0x6C,0x20, - 0x3D,0x20,0x63,0x2E,0x75,0x72,0x6C,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x63,0x2E,0x63,0x6F,0x6E,0x73,0x6F,0x6C,0x65, - 0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x20,0x65,0x6E,0x64,0x20,0x66,0x6F,0x72, - 0x20,0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x70,0x61,0x69,0x72,0x73,0x28,0x63, - 0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73,0x29,0x20,0x64,0x6F,0x20,0x69,0x66, - 0x20,0x76,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65, - 0x28,0x22,0x6C,0x6F,0x76,0x65,0x2E,0x22,0x20,0x2E,0x2E,0x20,0x6B,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x65,0x76,0x65,0x6E,0x74,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x63,0x72,0x65,0x61,0x74,0x65,0x68,0x61,0x6E,0x64,0x6C,0x65,0x72, - 0x73,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x63,0x2E,0x73,0x63, - 0x72,0x65,0x65,0x6E,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x6D,0x6F,0x64,0x75, - 0x6C,0x65,0x73,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68, - 0x65,0x6E,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70, - 0x68,0x69,0x63,0x73,0x2E,0x63,0x68,0x65,0x63,0x6B,0x4D,0x6F,0x64,0x65,0x28, - 0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64,0x74,0x68,0x2C, - 0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x68,0x65,0x69,0x67,0x68, - 0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x66,0x75,0x6C, - 0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x29,0x20,0x6F,0x72,0x20,0x28,0x63,0x2E, - 0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64,0x74,0x68,0x20,0x3D,0x3D, - 0x20,0x30,0x20,0x61,0x6E,0x64,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E, - 0x2E,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3D,0x3D,0x20,0x30,0x29,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x61,0x73,0x73,0x65,0x72,0x74,0x28,0x6C,0x6F,0x76,0x65, - 0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x4D,0x6F, - 0x64,0x65,0x28,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x77,0x69,0x64, - 0x74,0x68,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x68,0x65, - 0x69,0x67,0x68,0x74,0x2C,0x20,0x63,0x2E,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E, - 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x2C,0x20,0x63,0x2E,0x73, - 0x63,0x72,0x65,0x65,0x6E,0x2E,0x76,0x73,0x79,0x6E,0x63,0x2C,0x20,0x63,0x2E, - 0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x66,0x73,0x61,0x61,0x29,0x2C,0x20,0x22, - 0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x73, - 0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x22,0x29,0x20,0x65,0x6C, - 0x73,0x65,0x20,0x65,0x72,0x72,0x6F,0x72,0x28,0x22,0x43,0x6F,0x75,0x6C,0x64, - 0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x73,0x63,0x72,0x65,0x65,0x6E, - 0x20,0x6D,0x6F,0x64,0x65,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x43, - 0x61,0x70,0x74,0x69,0x6F,0x6E,0x28,0x63,0x2E,0x74,0x69,0x74,0x6C,0x65,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x66,0x69, - 0x6C,0x65,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x66,0x69,0x6C,0x65,0x73,0x79,0x73,0x74,0x65,0x6D,0x2E, - 0x73,0x65,0x74,0x52,0x65,0x6C,0x65,0x61,0x73,0x65,0x28,0x63,0x2E,0x72,0x65, - 0x6C,0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x69,0x73,0x5F,0x66,0x75, - 0x73,0x65,0x64,0x5F,0x67,0x61,0x6D,0x65,0x29,0x20,0x69,0x66,0x20,0x63,0x2E, - 0x69,0x64,0x65,0x6E,0x74,0x69,0x74,0x79,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x29,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x72,0x65,0x71,0x75, - 0x69,0x72,0x65,0x28,0x22,0x6D,0x61,0x69,0x6E,0x2E,0x6C,0x75,0x61,0x22,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x6E,0x6F,0x5F, - 0x67,0x61,0x6D,0x65,0x5F,0x63,0x6F,0x64,0x65,0x20,0x74,0x68,0x65,0x6E,0x20, - 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,0x20,0x65,0x6E,0x64,0x20, - 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,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x5F,0x6F,0x70,0x65,0x6E,0x43,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x28,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x75,0x6E,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x64,0x74,0x20,0x3D, - 0x20,0x30,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64, - 0x6F,0x20,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,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,0x20,0x65,0x6E,0x64,0x20,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,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, - 0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61, - 0x72,0x28,0x29,0x20,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,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x20,0x74,0x68,0x65,0x6E, - 0x20,0x66,0x6F,0x72,0x20,0x65,0x2C,0x61,0x2C,0x62,0x2C,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,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20, - 0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,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,0x20,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, - 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x68,0x61,0x6E,0x64,0x6C,0x65,0x72,0x73,0x5B, - 0x65,0x5D,0x28,0x61,0x2C,0x62,0x2C,0x63,0x29,0x20,0x65,0x6E,0x64,0x20,0x65, - 0x6E,0x64,0x20,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,0x31,0x29,0x20,0x65,0x6E,0x64, - 0x20,0x69,0x66,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69, - 0x63,0x73,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, - 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28, - 0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x6E,0x6F, - 0x67,0x61,0x6D,0x65,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6B,0x6E, - 0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B, - 0x5B,0x20,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,0x43,0x37,0x6D,0x6C,0x44,0x51,0x31,0x42,0x4A,0x51,0x30, - 0x4D,0x67,0x55,0x48,0x4A,0x76,0x5A,0x6D,0x6C,0x73,0x5A,0x51,0x41,0x41,0x20, - 0x65,0x41,0x47,0x46,0x56,0x4D,0x39,0x72,0x45,0x30,0x45,0x55,0x2F,0x6A,0x5A, - 0x75,0x71,0x64,0x41,0x69,0x43,0x46,0x70,0x72,0x44,0x72,0x4A,0x34,0x6B,0x43, - 0x4A,0x4A,0x57,0x61,0x74,0x6F,0x52,0x64,0x51,0x32,0x2F,0x52,0x46,0x69,0x61, - 0x77,0x7A,0x62,0x48,0x37,0x5A,0x46,0x6B,0x47,0x51,0x7A,0x53,0x64,0x5A,0x75, - 0x4E,0x75,0x76,0x75,0x4A,0x72,0x57,0x6C,0x69,0x4F,0x54,0x69,0x20,0x30,0x53, - 0x72,0x65,0x52,0x65,0x32,0x68,0x42,0x2F,0x2B,0x41,0x48,0x6E,0x72,0x77,0x5A, - 0x43,0x39,0x4B,0x68,0x56,0x70,0x46,0x4B,0x4E,0x36,0x72,0x4B,0x47,0x4B,0x68, - 0x46,0x79,0x33,0x78,0x7A,0x57,0x35,0x4D,0x74,0x71,0x58,0x71,0x77,0x4D,0x35, - 0x2B,0x38,0x39,0x34,0x33,0x37,0x33,0x31,0x76,0x64,0x74,0x38,0x41,0x44,0x58, - 0x4C,0x53,0x4E,0x50,0x57,0x41,0x42,0x4F,0x51,0x4E,0x20,0x78,0x31,0x4B,0x69, - 0x45,0x57,0x6C,0x73,0x66,0x45,0x4A,0x71,0x2F,0x49,0x67,0x41,0x6A,0x71,0x49, - 0x4A,0x51,0x54,0x51,0x6C,0x56,0x64,0x76,0x73,0x54,0x69,0x51,0x47,0x51,0x59, - 0x4E,0x7A,0x2B,0x58,0x76,0x6E,0x32,0x48,0x6F,0x50,0x67,0x56,0x74,0x57,0x77, - 0x33,0x76,0x37,0x64,0x37,0x4A,0x33,0x72,0x5A,0x72,0x53,0x74,0x70,0x6F,0x48, - 0x68,0x50,0x31,0x41,0x34,0x45,0x65,0x61,0x20,0x32,0x53,0x71,0x77,0x37,0x78, - 0x64,0x78,0x43,0x6C,0x6B,0x53,0x41,0x6F,0x67,0x38,0x33,0x36,0x45,0x70,0x78, - 0x33,0x51,0x49,0x33,0x2B,0x50,0x59,0x38,0x75,0x79,0x50,0x4F,0x55,0x35,0x35, - 0x65,0x4D,0x47,0x31,0x44,0x79,0x73,0x39,0x78,0x46,0x6B,0x69,0x66,0x45,0x41, - 0x31,0x4C,0x63,0x35,0x2F,0x54,0x62,0x68,0x54,0x7A,0x53,0x58,0x54,0x51,0x49, - 0x4E,0x49,0x4F,0x4A,0x54,0x31,0x20,0x63,0x56,0x49,0x2B,0x6E,0x4E,0x65,0x4C, - 0x6C,0x4E,0x63,0x64,0x42,0x32,0x6C,0x75,0x5A,0x73,0x62,0x49,0x45,0x4C,0x31, - 0x50,0x6B,0x4B,0x61,0x37,0x7A,0x4F,0x36,0x72,0x59,0x71,0x47,0x63,0x54,0x76, - 0x59,0x4F,0x6B,0x4C,0x32,0x64,0x39,0x48,0x35,0x4F,0x73,0x39,0x34,0x2B,0x77, - 0x69,0x48,0x43,0x43,0x78,0x6D,0x74,0x50,0x30,0x61,0x34,0x6A,0x5A,0x37,0x31, - 0x6A,0x4E,0x55,0x2F,0x20,0x34,0x6D,0x48,0x68,0x70,0x4F,0x62,0x45,0x68,0x6A, - 0x30,0x63,0x47,0x44,0x58,0x30,0x2B,0x47,0x41,0x56,0x74,0x78,0x71,0x70,0x2B, - 0x44,0x58,0x43,0x46,0x46,0x38,0x51,0x54,0x53,0x65,0x69,0x56,0x48,0x48,0x5A, - 0x4C,0x67,0x33,0x78,0x6D,0x4B,0x37,0x39,0x56,0x76,0x4A,0x4B,0x67,0x6E,0x43, - 0x51,0x4F,0x4D,0x70,0x6B,0x59,0x59,0x42,0x7A,0x57,0x6B,0x68,0x50,0x31,0x30, - 0x78,0x75,0x20,0x2B,0x4C,0x71,0x48,0x42,0x58,0x30,0x6D,0x31,0x78,0x4F,0x76, - 0x34,0x6E,0x64,0x57,0x55,0x65,0x46,0x35,0x6A,0x78,0x4E,0x6E,0x33,0x74,0x54, - 0x64,0x37,0x30,0x58,0x61,0x41,0x71,0x38,0x77,0x44,0x68,0x30,0x4D,0x47,0x67, - 0x79,0x61,0x44,0x55,0x68,0x51,0x45,0x45,0x55,0x45,0x59,0x5A,0x69,0x77,0x55, - 0x45,0x43,0x47,0x50,0x42,0x6F,0x78,0x4E,0x4C,0x4A,0x79,0x50,0x79,0x4F,0x72, - 0x20,0x42,0x68,0x75,0x54,0x65,0x7A,0x4A,0x31,0x4A,0x47,0x71,0x37,0x64,0x47, - 0x4A,0x45,0x73,0x55,0x46,0x37,0x4E,0x74,0x77,0x39,0x74,0x31,0x47,0x6B,0x33, - 0x54,0x7A,0x2B,0x4B,0x43,0x4A,0x78,0x6C,0x45,0x4F,0x31,0x43,0x4A,0x4C,0x38, - 0x51,0x66,0x34,0x71,0x72,0x38,0x6C,0x50,0x35,0x58,0x6E,0x35,0x79,0x31,0x79, - 0x77,0x32,0x46,0x62,0x33,0x6C,0x4B,0x32,0x62,0x6D,0x72,0x72,0x79,0x20,0x34, - 0x44,0x76,0x46,0x35,0x5A,0x6D,0x35,0x47,0x68,0x37,0x58,0x30,0x38,0x6A,0x6A, - 0x63,0x30,0x31,0x65,0x66,0x4A,0x58,0x55,0x64,0x70,0x4E,0x58,0x52,0x35,0x61, - 0x73,0x65,0x58,0x71,0x38,0x6D,0x75,0x77,0x61,0x50,0x2B,0x78,0x58,0x6C,0x7A, - 0x48,0x6D,0x67,0x6A,0x57,0x50,0x78,0x48,0x4F,0x77,0x2B,0x2F,0x45,0x74,0x58, - 0x35,0x58,0x4D,0x6C,0x79,0x6D,0x4D,0x46,0x4D,0x58,0x6A,0x20,0x56,0x66,0x50, - 0x71,0x53,0x34,0x52,0x31,0x57,0x6A,0x45,0x33,0x33,0x35,0x39,0x73,0x66,0x7A, - 0x73,0x39,0x34,0x69,0x37,0x50,0x4C,0x72,0x58,0x57,0x63,0x36,0x32,0x4A,0x69, - 0x7A,0x64,0x57,0x6D,0x35,0x64,0x6E,0x2F,0x57,0x70,0x49,0x2B,0x2B,0x36,0x71, - 0x76,0x4A,0x50,0x6D,0x56,0x66,0x6C,0x50,0x58,0x76,0x58,0x78,0x2F,0x47,0x66, - 0x4E,0x78,0x47,0x50,0x69,0x4B,0x54,0x45,0x6D,0x20,0x64,0x6F,0x72,0x6E,0x49, - 0x59,0x6D,0x58,0x78,0x53,0x37,0x78,0x6B,0x74,0x68,0x4C,0x71,0x77,0x76,0x69, - 0x59,0x47,0x33,0x48,0x43,0x4A,0x32,0x56,0x68,0x69,0x6E,0x53,0x62,0x5A,0x48, - 0x36,0x4A,0x4E,0x56,0x67,0x59,0x4A,0x71,0x38,0x39,0x53,0x39,0x64,0x50,0x31, - 0x74,0x34,0x76,0x55,0x5A,0x2F,0x44,0x50,0x56,0x52,0x6C,0x42,0x6E,0x4D,0x30, - 0x6C,0x53,0x4A,0x39,0x33,0x2F,0x43,0x20,0x4B,0x6D,0x51,0x30,0x6E,0x62,0x6B, - 0x4F,0x62,0x2F,0x71,0x50,0x32,0x38,0x66,0x38,0x46,0x2B,0x54,0x33,0x69,0x75, - 0x65,0x66,0x4B,0x41,0x49,0x76,0x62,0x4F,0x44,0x49,0x6D,0x62,0x70,0x74,0x55, - 0x33,0x48,0x76,0x45,0x4B,0x46,0x6C,0x70,0x57,0x35,0x7A,0x72,0x67,0x49,0x58, - 0x76,0x39,0x46,0x39,0x38,0x4C,0x5A,0x75,0x61,0x36,0x4E,0x2B,0x4F,0x50,0x77, - 0x45,0x57,0x44,0x79,0x72,0x20,0x46,0x71,0x31,0x53,0x4E,0x5A,0x38,0x67,0x76, - 0x41,0x45,0x63,0x64,0x6F,0x64,0x36,0x48,0x75,0x67,0x70,0x6D,0x4E,0x4F,0x57, - 0x6C,0x73,0x30,0x35,0x55,0x6F,0x63,0x73,0x6E,0x35,0x4F,0x36,0x36,0x63,0x70, - 0x69,0x55,0x73,0x78,0x51,0x32,0x30,0x4E,0x53,0x55,0x74,0x63,0x6C,0x31,0x32, - 0x56,0x4C,0x46,0x72,0x4F,0x5A,0x56,0x57,0x4C,0x70,0x64,0x74,0x69,0x5A,0x30, - 0x78,0x31,0x75,0x20,0x48,0x4B,0x45,0x35,0x51,0x76,0x66,0x45,0x70,0x30,0x70, - 0x6C,0x6B,0x2F,0x71,0x76,0x38,0x52,0x47,0x77,0x2F,0x62,0x42,0x53,0x2B,0x66, - 0x6D,0x73,0x55,0x74,0x6C,0x2B,0x54,0x68,0x72,0x57,0x67,0x5A,0x66,0x36,0x62, - 0x38,0x43,0x38,0x2F,0x55,0x58,0x41,0x65,0x49,0x75,0x4A,0x41,0x41,0x41,0x41, - 0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73,0x54,0x41,0x41,0x41, - 0x4C,0x20,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x41,0x41,0x41,0x4B,0x45, - 0x45,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x62,0x61,0x32,0x77,0x55, - 0x31,0x78,0x58,0x48,0x7A,0x2B,0x79,0x75,0x71,0x59,0x33,0x42,0x59,0x4F,0x4D, - 0x51,0x61,0x48,0x69,0x6B,0x78,0x6A,0x7A,0x69,0x4E,0x70,0x41,0x55,0x4D,0x49, - 0x4B,0x6B,0x77,0x71,0x56,0x53,0x68,0x49,0x54,0x55,0x79,0x6C,0x58,0x56,0x20, - 0x56,0x71,0x6F,0x71,0x52,0x61,0x71,0x45,0x43,0x46,0x43,0x70,0x4C,0x53,0x4A, - 0x53,0x50,0x79,0x56,0x52,0x50,0x30,0x51,0x69,0x55,0x6C,0x73,0x56,0x62,0x45, - 0x64,0x52,0x50,0x31,0x53,0x4B,0x2B,0x69,0x47,0x4B,0x57,0x74,0x52,0x55,0x53, - 0x47,0x33,0x56,0x68,0x78,0x49,0x6C,0x63,0x62,0x7A,0x47,0x45,0x46,0x4A,0x6B, - 0x31,0x6D,0x76,0x41,0x42,0x76,0x78,0x65,0x76,0x4C,0x62,0x58,0x20,0x33,0x76, - 0x55,0x2B,0x35,0x2F,0x62,0x63,0x54,0x55,0x31,0x32,0x5A,0x32,0x62,0x78,0x47, - 0x74,0x74,0x6E,0x7A,0x39,0x72,0x6E,0x66,0x74,0x6D,0x39,0x64,0x2B,0x37,0x4D, - 0x4F,0x66,0x64,0x2F,0x66,0x6E,0x76,0x75,0x7A,0x4A,0x32,0x37,0x68,0x6C,0x49, - 0x4B,0x70,0x43,0x78,0x66,0x42,0x56,0x7A,0x4C,0x64,0x2B,0x67,0x79,0x63,0x71, - 0x32,0x41,0x41,0x4C,0x44,0x4D,0x4F,0x52,0x41,0x41,0x20,0x42,0x49,0x42,0x6C, - 0x72,0x73,0x41,0x79,0x48,0x37,0x35,0x6B,0x41,0x41,0x46,0x67,0x6D,0x53,0x75, - 0x77,0x7A,0x49,0x63,0x76,0x47,0x55,0x41,0x41,0x57,0x4F,0x59,0x4B,0x4C,0x50, - 0x50,0x68,0x65,0x35,0x62,0x79,0x2B,0x4E,0x73,0x37,0x6D,0x7A,0x65,0x59,0x62, - 0x6E,0x67,0x65,0x46,0x4F,0x77,0x46,0x51,0x32,0x30,0x48,0x4D,0x4A,0x37,0x45, - 0x38,0x64,0x59,0x41,0x71,0x45,0x72,0x38,0x20,0x7A,0x43,0x77,0x39,0x65,0x43, - 0x79,0x49,0x37,0x64,0x63,0x4D,0x4D,0x47,0x34,0x72,0x55,0x33,0x6E,0x4E,0x31, - 0x66,0x45,0x50,0x44,0x32,0x37,0x36,0x2B,0x58,0x52,0x6D,0x70,0x36,0x58,0x34, - 0x33,0x56,0x68,0x4B,0x4B,0x34,0x47,0x74,0x66,0x62,0x38,0x70,0x63,0x30,0x2B, - 0x56,0x4E,0x49,0x4C,0x68,0x4F,0x71,0x49,0x4D,0x4F,0x41,0x78,0x4B,0x31,0x63, - 0x34,0x76,0x61,0x45,0x59,0x48,0x20,0x43,0x76,0x51,0x2B,0x77,0x6E,0x4F,0x70, - 0x66,0x75,0x66,0x70,0x66,0x38,0x2F,0x76,0x57,0x6A,0x7A,0x50,0x58,0x68,0x49, - 0x41,0x65,0x50,0x31,0x4E,0x6A,0x57,0x44,0x43,0x6A,0x7A,0x48,0x6F,0x6A,0x59, - 0x73,0x6C,0x4D,0x32,0x61,0x47,0x43,0x57,0x57,0x6F,0x64,0x38,0x42,0x30,0x76, - 0x58,0x56,0x67,0x31,0x30,0x73,0x64,0x69,0x32,0x57,0x48,0x2B,0x72,0x70,0x46, - 0x44,0x59,0x43,0x33,0x20,0x75,0x2B,0x57,0x59,0x53,0x70,0x6E,0x6E,0x77,0x49, - 0x41,0x36,0x59,0x75,0x48,0x65,0x4D,0x31,0x50,0x47,0x6D,0x59,0x4E,0x31,0x4A, - 0x32,0x38,0x53,0x32,0x31,0x31,0x77,0x63,0x30,0x55,0x4A,0x51,0x4B,0x76,0x2F, - 0x66,0x4C,0x31,0x62,0x75,0x56,0x37,0x48,0x31,0x31,0x68,0x48,0x46,0x6C,0x79, - 0x52,0x75,0x56,0x33,0x77,0x37,0x52,0x56,0x75,0x38,0x38,0x79,0x7A,0x74,0x54, - 0x38,0x4E,0x20,0x7A,0x4F,0x30,0x30,0x50,0x72,0x32,0x4C,0x43,0x6F,0x42,0x57, - 0x2F,0x35,0x74,0x50,0x75,0x4D,0x33,0x55,0x2B,0x58,0x78,0x54,0x66,0x53,0x49, - 0x56,0x68,0x39,0x42,0x30,0x45,0x4D,0x4C,0x78,0x45,0x45,0x53,0x54,0x59,0x59, - 0x67,0x6C,0x6F,0x68,0x42,0x4C,0x52,0x69,0x46,0x70,0x4A,0x72,0x49,0x69,0x38, - 0x43,0x56,0x50,0x47,0x58,0x68,0x63,0x48,0x6C,0x69,0x35,0x59,0x6A,0x57,0x55, - 0x20,0x65,0x6B,0x71,0x68,0x76,0x48,0x51,0x74,0x72,0x43,0x6D,0x74,0x41,0x73, - 0x50,0x49,0x37,0x79,0x6E,0x5A,0x41,0x47,0x68,0x4A,0x6C,0x63,0x66,0x50,0x46, - 0x4F,0x4E,0x4E,0x59,0x39,0x45,0x41,0x34,0x4F,0x31,0x71,0x4F,0x61,0x48,0x41, - 0x62,0x4D,0x6D,0x4B,0x6E,0x45,0x4E,0x6C,0x4F,0x68,0x47,0x47,0x2B,0x31,0x4D, - 0x44,0x45,0x49,0x79,0x4D,0x77,0x48,0x51,0x38,0x37,0x4E,0x41,0x6A,0x20,0x76, - 0x79,0x59,0x64,0x2F,0x41,0x6F,0x45,0x6F,0x57,0x72,0x6C,0x65,0x6C,0x68,0x58, - 0x76,0x68,0x45,0x38,0x37,0x70,0x4A,0x5A,0x54,0x6A,0x53,0x36,0x58,0x59,0x5A, - 0x36,0x61,0x66,0x2B,0x4F,0x55,0x2F,0x2B,0x61,0x70,0x53,0x4F,0x72,0x77,0x2B, - 0x77,0x42,0x2B,0x4C,0x54,0x33,0x74,0x32,0x74,0x6A,0x30,0x5A,0x49,0x57,0x6E, - 0x4F,0x64,0x2F,0x2B,0x44,0x44,0x6C,0x67,0x70,0x46,0x68,0x20,0x36,0x42,0x2F, - 0x76,0x67,0x58,0x41,0x73,0x39,0x4C,0x42,0x75,0x6A,0x33,0x51,0x4D,0x62,0x77, - 0x43,0x68,0x73,0x72,0x77,0x61,0x4E,0x6C,0x64,0x75,0x68,0x37,0x4B,0x53,0x56, - 0x62,0x4E,0x64,0x34,0x34,0x30,0x44,0x4F,0x30,0x2B,0x39,0x50,0x46,0x73,0x6E, - 0x4C,0x73,0x64,0x5A,0x41,0x2B,0x44,0x74,0x75,0x72,0x41,0x50,0x38,0x2F,0x41, - 0x66,0x63,0x4D,0x2F,0x4B,0x56,0x33,0x4D,0x4A,0x20,0x4E,0x68,0x55,0x64,0x68, - 0x7A,0x76,0x42,0x4C,0x70,0x69,0x4D,0x54,0x65,0x54,0x71,0x73,0x6D,0x44,0x74, - 0x47,0x6F,0x54,0x71,0x56,0x52,0x73,0x52,0x68,0x46,0x70,0x59,0x67,0x56,0x4E, - 0x46,0x72,0x6F,0x4C,0x39,0x50,0x6F,0x34,0x4D,0x42,0x67,0x34,0x33,0x4E,0x4C, - 0x79,0x53,0x7A,0x4E,0x57,0x48,0x53,0x7A,0x74,0x62,0x41,0x44,0x37,0x78,0x58, - 0x57,0x67,0x77,0x4D,0x50,0x67,0x6F,0x20,0x31,0x46,0x59,0x6E,0x73,0x58,0x53, - 0x71,0x76,0x78,0x76,0x30,0x77,0x31,0x69,0x45,0x2F,0x76,0x37,0x4C,0x5A,0x62, - 0x68,0x68,0x51,0x38,0x56,0x6D,0x65,0x47,0x4A,0x4E,0x44,0x62,0x6A,0x64,0x4F, - 0x64,0x62,0x53,0x46,0x4C,0x52,0x35,0x56,0x45,0x6E,0x6A,0x33,0x71,0x65,0x4F, - 0x44,0x7A,0x72,0x35,0x7A,0x36,0x57,0x4E,0x4A,0x51,0x44,0x74,0x2F,0x71,0x5A, - 0x76,0x6D,0x51,0x72,0x65,0x20,0x51,0x5A,0x48,0x57,0x4F,0x51,0x6E,0x56,0x50, - 0x33,0x34,0x4C,0x2B,0x73,0x5A,0x75,0x34,0x77,0x4A,0x66,0x59,0x62,0x65,0x7A, - 0x6C,0x62,0x68,0x4B,0x59,0x4E,0x76,0x36,0x70,0x32,0x46,0x74,0x57,0x62,0x57, - 0x54,0x6D,0x35,0x69,0x38,0x6A,0x4B,0x74,0x4A,0x74,0x2B,0x76,0x6F,0x6F,0x57, - 0x30,0x6E,0x52,0x68,0x77,0x37,0x4D,0x47,0x6A,0x4D,0x37,0x7A,0x61,0x58,0x30, - 0x46,0x47,0x64,0x20,0x39,0x70,0x55,0x79,0x33,0x6B,0x61,0x54,0x74,0x75,0x41, - 0x6E,0x55,0x77,0x6D,0x34,0x4D,0x64,0x51,0x42,0x39,0x38,0x5A,0x75,0x46,0x54, - 0x7A,0x34,0x57,0x70,0x49,0x45,0x50,0x6B,0x33,0x34,0x68,0x71,0x36,0x67,0x50, - 0x39,0x31,0x59,0x73,0x38,0x4F,0x49,0x71,0x36,0x7A,0x50,0x75,0x68,0x4F,0x70, - 0x39,0x33,0x52,0x66,0x72,0x6F,0x56,0x56,0x42,0x76,0x6A,0x34,0x31,0x70,0x76, - 0x72,0x20,0x33,0x63,0x6E,0x55,0x2B,0x79,0x6A,0x57,0x4C,0x71,0x74,0x67,0x73, - 0x65,0x51,0x30,0x42,0x76,0x38,0x79,0x52,0x42,0x4D,0x38,0x6C,0x2B,0x65,0x72, - 0x79,0x68,0x2B,0x44,0x37,0x59,0x2F,0x74,0x79,0x66,0x48,0x6F,0x61,0x44,0x51, - 0x66,0x32,0x48,0x6E,0x79,0x6C,0x48,0x56,0x4D,0x48,0x4F,0x71,0x73,0x4D,0x6F, - 0x41,0x6E,0x61,0x56,0x35,0x30,0x43,0x76,0x35,0x30,0x59,0x67,0x71,0x75,0x20, - 0x39,0x37,0x65,0x78,0x44,0x62,0x34,0x4F,0x5A,0x44,0x41,0x63,0x67,0x42,0x75, - 0x44,0x6C,0x79,0x47,0x6C,0x55,0x67,0x35,0x78,0x56,0x53,0x66,0x62,0x2F,0x45, - 0x30,0x43,0x67,0x49,0x4D,0x79,0x44,0x35,0x72,0x61,0x75,0x70,0x72,0x4F,0x34, - 0x5A,0x78,0x2B,0x36,0x45,0x48,0x44,0x2F,0x37,0x39,0x45,0x45,0x78,0x48,0x6F, - 0x48,0x47,0x6A,0x48,0x64,0x42,0x75,0x33,0x48,0x6D,0x4A,0x58,0x20,0x44,0x38, - 0x58,0x47,0x6F,0x57,0x76,0x34,0x43,0x72,0x36,0x44,0x4D,0x75,0x32,0x2B,0x4B, - 0x62,0x6A,0x51,0x37,0x6D,0x75,0x32,0x6A,0x63,0x2F,0x65,0x6B,0x62,0x61,0x46, - 0x52,0x51,0x62,0x34,0x70,0x4C,0x76,0x35,0x4B,0x52,0x7A,0x32,0x57,0x65,0x76, - 0x51,0x39,0x55,0x71,0x65,0x62,0x37,0x67,0x6A,0x50,0x64,0x64,0x61,0x6A,0x33, - 0x47,0x74,0x68,0x36,0x62,0x48,0x34,0x47,0x62,0x67,0x20,0x76,0x34,0x37,0x75, - 0x6D,0x51,0x62,0x4D,0x75,0x70,0x44,0x6C,0x65,0x4F,0x49,0x69,0x4E,0x72,0x49, - 0x41,0x77,0x47,0x58,0x43,0x37,0x2B,0x31,0x6A,0x56,0x4E,0x41,0x64,0x75,0x4D, - 0x59,0x36,0x37,0x64,0x74,0x39,0x2F,0x72,0x78,0x6C,0x4E,0x49,0x79,0x4C,0x55, - 0x6D,0x4E,0x4F,0x37,0x34,0x6E,0x55,0x62,0x71,0x2B,0x2F,0x2B,0x58,0x79,0x75, - 0x38,0x77,0x72,0x52,0x58,0x6E,0x41,0x41,0x20,0x63,0x71,0x58,0x2B,0x65,0x79, - 0x69,0x67,0x2F,0x6A,0x55,0x56,0x61,0x2B,0x6E,0x44,0x56,0x63,0x6C,0x51,0x31, - 0x4F,0x34,0x2F,0x50,0x68,0x6D,0x63,0x31,0x68,0x74,0x56,0x75,0x49,0x79,0x72, - 0x6F,0x41,0x43,0x38,0x43,0x2B,0x2B,0x36,0x63,0x64,0x58,0x73,0x75,0x46,0x57, - 0x4D,0x53,0x52,0x52,0x75,0x59,0x4C,0x7A,0x58,0x32,0x6C,0x78,0x55,0x64,0x62, - 0x31,0x47,0x6F,0x61,0x63,0x43,0x20,0x70,0x35,0x74,0x43,0x33,0x4B,0x58,0x45, - 0x4A,0x67,0x73,0x55,0x46,0x49,0x43,0x74,0x76,0x68,0x46,0x39,0x34,0x37,0x63, - 0x6D,0x4F,0x37,0x49,0x4B,0x65,0x6B,0x5A,0x76,0x73,0x48,0x6A,0x4F,0x7A,0x2F, - 0x5A,0x72,0x37,0x72,0x55,0x34,0x76,0x6E,0x6E,0x73,0x78,0x7A,0x55,0x4C,0x65, - 0x31,0x48,0x66,0x61,0x2F,0x56,0x64,0x65,0x4E,0x72,0x65,0x54,0x74,0x39,0x53, - 0x55,0x41,0x44,0x77,0x20,0x6F,0x66,0x6B,0x6E,0x31,0x69,0x45,0x50,0x68,0x2B, - 0x35,0x42,0x4A,0x44,0x35,0x6C,0x62,0x53,0x37,0x61,0x2B,0x6D,0x44,0x6F,0x4C, - 0x74,0x37,0x48,0x52,0x47,0x7A,0x2B,0x75,0x38,0x46,0x34,0x7A,0x64,0x5A,0x59, - 0x67,0x49,0x61,0x43,0x41,0x64,0x44,0x6D,0x61,0x7A,0x70,0x75,0x2F,0x66,0x58, - 0x72,0x78,0x36,0x66,0x2B,0x69,0x5A,0x34,0x43,0x79,0x4C,0x42,0x34,0x4A,0x76, - 0x57,0x59,0x20,0x50,0x6C,0x38,0x70,0x7A,0x4C,0x61,0x68,0x39,0x7A,0x52,0x30, - 0x64,0x50,0x35,0x75,0x53,0x33,0x59,0x72,0x66,0x61,0x31,0x67,0x41,0x42,0x67, - 0x47,0x76,0x47,0x67,0x64,0x37,0x73,0x68,0x6B,0x48,0x38,0x53,0x54,0x4D,0x57, - 0x74,0x7A,0x30,0x64,0x65,0x44,0x59,0x64,0x79,0x62,0x67,0x43,0x2B,0x76,0x72, - 0x43,0x58,0x70,0x39,0x76,0x7A,0x43,0x32,0x6B,0x5A,0x64,0x7A,0x2F,0x45,0x71, - 0x20,0x61,0x33,0x48,0x64,0x61,0x4F,0x31,0x73,0x72,0x6E,0x57,0x35,0x34,0x61, - 0x44,0x56,0x79,0x73,0x44,0x45,0x48,0x57,0x74,0x54,0x56,0x6E,0x33,0x6E,0x78, - 0x75,0x64,0x67,0x30,0x37,0x71,0x76,0x34,0x55,0x61,0x4E,0x44,0x54,0x41,0x53, - 0x75,0x67,0x6B,0x39,0x67,0x58,0x59,0x59,0x47,0x50,0x4E,0x6E,0x39,0x58,0x6E, - 0x55,0x79,0x75,0x71,0x79,0x4B,0x74,0x69,0x31,0x38,0x54,0x42,0x73,0x20,0x71, - 0x74,0x71,0x4E,0x64,0x2B,0x39,0x44,0x30,0x44,0x64,0x36,0x48,0x61,0x39,0x2F, - 0x46,0x59,0x47,0x30,0x70,0x2B,0x2B,0x35,0x32,0x74,0x41,0x33,0x68,0x49,0x4F, - 0x68,0x58,0x71,0x68,0x5A,0x5A,0x33,0x32,0x72,0x72,0x62,0x36,0x4E,0x31,0x2F, - 0x72,0x5A,0x58,0x4B,0x2B,0x33,0x6B,0x50,0x30,0x4C,0x38,0x69,0x37,0x41,0x32, - 0x39,0x56,0x30,0x46,0x6C,0x2B,0x64,0x6E,0x4D,0x73,0x63,0x20,0x53,0x43,0x67, - 0x61,0x68,0x45,0x35,0x63,0x53,0x6E,0x55,0x71,0x4B,0x7A,0x77,0x72,0x34,0x62, - 0x76,0x31,0x72,0x38,0x48,0x6A,0x46,0x54,0x74,0x73,0x68,0x2B,0x2F,0x65,0x76, - 0x77,0x4B,0x58,0x50,0x6E,0x31,0x6A,0x58,0x6F,0x48,0x61,0x58,0x39,0x4D,0x49, - 0x68,0x33,0x61,0x38,0x61,0x4C,0x74,0x32,0x4E,0x42,0x47,0x43,0x76,0x33,0x2F, - 0x32,0x61,0x2B,0x68,0x46,0x45,0x4F,0x5A,0x62,0x20,0x33,0x50,0x67,0x4B,0x65, - 0x65,0x2F,0x57,0x42,0x74,0x43,0x76,0x6B,0x6A,0x4F,0x4C,0x71,0x64,0x54,0x75, - 0x67,0x37,0x74,0x4F,0x4F,0x36,0x38,0x63,0x5A,0x58,0x5A,0x63,0x70,0x4F,0x38, - 0x46,0x6D,0x51,0x4C,0x77,0x62,0x64,0x39,0x68,0x36,0x33,0x67,0x43,0x6B,0x77, - 0x50,0x57,0x70,0x6E,0x54,0x39,0x59,0x63,0x48,0x58,0x48,0x62,0x5A,0x55,0x66, - 0x7A,0x30,0x4E,0x68,0x2B,0x37,0x33,0x20,0x4B,0x4F,0x57,0x35,0x48,0x54,0x39, - 0x79,0x44,0x4C,0x36,0x2B,0x56,0x6D,0x6C,0x4A,0x42,0x58,0x78,0x6E,0x37,0x36, - 0x75,0x67,0x4D,0x38,0x39,0x38,0x69,0x33,0x34,0x63,0x31,0x46,0x4F,0x42,0x74, - 0x62,0x67,0x4E,0x34,0x36,0x69,0x31,0x6A,0x62,0x4A,0x65,0x45,0x41,0x44,0x77, - 0x6A,0x78,0x5A,0x48,0x72,0x49,0x50,0x4D,0x74,0x62,0x48,0x44,0x2B,0x73,0x76, - 0x58,0x76,0x30,0x72,0x39,0x20,0x71,0x39,0x65,0x66,0x4D,0x30,0x56,0x6E,0x42, - 0x74,0x31,0x76,0x72,0x68,0x44,0x6F,0x77,0x4F,0x36,0x72,0x2B,0x66,0x37,0x4D, - 0x5A,0x64,0x4B,0x66,0x2B,0x74,0x72,0x44,0x6F,0x65,0x78,0x70,0x35,0x65,0x69, - 0x65,0x6C,0x78,0x63,0x45,0x67,0x6A,0x48,0x63,0x70,0x32,0x67,0x74,0x6D,0x41, - 0x6D,0x66,0x74,0x37,0x5A,0x52,0x31,0x73,0x6E,0x76,0x41,0x64,0x70,0x38,0x4C, - 0x66,0x67,0x33,0x20,0x4C,0x53,0x6A,0x4C,0x48,0x47,0x51,0x6B,0x50,0x6D,0x6E, - 0x62,0x71,0x61,0x75,0x50,0x36,0x39,0x53,0x63,0x6D,0x66,0x5A,0x31,0x59,0x50, - 0x37,0x73,0x66,0x53,0x57,0x64,0x37,0x71,0x32,0x5A,0x51,0x66,0x63,0x37,0x39, - 0x73,0x78,0x5A,0x75,0x48,0x67,0x35,0x76,0x36,0x65,0x72,0x36,0x6C,0x57,0x62, - 0x6F,0x4B,0x48,0x75,0x52,0x4B,0x59,0x62,0x38,0x4C,0x64,0x72,0x35,0x36,0x42, - 0x72,0x20,0x38,0x4B,0x4E,0x30,0x32,0x2B,0x34,0x74,0x4C,0x38,0x41,0x33,0x36, - 0x37,0x35,0x34,0x67,0x61,0x66,0x37,0x6A,0x6B,0x37,0x65,0x77,0x51,0x32,0x6E, - 0x66,0x56,0x6E,0x6E,0x7A,0x4B,0x55,0x79,0x67,0x54,0x75,0x55,0x37,0x63,0x58, - 0x34,0x68,0x72,0x32,0x4E,0x72,0x6F,0x55,0x2B,0x41,0x78,0x6A,0x4B,0x52,0x76, - 0x78,0x45,0x64,0x4E,0x51,0x32,0x59,0x6E,0x31,0x54,0x6C,0x6A,0x6B,0x76,0x20, - 0x36,0x31,0x2F,0x38,0x54,0x50,0x42,0x31,0x5A,0x33,0x31,0x7A,0x70,0x75,0x75, - 0x5A,0x76,0x31,0x59,0x39,0x48,0x58,0x79,0x35,0x30,0x6E,0x36,0x66,0x59,0x4C, - 0x73,0x34,0x4E,0x74,0x54,0x58,0x2F,0x69,0x43,0x64,0x34,0x6D,0x65,0x4F,0x5A, - 0x51,0x5A,0x66,0x74,0x33,0x31,0x32,0x39,0x78,0x2F,0x77,0x6E,0x38,0x36,0x6D, - 0x6D,0x63,0x50,0x70,0x76,0x6E,0x75,0x65,0x50,0x50,0x61,0x67,0x20,0x2F,0x69, - 0x68,0x66,0x39,0x48,0x5A,0x30,0x2F,0x57,0x6F,0x37,0x75,0x36,0x6A,0x4B,0x74, - 0x70,0x76,0x6E,0x36,0x37,0x4C,0x62,0x36,0x47,0x72,0x30,0x41,0x41,0x44,0x73, - 0x73,0x77,0x34,0x76,0x48,0x50,0x30,0x69,0x6E,0x56,0x75,0x50,0x7A,0x64,0x54, - 0x2F,0x65,0x75,0x56,0x58,0x74,0x68,0x73,0x39,0x44,0x63,0x47,0x6C,0x71,0x36, - 0x39,0x6E,0x54,0x51,0x65,0x54,0x30,0x66,0x73,0x7A,0x20,0x70,0x2B,0x54,0x39, - 0x32,0x54,0x33,0x30,0x77,0x59,0x4E,0x66,0x66,0x75,0x5A,0x4A,0x47,0x67,0x4A, - 0x39,0x62,0x4B,0x61,0x45,0x48,0x46,0x4C,0x34,0x7A,0x4C,0x46,0x38,0x50,0x35, - 0x31,0x32,0x4C,0x52,0x74,0x4A,0x34,0x35,0x6C,0x38,0x7A,0x31,0x2F,0x6F,0x66, - 0x75,0x52,0x54,0x67,0x41,0x46,0x71,0x47,0x38,0x35,0x37,0x57,0x53,0x57,0x4B, - 0x75,0x33,0x32,0x73,0x5A,0x52,0x4C,0x54,0x20,0x35,0x56,0x38,0x36,0x58,0x6F, - 0x56,0x74,0x6A,0x39,0x66,0x44,0x72,0x57,0x46,0x76,0x7A,0x73,0x63,0x39,0x33, - 0x65,0x39,0x50,0x62,0x62,0x2B,0x45,0x72,0x36,0x7A,0x66,0x44,0x34,0x48,0x4A, - 0x58,0x74,0x44,0x31,0x66,0x4D,0x6F,0x2F,0x72,0x37,0x66,0x41,0x52,0x47,0x51, - 0x6F,0x33,0x62,0x58,0x39,0x39,0x73,0x57,0x63,0x70,0x2B,0x68,0x2B,0x67,0x64, - 0x42,0x74,0x2F,0x45,0x4E,0x4A,0x20,0x47,0x48,0x77,0x44,0x48,0x2B,0x62,0x73, - 0x6C,0x2B,0x2B,0x42,0x69,0x43,0x30,0x44,0x34,0x4A,0x6D,0x47,0x71,0x32,0x41, - 0x5A,0x67,0x42,0x77,0x41,0x44,0x4C,0x37,0x31,0x59,0x64,0x68,0x78,0x6B,0x55, - 0x51,0x4C,0x71,0x68,0x2B,0x2F,0x38,0x6E,0x6B,0x45,0x30,0x2F,0x50,0x79,0x58, - 0x4F,0x64,0x6D,0x6E,0x54,0x30,0x2B,0x38,0x76,0x39,0x78,0x31,0x72,0x6A,0x70, - 0x66,0x67,0x38,0x44,0x20,0x5A,0x4E,0x59,0x4C,0x57,0x44,0x72,0x45,0x48,0x4A, - 0x61,0x46,0x63,0x54,0x2F,0x68,0x64,0x6B,0x73,0x33,0x73,0x69,0x72,0x70,0x46, - 0x4E,0x44,0x52,0x38,0x64,0x5A,0x4B,0x48,0x46,0x6C,0x46,0x35,0x75,0x68,0x4D, - 0x66,0x44,0x78,0x4B,0x6D,0x63,0x6E,0x4D,0x70,0x69,0x58,0x39,0x50,0x65,0x61, - 0x38,0x30,0x72,0x6D,0x35,0x55,0x49,0x4D,0x6D,0x42,0x53,0x43,0x32,0x31,0x72, - 0x54,0x39,0x20,0x72,0x53,0x5A,0x6C,0x70,0x67,0x6F,0x31,0x39,0x6F,0x4C,0x59, - 0x54,0x53,0x6B,0x37,0x37,0x4A,0x67,0x56,0x62,0x62,0x70,0x51,0x4F,0x55,0x63, - 0x4B,0x67,0x43,0x65,0x5A,0x4C,0x4C,0x63,0x4F,0x7A,0x48,0x51,0x51,0x78,0x4E, - 0x70,0x6E,0x4B,0x64,0x57,0x64,0x67,0x44,0x63,0x41,0x4C,0x4B,0x2F,0x45,0x36, - 0x55,0x5A,0x4D,0x43,0x6B,0x42,0x4B,0x32,0x55,0x6C,0x33,0x45,0x6F,0x52,0x75, - 0x20,0x2B,0x47,0x4B,0x4A,0x46,0x41,0x43,0x52,0x6D,0x35,0x38,0x43,0x41,0x67, - 0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D, - 0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A, - 0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E, - 0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x20,0x41, - 0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36, - 0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61, - 0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49, - 0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41, - 0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x20,0x4E,0x7A,0x39, - 0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73, - 0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70, - 0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43, - 0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71, - 0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x20,0x41,0x67,0x43,0x2F,0x6D, - 0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41, - 0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59, - 0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49, - 0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E, - 0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x20,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43, - 0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67, - 0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71, - 0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69, - 0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43, - 0x2F,0x6D,0x4A,0x42,0x36,0x20,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D, - 0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A, - 0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E, - 0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45, - 0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A, - 0x41,0x43,0x51,0x20,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61, - 0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49, - 0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41, - 0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A, - 0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33, - 0x50,0x20,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70, - 0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43, - 0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71, - 0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A, - 0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x20, - 0x4C,0x79,0x61,0x6B,0x48,0x67,0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59, - 0x41,0x38,0x49,0x73,0x4A,0x71,0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49, - 0x77,0x4A,0x41,0x50,0x78,0x69,0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E, - 0x7A,0x39,0x6A,0x41,0x67,0x43,0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51, - 0x79,0x73,0x33,0x50,0x6D,0x41,0x44,0x41,0x4C,0x79,0x61,0x6B,0x20,0x48,0x67, - 0x6B,0x41,0x70,0x48,0x4C,0x7A,0x4D,0x79,0x59,0x41,0x38,0x49,0x73,0x4A,0x71, - 0x55,0x63,0x43,0x41,0x4B,0x6E,0x63,0x2F,0x49,0x77,0x4A,0x41,0x50,0x78,0x69, - 0x51,0x75,0x71,0x52,0x41,0x45,0x41,0x71,0x4E,0x7A,0x39,0x6A,0x41,0x67,0x43, - 0x2F,0x6D,0x4A,0x42,0x36,0x4A,0x41,0x43,0x51,0x79,0x73,0x33,0x50,0x32,0x50, - 0x38,0x41,0x43,0x2F,0x6B,0x64,0x31,0x2F,0x36,0x61,0x20,0x4B,0x5A,0x63,0x41, - 0x41,0x41,0x41,0x41,0x53,0x55,0x56,0x4F,0x52,0x4B,0x35,0x43,0x59,0x49,0x49, - 0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6C,0x6F,0x76,0x65,0x5F, - 0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x42,0x41,0x43, - 0x41,0x59,0x41,0x41,0x41,0x44,0x31,0x58,0x61,0x6D,0x2B,0x41,0x41,0x41,0x41, - 0x43,0x58,0x42,0x49,0x57,0x58,0x4D,0x41,0x41,0x41,0x73,0x54,0x41,0x41,0x41, - 0x4C,0x45,0x77,0x45,0x41,0x6D,0x70,0x77,0x59,0x20,0x41,0x41,0x41,0x4C,0x79, - 0x30,0x6C,0x45,0x51,0x56,0x52,0x34,0x41,0x65,0x32,0x63,0x6A,0x31,0x58,0x63, - 0x4F,0x68,0x50,0x46,0x58,0x39,0x37,0x35,0x43,0x6E,0x41,0x71,0x69,0x4B,0x6B, - 0x67,0x70,0x6F,0x4B,0x59,0x43,0x6C,0x67,0x71,0x77,0x46,0x54,0x41,0x70,0x67, - 0x4B,0x57,0x43,0x69,0x41,0x56,0x73,0x46,0x54,0x41,0x70,0x67,0x4A,0x4D,0x42, - 0x66,0x47,0x72,0x41,0x4B,0x55,0x43,0x20,0x33,0x45,0x47,0x2B,0x33,0x30,0x33, - 0x73,0x39,0x35,0x54,0x42,0x33,0x6A,0x39,0x67,0x37,0x32,0x36,0x51,0x37,0x6A, - 0x6B,0x33,0x6D,0x68,0x6C,0x4A,0x4D,0x2F,0x4A,0x49,0x6D,0x76,0x58,0x75,0x79, - 0x65,0x48,0x64,0x6A,0x78,0x38,0x2F,0x2F,0x6F,0x71,0x49,0x47,0x59,0x67,0x5A, - 0x43,0x44,0x4D,0x44,0x66,0x34,0x66,0x35,0x32,0x50,0x47,0x70,0x59,0x77,0x5A, - 0x69,0x42,0x70,0x53,0x42,0x20,0x57,0x41,0x44,0x69,0x4F,0x59,0x67,0x5A,0x43, - 0x44,0x67,0x44,0x73,0x51,0x41,0x45,0x76,0x50,0x6E,0x78,0x30,0x57,0x4D,0x47, - 0x59,0x67,0x47,0x49,0x5A,0x79,0x42,0x6D,0x49,0x4F,0x41,0x4D,0x78,0x41,0x49, - 0x51,0x38,0x4F,0x62,0x48,0x52,0x34,0x38,0x5A,0x69,0x41,0x55,0x67,0x6E,0x6F, - 0x47,0x59,0x67,0x59,0x41,0x7A,0x38,0x4C,0x2B,0x41,0x6E,0x2F,0x31,0x50,0x65, - 0x2F,0x53,0x4D,0x20,0x42,0x65,0x66,0x51,0x77,0x52,0x4C,0x57,0x4D,0x4F,0x4B, - 0x76,0x76,0x35,0x51,0x58,0x4D,0x54,0x58,0x4A,0x63,0x4F,0x68,0x69,0x43,0x53, - 0x4E,0x36,0x4D,0x68,0x41,0x4C,0x51,0x45,0x39,0x69,0x39,0x73,0x69,0x63,0x73, - 0x4A,0x59,0x37,0x6D,0x48,0x74,0x72,0x30,0x75,0x55,0x2F,0x67,0x70,0x56,0x6E, - 0x43,0x30,0x6E,0x4D,0x65,0x64,0x68,0x54,0x4F,0x49,0x48,0x4B,0x7A,0x79,0x6F, - 0x73,0x20,0x47,0x50,0x41,0x56,0x7A,0x6C,0x63,0x4E,0x44,0x4B,0x30,0x2F,0x66, - 0x67,0x58,0x59,0x2F,0x59,0x35,0x66,0x73,0x59,0x51,0x6E,0x71,0x50,0x2B,0x52, - 0x70,0x56,0x61,0x36,0x44,0x2B,0x6D,0x35,0x62,0x30,0x44,0x57,0x6F,0x62,0x39, - 0x76,0x57,0x74,0x50,0x31,0x70,0x74,0x57,0x73,0x65,0x57,0x34,0x39,0x65,0x77, - 0x48,0x58,0x75,0x66,0x77,0x4D,0x2B,0x31,0x6B,0x6F,0x62,0x6D,0x67,0x66,0x20, - 0x59,0x51,0x45,0x6A,0x6D,0x67,0x7A,0x45,0x41,0x72,0x44,0x62,0x6F,0x36,0x44, - 0x4C,0x50,0x59,0x58,0x74,0x51,0x56,0x59,0x72,0x58,0x59,0x65,0x31,0x52,0x64, - 0x45,0x4B,0x70,0x74,0x58,0x59,0x33,0x4E,0x6A,0x2B,0x4A,0x46,0x58,0x50,0x2B, - 0x61,0x4E,0x68,0x73,0x63,0x62,0x43,0x5A,0x34,0x7A,0x35,0x42,0x6E,0x50,0x34, - 0x55,0x71,0x52,0x4D,0x56,0x47,0x37,0x76,0x6F,0x66,0x49,0x58,0x20,0x50,0x4E, - 0x37,0x46,0x2F,0x77,0x71,0x38,0x73,0x7A,0x4F,0x67,0x41,0x2F,0x69,0x30,0x4A, - 0x50,0x6F,0x42,0x66,0x51,0x37,0x71,0x6B,0x76,0x54,0x68,0x6B,0x6F,0x35,0x5A, - 0x58,0x2B,0x65,0x65,0x32,0x78,0x39,0x5A,0x58,0x39,0x71,0x73,0x73,0x61,0x5A, - 0x39,0x33,0x38,0x69,0x32,0x55,0x5A,0x37,0x75,0x59,0x47,0x34,0x37,0x47,0x72, - 0x32,0x69,0x4C,0x65,0x46,0x33,0x4B,0x46,0x6C,0x49,0x20,0x47,0x33,0x36,0x69, - 0x7A,0x57,0x45,0x58,0x46,0x50,0x4D,0x49,0x74,0x6E,0x4F,0x36,0x78,0x72,0x78, - 0x35,0x57,0x2F,0x77,0x4E,0x59,0x48,0x64,0x62,0x6E,0x4B,0x30,0x49,0x6E,0x64, - 0x4C,0x76,0x6F,0x41,0x35,0x71,0x41,0x72,0x74,0x51,0x64,0x68,0x6E,0x2F,0x41, - 0x4A,0x75,0x65,0x50,0x56,0x31,0x6A,0x6E,0x58,0x70,0x75,0x66,0x56,0x70,0x72, - 0x76,0x4D,0x55,0x63,0x77,0x79,0x56,0x30,0x20,0x63,0x42,0x6C,0x53,0x4F,0x67, - 0x74,0x34,0x44,0x76,0x30,0x38,0x74,0x72,0x36,0x44,0x4C,0x67,0x4A,0x2F,0x6B, - 0x35,0x53,0x49,0x33,0x57,0x53,0x67,0x58,0x6A,0x50,0x73,0x6C,0x35,0x35,0x78, - 0x46,0x66,0x61,0x79,0x70,0x32,0x2F,0x66,0x7A,0x62,0x6C,0x5A,0x34,0x4D,0x4C, - 0x6F,0x72,0x58,0x71,0x44,0x6B,0x4C,0x56,0x4B,0x30,0x2B,0x71,0x35,0x44,0x2B, - 0x45,0x5A,0x64,0x48,0x41,0x56,0x20,0x48,0x41,0x4E,0x6D,0x38,0x41,0x44,0x61, - 0x4F,0x41,0x6B,0x32,0x78,0x51,0x67,0x57,0x73,0x51,0x44,0x73,0x62,0x75,0x74, - 0x31,0x6B,0x4D,0x55,0x75,0x4F,0x49,0x78,0x6C,0x30,0x7A,0x47,0x6A,0x31,0x53, - 0x64,0x64,0x33,0x65,0x68,0x71,0x53,0x71,0x68,0x50,0x72,0x6B,0x32,0x51,0x4D, - 0x7A,0x6A,0x64,0x5A,0x4D,0x4B,0x49,0x59,0x30,0x2B,0x4E,0x62,0x2F,0x31,0x43, - 0x62,0x7A,0x48,0x46,0x20,0x4D,0x44,0x46,0x47,0x35,0x55,0x76,0x50,0x72,0x58, - 0x5A,0x54,0x31,0x45,0x77,0x34,0x67,0x58,0x4D,0x7A,0x4D,0x55,0x4F,0x66,0x47, - 0x56,0x73,0x77,0x61,0x76,0x77,0x4E,0x59,0x4C,0x64,0x62,0x72,0x63,0x4F,0x6E, - 0x37,0x37,0x65,0x70,0x74,0x77,0x79,0x48,0x72,0x49,0x50,0x61,0x64,0x63,0x68, - 0x54,0x37,0x41,0x35,0x75,0x69,0x6D,0x39,0x4D,0x55,0x4B,0x77,0x61,0x36,0x74, - 0x50,0x54,0x20,0x77,0x56,0x30,0x68,0x49,0x66,0x43,0x54,0x43,0x66,0x34,0x65, - 0x58,0x57,0x74,0x72,0x6F,0x54,0x47,0x50,0x55,0x47,0x32,0x4C,0x43,0x6B,0x47, - 0x58,0x33,0x78,0x2F,0x58,0x39,0x6D,0x33,0x61,0x36,0x6C,0x4F,0x2F,0x38,0x43, - 0x62,0x4A,0x70,0x39,0x59,0x51,0x48,0x47,0x49,0x42,0x32,0x49,0x38,0x74,0x6E, - 0x37,0x43,0x4D,0x44,0x44,0x71,0x34,0x67,0x44,0x71,0x51,0x51,0x79,0x48,0x48, - 0x20,0x30,0x62,0x33,0x6E,0x72,0x45,0x54,0x57,0x52,0x64,0x6F,0x56,0x43,0x67, - 0x4C,0x72,0x41,0x72,0x62,0x51,0x38,0x36,0x72,0x67,0x2B,0x65,0x69,0x36,0x6F, - 0x41,0x63,0x4D,0x47,0x43,0x6F,0x76,0x43,0x62,0x34,0x65,0x6F,0x64,0x6F,0x57, - 0x79,0x6B,0x6E,0x5A,0x4B,0x71,0x47,0x30,0x38,0x55,0x66,0x41,0x2F,0x64,0x68, - 0x70,0x58,0x51,0x4A,0x52,0x53,0x4F,0x45,0x45,0x66,0x6D,0x70,0x6B,0x20,0x48, - 0x64,0x49,0x4D,0x43,0x75,0x58,0x50,0x66,0x33,0x2B,0x39,0x48,0x54,0x77,0x30, - 0x65,0x74,0x33,0x59,0x2B,0x68,0x72,0x62,0x6E,0x7A,0x4E,0x77,0x41,0x68,0x64, - 0x39,0x45,0x30,0x61,0x32,0x48,0x78,0x76,0x2F,0x65,0x67,0x34,0x66,0x43,0x59, - 0x72,0x57,0x35,0x2B,0x4D,0x7A,0x53,0x75,0x30,0x62,0x58,0x69,0x6E,0x4C,0x31, - 0x78,0x78,0x4F,0x50,0x54,0x38,0x35,0x63,0x75,0x6E,0x70,0x20,0x51,0x59,0x6A, - 0x78,0x44,0x57,0x42,0x2F,0x74,0x72,0x6C,0x67,0x4B,0x65,0x63,0x77,0x32,0x33, - 0x42,0x4A,0x63,0x38,0x62,0x66,0x77,0x68,0x4C,0x32,0x34,0x59,0x36,0x4F,0x69, - 0x64,0x65,0x70,0x43,0x33,0x41,0x41,0x31,0x57,0x34,0x62,0x50,0x30,0x78,0x41, - 0x72,0x63,0x4E,0x35,0x74,0x67,0x4A,0x5A,0x62,0x77,0x41,0x74,0x48,0x49,0x4C, - 0x47,0x44,0x49,0x30,0x70,0x44,0x71,0x38,0x38,0x20,0x70,0x35,0x66,0x49,0x4D, - 0x30,0x38,0x50,0x51,0x6F,0x77,0x2F,0x41,0x75,0x35,0x2B,0x6D,0x33,0x55,0x78, - 0x39,0x54,0x71,0x71,0x51,0x35,0x2B,0x39,0x59,0x44,0x6B,0x46,0x63,0x2B,0x36, - 0x68,0x4C,0x6E,0x6B,0x4B,0x75,0x32,0x41,0x2F,0x51,0x52,0x4D,0x47,0x58,0x58, - 0x51,0x4E,0x48,0x4E,0x6D,0x6D,0x5A,0x2F,0x56,0x52,0x6F,0x54,0x6A,0x66,0x67, - 0x48,0x78,0x73,0x39,0x43,0x39,0x47,0x20,0x48,0x30,0x70,0x56,0x44,0x6F,0x4A, - 0x48,0x4C,0x41,0x43,0x37,0x4F,0x77,0x49,0x36,0x67,0x4C,0x71,0x30,0x79,0x79, - 0x37,0x75,0x4A,0x71,0x76,0x54,0x35,0x66,0x6F,0x47,0x69,0x34,0x35,0x4A,0x44, - 0x70,0x75,0x39,0x53,0x46,0x4E,0x73,0x4B,0x64,0x77,0x6D,0x37,0x4F,0x55,0x75, - 0x4F,0x34,0x4C,0x72,0x4F,0x58,0x77,0x73,0x66,0x47,0x56,0x41,0x2B,0x65,0x4F, - 0x41,0x76,0x76,0x35,0x59,0x20,0x56,0x2F,0x45,0x72,0x77,0x47,0x36,0x32,0x4C, - 0x69,0x47,0x73,0x50,0x72,0x57,0x7A,0x6E,0x76,0x41,0x36,0x39,0x41,0x2B,0x77, - 0x67,0x69,0x58,0x30,0x6B,0x61,0x4E,0x6F,0x33,0x6D,0x6E,0x54,0x30,0x6A,0x7A, - 0x44,0x47,0x5A,0x62,0x35,0x4D,0x2B,0x75,0x76,0x4E,0x34,0x33,0x55,0x73,0x35, - 0x66,0x49,0x52,0x35,0x34,0x2B,0x74,0x76,0x68,0x45,0x67,0x4D,0x51,0x4C,0x63, - 0x6F,0x69,0x73,0x20,0x5A,0x32,0x79,0x68,0x35,0x31,0x49,0x52,0x61,0x36,0x45, - 0x2B,0x6A,0x52,0x6B,0x61,0x4E,0x6F,0x37,0x38,0x4B,0x77,0x2B,0x6C,0x68,0x4B, - 0x43,0x67,0x2F,0x77,0x6F,0x63,0x47,0x42,0x4F,0x65,0x64,0x77,0x70,0x6E,0x4D, - 0x4E,0x33,0x42,0x73,0x79,0x76,0x2B,0x4E,0x32,0x6A,0x78,0x68,0x45,0x46,0x72, - 0x55,0x76,0x2B,0x36,0x65,0x36,0x4C,0x31,0x33,0x38,0x45,0x75,0x46,0x42,0x69, - 0x74,0x20,0x6E,0x37,0x78,0x6A,0x59,0x4E,0x63,0x34,0x4F,0x32,0x38,0x49,0x33, - 0x63,0x5A,0x2B,0x58,0x47,0x4E,0x39,0x4E,0x78,0x31,0x6A,0x68,0x6C,0x69,0x4C, - 0x7A,0x58,0x2F,0x58,0x57,0x6F,0x61,0x49,0x73,0x2F,0x63,0x2B,0x51,0x76,0x77, - 0x4B,0x63,0x45,0x57,0x46,0x46,0x2F,0x55,0x64,0x32,0x50,0x2B,0x30,0x32,0x56, - 0x62,0x68,0x37,0x2F,0x72,0x6B,0x4C,0x77,0x6D,0x75,0x54,0x37,0x6F,0x5A,0x20, - 0x72,0x4F,0x47,0x36,0x63,0x41,0x77,0x38,0x61,0x57,0x6A,0x6E,0x33,0x57,0x44, - 0x50,0x6F,0x59,0x38,0x53,0x5A,0x65,0x45,0x62,0x6B,0x4A,0x57,0x4C,0x78,0x4E, - 0x6A,0x47,0x55,0x49,0x2B,0x4E,0x30,0x39,0x4C,0x6F,0x55,0x6E,0x4E,0x6A,0x2B, - 0x32,0x37,0x30,0x49,0x56,0x54,0x6C,0x4A,0x54,0x4F,0x4F,0x62,0x6F,0x30,0x65, - 0x6A,0x42,0x70,0x69,0x41,0x5A,0x68,0x34,0x75,0x37,0x75,0x4E,0x20,0x67,0x2B, - 0x2B,0x46,0x2B,0x33,0x6E,0x42,0x37,0x65,0x47,0x62,0x4D,0x30,0x43,0x76,0x6E, - 0x77,0x36,0x2B,0x46,0x41,0x73,0x6D,0x79,0x6B,0x64,0x74,0x48,0x4F,0x69,0x77, - 0x32,0x32,0x66,0x38,0x62,0x4D,0x61,0x70,0x2F,0x38,0x4C,0x4D,0x47,0x30,0x4F, - 0x64,0x47,0x4B,0x64,0x66,0x6A,0x54,0x36,0x32,0x71,0x75,0x64,0x55,0x50,0x67, - 0x6F,0x54,0x71,0x45,0x4B,0x66,0x47,0x56,0x73,0x77,0x20,0x61,0x6D,0x67,0x46, - 0x51,0x49,0x64,0x41,0x62,0x4F,0x46,0x61,0x59,0x51,0x74,0x74,0x53,0x67,0x78, - 0x37,0x30,0x65,0x62,0x59,0x7A,0x75,0x41,0x51,0x30,0x45,0x46,0x57,0x45,0x66, - 0x43,0x52,0x6F,0x6B,0x78,0x39,0x41,0x37,0x4B,0x44,0x58,0x34,0x78,0x4E,0x59, - 0x7A,0x4A,0x6A,0x47,0x31,0x4B,0x56,0x37,0x39,0x52,0x7A,0x57,0x43,0x4D,0x76, - 0x50,0x48,0x31,0x73,0x55,0x66,0x48,0x76,0x20,0x59,0x57,0x45,0x43,0x61,0x52, - 0x31,0x36,0x67,0x77,0x6F,0x57,0x6F,0x52,0x55,0x41,0x48,0x51,0x51,0x66,0x7A, - 0x6C,0x64,0x47,0x6C,0x75,0x33,0x6C,0x56,0x32,0x78,0x39,0x47,0x67,0x2B,0x4A, - 0x43,0x6D,0x65,0x58,0x78,0x75,0x45,0x35,0x65,0x6D,0x4A,0x73,0x4D,0x33,0x53, - 0x4E,0x39,0x61,0x46,0x50,0x78,0x37,0x46,0x77,0x61,0x68,0x77,0x76,0x6A,0x4E, - 0x36,0x71,0x64,0x53,0x73,0x4D,0x20,0x31,0x4B,0x62,0x34,0x30,0x58,0x50,0x70, - 0x71,0x31,0x34,0x47,0x66,0x53,0x69,0x57,0x43,0x71,0x62,0x7A,0x6A,0x61,0x48, - 0x4A,0x6F,0x52,0x57,0x41,0x31,0x47,0x7A,0x77,0x67,0x39,0x48,0x48,0x55,0x68, - 0x4D,0x63,0x46,0x38,0x62,0x35,0x47,0x66,0x72,0x51,0x42,0x31,0x34,0x68,0x5A, - 0x74,0x44,0x42,0x46,0x6C,0x32,0x78,0x31,0x57,0x65,0x4C,0x54,0x34,0x5A,0x74, - 0x32,0x6B,0x34,0x61,0x20,0x75,0x4A,0x30,0x59,0x66,0x31,0x2B,0x4E,0x33,0x71, - 0x70,0x56,0x4B,0x7A,0x54,0x74,0x42,0x36,0x4F,0x76,0x71,0x2B,0x70,0x5A,0x64, - 0x50,0x45,0x66,0x59,0x51,0x45,0x74,0x46,0x45,0x65,0x58,0x33,0x38,0x61,0x7A, - 0x34,0x39,0x36,0x38,0x48,0x6E,0x6F,0x42,0x32,0x4E,0x59,0x47,0x46,0x79,0x61, - 0x51,0x44,0x6C,0x35,0x70,0x62,0x45,0x4F,0x71,0x6C,0x38,0x62,0x5A,0x71,0x64, - 0x47,0x6C,0x20,0x6C,0x6E,0x41,0x4F,0x66,0x56,0x79,0x67,0x70,0x4C,0x35,0x68, - 0x41,0x48,0x6C,0x69,0x66,0x4E,0x62,0x6F,0x69,0x78,0x36,0x2F,0x7A,0x74,0x68, - 0x7A,0x6F,0x36,0x39,0x53,0x4D,0x77,0x62,0x6F,0x30,0x31,0x34,0x73,0x59,0x42, - 0x65,0x75,0x4D,0x63,0x62,0x4C,0x33,0x32,0x51,0x6D,0x74,0x41,0x4A,0x67,0x44, - 0x30,0x52,0x70,0x44,0x53,0x50,0x70,0x6E,0x34,0x7A,0x66,0x57,0x36,0x4D,0x50, - 0x20,0x72,0x64,0x6F,0x4C,0x70,0x6F,0x75,0x52,0x64,0x67,0x54,0x52,0x57,0x30, - 0x44,0x74,0x32,0x52,0x50,0x6B,0x4B,0x30,0x38,0x66,0x51,0x6A,0x77,0x32,0x54, - 0x75,0x7A,0x61,0x2F,0x47,0x36,0x48,0x49,0x72,0x5A,0x49,0x45,0x62,0x54,0x32, - 0x64,0x58,0x48,0x48,0x77,0x4C,0x37,0x78,0x46,0x58,0x32,0x36,0x2B,0x50,0x61, - 0x5A,0x31,0x2F,0x58,0x39,0x4A,0x73,0x65,0x46,0x56,0x67,0x41,0x2B,0x20,0x37, - 0x6D,0x67,0x58,0x63,0x78,0x4E,0x33,0x32,0x53,0x55,0x77,0x51,0x31,0x2B,0x6B, - 0x31,0x73,0x79,0x79,0x4D,0x62,0x49,0x4F,0x54,0x78,0x70,0x6E,0x76,0x77,0x70, - 0x4D,0x73,0x49,0x6C,0x44,0x49,0x4D,0x47,0x4A,0x39,0x64,0x58,0x33,0x2B,0x74, - 0x2F,0x47,0x4B,0x31,0x75,0x68,0x61,0x63,0x2B,0x4E,0x76,0x71,0x6E,0x71,0x6D, - 0x48,0x41,0x47,0x44,0x32,0x45,0x4A,0x49,0x37,0x77,0x4D,0x20,0x68,0x46,0x59, - 0x41,0x64,0x43,0x43,0x33,0x44,0x63,0x58,0x30,0x34,0x39,0x62,0x6F,0x62,0x67, - 0x75,0x4C,0x65,0x44,0x41,0x78,0x4D,0x71,0x4F,0x33,0x36,0x68,0x79,0x68,0x62, - 0x4A,0x57,0x6D,0x76,0x61,0x48,0x31,0x31,0x32,0x79,0x36,0x31,0x31,0x59,0x6E, - 0x78,0x6F,0x39,0x44,0x58,0x36,0x79,0x59,0x66,0x57,0x76,0x36,0x43,0x2F,0x54, - 0x55,0x32,0x50,0x72,0x55,0x53,0x36,0x39,0x44,0x20,0x63,0x59,0x37,0x67,0x41, - 0x5A,0x7A,0x44,0x69,0x49,0x34,0x4D,0x68,0x46,0x59,0x41,0x4F,0x6C,0x49,0x77, - 0x75,0x69,0x6B,0x7A,0x45,0x53,0x71,0x6A,0x6A,0x36,0x58,0x61,0x4F,0x4D,0x76, - 0x65,0x66,0x73,0x35,0x59,0x52,0x4F,0x30,0x74,0x4A,0x45,0x46,0x57,0x45,0x58, - 0x67,0x74,0x54,0x6F,0x32,0x44,0x68,0x64,0x47,0x37,0x31,0x42,0x4B,0x6A,0x4D, - 0x78,0x31,0x58,0x52,0x75,0x39,0x54,0x20,0x35,0x33,0x53,0x38,0x61,0x33,0x68, - 0x43,0x57,0x38,0x4B,0x49,0x4A,0x52,0x6D,0x49,0x42,0x57,0x42,0x4A,0x63,0x74, - 0x35,0x59,0x6C,0x79,0x35,0x31,0x48,0x78,0x77,0x64,0x6C,0x36,0x5A,0x7A,0x67, - 0x69,0x36,0x2B,0x46,0x43,0x6B,0x54,0x63,0x7A,0x50,0x35,0x69,0x39,0x48,0x37, - 0x31,0x4D,0x2B,0x6D,0x51,0x2B,0x73,0x6F,0x6A,0x47,0x30,0x49,0x4E,0x63,0x57, - 0x4A,0x69,0x6F,0x73,0x34,0x20,0x68,0x51,0x6B,0x4D,0x43,0x71,0x45,0x56,0x67, - 0x49,0x63,0x39,0x32,0x4E,0x31,0x71,0x53,0x32,0x73,0x6F,0x4E,0x34,0x78,0x7A, - 0x7A,0x58,0x67,0x37,0x52,0x32,0x38,0x42,0x4B,0x58,0x77,0x4A,0x7A,0x73,0x32, - 0x6B,0x45,0x74,0x30,0x5A,0x57,0x35,0x2B,0x36,0x6F,0x4B,0x4D,0x30,0x6E,0x56, - 0x70,0x4C,0x5A,0x6D,0x79,0x76,0x55,0x65,0x56,0x4C,0x61,0x31,0x52,0x52,0x2B, - 0x67,0x6F,0x56,0x20,0x55,0x34,0x55,0x67,0x67,0x63,0x45,0x67,0x74,0x41,0x4A, - 0x67,0x4E,0x33,0x62,0x49,0x41,0x32,0x56,0x39,0x39,0x2B,0x6E,0x62,0x69,0x70, - 0x6E,0x32,0x4C,0x57,0x43,0x4A,0x2F,0x59,0x79,0x2B,0x32,0x75,0x76,0x58,0x5A, - 0x58,0x6A,0x4A,0x56,0x77,0x48,0x4E,0x4B,0x7A,0x77,0x2F,0x45,0x6D,0x2B,0x4E, - 0x76,0x6B,0x71,0x31,0x61,0x39,0x48,0x34,0x65,0x7A,0x68,0x5A,0x4E,0x58,0x48, - 0x4E,0x20,0x66,0x6C,0x33,0x2B,0x53,0x33,0x67,0x48,0x74,0x64,0x35,0x57,0x6E, - 0x79,0x49,0x48,0x67,0x39,0x41,0x4B,0x51,0x47,0x31,0x32,0x56,0x68,0x73,0x2F, - 0x4E,0x74,0x7A,0x59,0x41,0x58,0x72,0x38,0x70,0x7A,0x33,0x32,0x5A,0x57,0x5A, - 0x48,0x70,0x79,0x36,0x46,0x6A,0x78,0x78,0x6C,0x35,0x68,0x76,0x57,0x6B,0x43, - 0x65,0x4D,0x38,0x58,0x50,0x72,0x30,0x4F,0x64,0x77,0x45,0x7A,0x67,0x47,0x20, - 0x6E,0x35,0x67,0x4A,0x38,0x71,0x6B,0x4C,0x4F,0x34,0x4F,0x2B,0x66,0x39,0x53, - 0x4E,0x6F,0x66,0x6B,0x31,0x72,0x4F,0x41,0x6E,0x2B,0x42,0x30,0x36,0x2B,0x41, - 0x45,0x47,0x67,0x39,0x41,0x4B,0x67,0x44,0x62,0x62,0x68,0x7A,0x5A,0x2B,0x62, - 0x44,0x67,0x54,0x49,0x44,0x66,0x36,0x57,0x47,0x70,0x71,0x48,0x4E,0x74,0x6E, - 0x4E,0x39,0x33,0x2F,0x71,0x74,0x64,0x49,0x35,0x62,0x2F,0x61,0x20,0x4C,0x2B, - 0x47,0x43,0x4A,0x6A,0x4F,0x32,0x5A,0x61,0x72,0x47,0x2B,0x37,0x6A,0x31,0x6C, - 0x51,0x33,0x6B,0x6B,0x72,0x46,0x6E,0x48,0x65,0x50,0x6C,0x2F,0x78,0x48,0x4F, - 0x34,0x4B,0x70,0x31,0x35,0x59,0x77,0x70,0x34,0x41,0x32,0x38,0x68,0x31,0x4E, - 0x6F,0x6F,0x61,0x4C,0x33,0x73,0x54,0x45,0x6D,0x74,0x76,0x4D,0x74,0x36,0x36, - 0x48,0x39,0x51,0x52,0x42,0x74,0x37,0x70,0x4F,0x33,0x20,0x6F,0x54,0x58,0x79, - 0x65,0x30,0x38,0x66,0x53,0x39,0x54,0x42,0x79,0x7A,0x33,0x6E,0x52,0x38,0x69, - 0x6C,0x70,0x34,0x38,0x68,0x36,0x73,0x41,0x58,0x6E,0x75,0x50,0x50,0x79,0x4E, - 0x65,0x65,0x76,0x6B,0x78,0x55,0x6E,0x68,0x36,0x68,0x32,0x68,0x59,0x4F,0x34, - 0x52,0x41,0x71,0x5A,0x38,0x74,0x51,0x30,0x4B,0x6E,0x59,0x4C,0x54,0x54,0x2B, - 0x41,0x4B,0x36,0x61,0x31,0x34,0x37,0x76,0x20,0x61,0x67,0x75,0x4D,0x56,0x39, - 0x42,0x66,0x6A,0x78,0x31,0x58,0x59,0x66,0x42,0x6A,0x5A,0x45,0x76,0x47,0x61, - 0x7A,0x30,0x35,0x46,0x4F,0x54,0x7A,0x47,0x6B,0x36,0x67,0x35,0x70,0x51,0x4E, - 0x61,0x64,0x34,0x2B,0x51,0x6E,0x73,0x44,0x71,0x4E,0x6C,0x53,0x35,0x32,0x31, - 0x72,0x67,0x71,0x78,0x4E,0x48,0x78,0x75,0x56,0x43,0x58,0x42,0x71,0x39,0x44, - 0x48,0x55,0x69,0x58,0x46,0x71,0x20,0x31,0x32,0x43,0x36,0x66,0x31,0x4E,0x72, - 0x4E,0x50,0x76,0x36,0x6E,0x57,0x4B,0x37,0x2F,0x32,0x33,0x55,0x63,0x79,0x58, - 0x42,0x64,0x47,0x48,0x4D,0x43,0x33,0x54,0x35,0x65,0x77,0x33,0x6D,0x54,0x46, - 0x62,0x52,0x72,0x4A,0x59,0x34,0x79,0x65,0x6A,0x4C,0x50,0x53,0x5A,0x4C,0x78, - 0x71,0x70,0x72,0x44,0x6C,0x50,0x34,0x41,0x63,0x36,0x67,0x35,0x73,0x74,0x2F, - 0x43,0x63,0x50,0x42,0x20,0x53,0x48,0x39,0x78,0x5A,0x5A,0x2F,0x2F,0x45,0x6F, - 0x72,0x2B,0x79,0x6F,0x79,0x50,0x4B,0x35,0x53,0x78,0x31,0x35,0x76,0x35,0x41, - 0x5A,0x48,0x31,0x31,0x33,0x38,0x32,0x2B,0x63,0x73,0x2F,0x6D,0x36,0x35,0x76, - 0x30,0x68,0x46,0x76,0x55,0x78,0x38,0x61,0x50,0x7A,0x4E,0x2B,0x70,0x4E,0x37, - 0x41,0x50,0x6C,0x39,0x64,0x34,0x39,0x4D,0x6C,0x34,0x2F,0x76,0x38,0x4C,0x4C, - 0x4D,0x58,0x20,0x2B,0x48,0x75,0x45,0x4C,0x38,0x55,0x4E,0x45,0x35,0x66,0x35, - 0x44,0x36,0x6F,0x76,0x74,0x4B,0x38,0x41,0x71,0x75,0x77,0x54,0x71,0x42,0x2B, - 0x53,0x57,0x6A,0x67,0x45,0x76,0x52,0x4B,0x4F,0x6A,0x55,0x63,0x43,0x70,0x46, - 0x36,0x51,0x53,0x2B,0x53,0x5A,0x70,0x77,0x38,0x70,0x36,0x70,0x4D,0x36,0x39, - 0x78,0x7A,0x4F,0x6B,0x63,0x38,0x38,0x66,0x52,0x50,0x52,0x2B,0x74,0x4C,0x63, - 0x20,0x42,0x5A,0x53,0x2F,0x57,0x6B,0x71,0x44,0x6E,0x46,0x5A,0x6A,0x66,0x56, - 0x79,0x6A,0x36,0x4B,0x76,0x48,0x47,0x4E,0x41,0x2B,0x48,0x73,0x4F,0x73,0x59, - 0x56,0x63,0x4D,0x72,0x61,0x39,0x71,0x2B,0x49,0x38,0x6E,0x64,0x34,0x30,0x4E, - 0x30,0x68,0x5A,0x69,0x41,0x64,0x42,0x47,0x36,0x33,0x65,0x41,0x78,0x4E,0x74, - 0x78,0x48,0x65,0x61,0x35,0x70,0x34,0x38,0x68,0x54,0x6E,0x47,0x71,0x20,0x37, - 0x37,0x45,0x2B,0x39,0x4A,0x31,0x61,0x42,0x33,0x52,0x49,0x44,0x42,0x31,0x48, - 0x65,0x64,0x4C,0x46,0x7A,0x73,0x77,0x69,0x74,0x57,0x35,0x64,0x37,0x68,0x4A, - 0x4F,0x34,0x41,0x33,0x55,0x32,0x42,0x59,0x31,0x77,0x67,0x46,0x55,0x75,0x79, - 0x33,0x6B,0x54,0x61,0x43,0x4B,0x64,0x70,0x74,0x78,0x74,0x2F,0x56,0x38,0x67, - 0x38,0x63,0x4A,0x74,0x51,0x44,0x4D,0x79,0x4F,0x53,0x46,0x20,0x6C,0x30,0x32, - 0x48,0x72,0x4D,0x4D,0x36,0x4A,0x68,0x4B,0x63,0x50,0x30,0x4B,0x31,0x4C,0x58, - 0x52,0x51,0x6A,0x2B,0x42,0x51,0x68,0x7A,0x58,0x44,0x6C,0x79,0x36,0x72,0x48, - 0x32,0x4F,0x42,0x66,0x67,0x4A,0x66,0x41,0x2F,0x6D,0x7A,0x61,0x31,0x2F,0x6C, - 0x54,0x7A,0x45,0x56,0x4F,0x32,0x4B,0x50,0x4D,0x78,0x44,0x61,0x6A,0x34,0x44, - 0x74,0x56,0x73,0x78,0x62,0x6F,0x57,0x6C,0x54,0x20,0x32,0x6C,0x6B,0x6A,0x6A, - 0x39,0x58,0x55,0x4F,0x4E,0x61,0x62,0x68,0x6F,0x38,0x4D,0x78,0x56,0x35,0x59, - 0x76,0x33,0x38,0x54,0x75,0x63,0x75,0x58,0x59,0x75,0x70,0x54,0x2B,0x72,0x57, - 0x51,0x6E,0x30,0x4E,0x59,0x72,0x65,0x6E,0x6F,0x6D,0x6E,0x47,0x4C,0x4E,0x63, - 0x66,0x47,0x59,0x54,0x76,0x4D,0x51,0x4B,0x67,0x46,0x77,0x4A,0x48,0x7A,0x53, - 0x35,0x50,0x33,0x43,0x2F,0x54,0x4D,0x20,0x32,0x49,0x5A,0x57,0x64,0x53,0x6E, - 0x73,0x78,0x56,0x42,0x4D,0x46,0x59,0x45,0x55,0x76,0x68,0x52,0x54,0x4A,0x6E, - 0x59,0x56,0x45,0x6C,0x31,0x2B,0x39,0x31,0x4B,0x6E,0x5A,0x70,0x37,0x38,0x36, - 0x47,0x33,0x6C,0x32,0x74,0x69,0x74,0x71,0x72,0x77,0x4F,0x55,0x58,0x53,0x73, - 0x33,0x36,0x69,0x50,0x6B,0x49,0x46,0x51,0x76,0x77,0x49,0x6F,0x6C,0x51,0x6E, - 0x38,0x42,0x6C,0x50,0x59,0x20,0x6F,0x6B,0x59,0x34,0x67,0x47,0x72,0x48,0x67, - 0x75,0x4C,0x71,0x73,0x6D,0x59,0x6D,0x67,0x47,0x4C,0x71,0x38,0x6C,0x77,0x62, - 0x2B,0x7A,0x49,0x31,0x70,0x31,0x4F,0x46,0x53,0x36,0x32,0x46,0x2F,0x49,0x78, - 0x31,0x45,0x62,0x58,0x32,0x63,0x36,0x68,0x57,0x72,0x4F,0x45,0x43,0x33,0x73, - 0x49,0x53,0x52,0x76,0x77,0x68,0x47,0x51,0x69,0x35,0x41,0x47,0x69,0x4C,0x63, - 0x71,0x6A,0x4C,0x20,0x36,0x4B,0x4E,0x43,0x4F,0x59,0x48,0x4F,0x4E,0x77,0x34, - 0x73,0x4A,0x2F,0x6A,0x72,0x4B,0x67,0x49,0x4B,0x6F,0x38,0x73,0x30,0x68,0x31, - 0x2B,0x68,0x31,0x69,0x4B,0x39,0x52,0x59,0x6F,0x67,0x48,0x73,0x4E,0x4A,0x49, - 0x39,0x4D,0x38,0x67,0x77,0x72,0x4A,0x37,0x4A,0x6B,0x31,0x47,0x6D,0x49,0x47, - 0x54,0x41,0x5A,0x43,0x4C,0x77,0x42,0x4B,0x78,0x77,0x7A,0x71,0x55,0x39,0x53, - 0x48,0x20,0x4C,0x70,0x32,0x4B,0x51,0x4F,0x6B,0x62,0x42,0x35,0x59,0x54,0x2F, - 0x4E,0x31,0x41,0x58,0x65,0x53,0x68,0x6F,0x48,0x57,0x66,0x77,0x63,0x56,0x51, - 0x44,0x71,0x4F,0x66,0x74,0x35,0x32,0x42,0x55,0x48,0x38,0x44,0x38,0x48,0x64, - 0x31,0x68,0x6A,0x4C,0x33,0x44,0x63,0x69,0x36,0x6E,0x50,0x71,0x45,0x31,0x67, - 0x57,0x56,0x2F,0x46,0x4A,0x6B,0x54,0x4D,0x78,0x68,0x6C,0x34,0x38,0x61,0x20, - 0x75,0x34,0x71,0x4D,0x4C,0x71,0x7A,0x6B,0x31,0x32,0x4B,0x4F,0x67,0x77,0x4F, - 0x34,0x65,0x4B,0x32,0x6A,0x4F,0x44,0x2B,0x63,0x44,0x4D,0x51,0x33,0x67,0x50, - 0x2F,0x32,0x57,0x70,0x65,0x39,0x2B,0x45,0x2F,0x39,0x54,0x5A,0x71,0x6A,0x36, - 0x5A,0x56,0x38,0x6E,0x63,0x75,0x56,0x4D,0x57,0x34,0x43,0x39,0x5A,0x6F,0x75, - 0x57,0x61,0x6A,0x67,0x34,0x55,0x2B,0x70,0x2B,0x35,0x38,0x45,0x20,0x38,0x78, - 0x53,0x65,0x77,0x68,0x53,0x75,0x69,0x35,0x71,0x42,0x43,0x33,0x67,0x4A,0x48, - 0x59,0x79,0x49,0x47,0x64,0x67,0x6F,0x41,0x37,0x45,0x41,0x2F,0x4A,0x34,0x75, - 0x58,0x63,0x4B,0x72,0x33,0x30,0x33,0x50,0x74,0x42,0x4B,0x4C,0x4C,0x74,0x34, - 0x2F,0x58,0x73,0x39,0x48,0x35,0x41,0x54,0x6D,0x6E,0x73,0x32,0x4B,0x4B,0x67, - 0x43,0x56,0x4E,0x58,0x62,0x6F,0x47,0x62,0x59,0x4A,0x20,0x2F,0x41,0x54,0x54, - 0x68,0x6A,0x51,0x2F,0x34,0x66,0x68,0x58,0x6C,0x4A,0x38,0x48,0x75,0x49,0x41, - 0x52,0x4D,0x51,0x4D,0x76,0x7A,0x6B,0x41,0x73,0x41,0x4D,0x39,0x54,0x70,0x77, - 0x75,0x6F,0x74,0x77,0x47,0x31,0x51,0x36,0x48,0x47,0x30,0x51,0x46,0x55,0x47, - 0x78,0x45,0x7A,0x73,0x44,0x63,0x5A,0x69,0x4C,0x38,0x42,0x50,0x4E,0x2B,0x4B, - 0x43,0x70,0x4D,0x2B,0x72,0x63,0x2B,0x67,0x20,0x67,0x36,0x2F,0x46,0x48,0x41, - 0x64,0x48,0x4D,0x46,0x37,0x2B,0x31,0x32,0x59,0x79,0x7A,0x68,0x38,0x38,0x41, - 0x2F,0x45,0x4E,0x59,0x48,0x56,0x4B,0x4D,0x34,0x62,0x6F,0x75,0x33,0x6B,0x4F, - 0x4A,0x61,0x2B,0x43,0x43,0x6B,0x67,0x4A,0x39,0x59,0x71,0x75,0x4E,0x6C,0x35, - 0x38,0x6B,0x68,0x43,0x78,0x6E,0x78,0x6D,0x49,0x42,0x57,0x44,0x7A,0x66,0x56, - 0x45,0x52,0x53,0x44,0x71,0x6D,0x20,0x36,0x61,0x4A,0x58,0x48,0x66,0x5A,0x6F, - 0x69,0x68,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41,0x72,0x43,0x33,0x57,0x78,0x4D, - 0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x62,0x69,0x62,0x77,0x44,0x6A,0x35,0x7A, - 0x68,0x47,0x69,0x42,0x6E,0x59,0x32,0x77,0x7A,0x45,0x41,0x72,0x43,0x33,0x57, - 0x78,0x4D,0x58,0x46,0x6A,0x4D,0x77,0x66,0x67,0x5A,0x69,0x41,0x52,0x67,0x2F, - 0x78,0x7A,0x46,0x43,0x20,0x7A,0x4D,0x44,0x65,0x5A,0x69,0x41,0x57,0x67,0x4C, - 0x33,0x64,0x6D,0x72,0x69,0x77,0x6D,0x49,0x48,0x78,0x4D,0x78,0x41,0x4C,0x77, - 0x50,0x67,0x35,0x6A,0x68,0x46,0x69,0x42,0x76,0x59,0x32,0x41,0x37,0x45,0x41, - 0x37,0x4F,0x33,0x57,0x78,0x49,0x58,0x46,0x44,0x49,0x79,0x66,0x67,0x56,0x67, - 0x41,0x78,0x73,0x39,0x78,0x6A,0x42,0x41,0x7A,0x73,0x4C,0x63,0x5A,0x2B,0x44, - 0x2F,0x67,0x20,0x6B,0x56,0x6D,0x37,0x6B,0x69,0x4A,0x4A,0x36,0x67,0x41,0x41, - 0x41,0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D, - 0x3D,0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x70,0x6C,0x61,0x6E,0x65, - 0x74,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x64,0x35,0x6B,0x6C,0x45,0x51,0x56,0x52,0x34,0x6E,0x4F,0x32,0x64,0x66, - 0x5A,0x42,0x63,0x31,0x58,0x6E,0x6D,0x66,0x37,0x64,0x37,0x20,0x50,0x71,0x55, - 0x5A,0x7A,0x57,0x6A,0x30,0x4D,0x66,0x70,0x41,0x51,0x69,0x4E,0x45,0x4A,0x41, - 0x47,0x79,0x51,0x4D,0x45,0x73,0x77,0x6F,0x41,0x4D,0x43,0x56,0x35,0x69,0x78, - 0x53,0x6E,0x6A,0x73,0x47,0x56,0x58,0x4A,0x62,0x76,0x72,0x4C,0x55,0x78,0x43, - 0x63,0x4A,0x6D,0x74,0x70,0x4C,0x4C,0x6C,0x53,0x72,0x41,0x68,0x41,0x64,0x74, - 0x4A,0x4F,0x61,0x6D,0x34,0x6A,0x41,0x74,0x77,0x20,0x58,0x48,0x61,0x74,0x64, - 0x31,0x31,0x4F,0x78,0x52,0x56,0x32,0x6C,0x58,0x56,0x46,0x57,0x44,0x5A,0x6C, - 0x73,0x41,0x4F,0x78,0x4D,0x49,0x73,0x52,0x57,0x42,0x69,0x51,0x73,0x4E,0x43, - 0x33,0x72,0x4E,0x46,0x49,0x6F,0x35,0x6E,0x52,0x6A,0x4F,0x61,0x7A,0x37,0x38, - 0x30,0x66,0x70,0x78,0x76,0x64,0x61,0x63,0x31,0x6F,0x7A,0x72,0x6C,0x39,0x75, - 0x2F,0x74,0x32,0x33,0x2B,0x64,0x58,0x20,0x64,0x59,0x76,0x70,0x34,0x66,0x53, - 0x64,0x6F,0x2B,0x37,0x7A,0x50,0x50,0x63,0x39,0x35,0x37,0x7A,0x6E,0x48,0x43, - 0x38,0x49,0x41,0x6F,0x51,0x51,0x36,0x53,0x52,0x54,0x37,0x51,0x6F,0x49,0x49, - 0x61,0x71,0x48,0x44,0x45,0x43,0x49,0x46,0x43,0x4D,0x44,0x45,0x43,0x4C,0x46, - 0x79,0x41,0x43,0x45,0x53,0x44,0x45,0x79,0x41,0x43,0x46,0x53,0x6A,0x41,0x78, - 0x41,0x69,0x42,0x51,0x6A,0x20,0x41,0x78,0x41,0x69,0x78,0x63,0x67,0x41,0x68, - 0x45,0x67,0x78,0x44,0x61,0x58,0x65,0x34,0x49,0x6C,0x58,0x78,0x75,0x4F,0x6F, - 0x68,0x78,0x41,0x69,0x41,0x76,0x64,0x76,0x61,0x53,0x37,0x70,0x2F,0x59,0x6F, - 0x41,0x68,0x45,0x67,0x78,0x4A,0x55,0x63,0x41,0x6F,0x71,0x62,0x78,0x5A,0x76, - 0x6D,0x39,0x38,0x73,0x4E,0x54,0x67,0x67,0x79,0x67,0x2F,0x70,0x67,0x48,0x58, - 0x41,0x56,0x73,0x20,0x41,0x6A,0x72,0x79,0x50,0x77,0x4F,0x73,0x42,0x70,0x61, - 0x45,0x79,0x71,0x30,0x48,0x35,0x73,0x39,0x79,0x6A,0x78,0x46,0x67,0x58,0x2B, - 0x68,0x31,0x48,0x33,0x41,0x6B,0x2F,0x2F,0x4D,0x62,0x77,0x43,0x43,0x77,0x4E, - 0x2F,0x2F,0x7A,0x2B,0x56,0x68,0x71,0x4C,0x61,0x71,0x43,0x44,0x4B,0x41,0x32, - 0x38,0x59,0x42,0x31,0x6F,0x57,0x73,0x54,0x52,0x75,0x67,0x39,0x77,0x49,0x6F, - 0x59,0x20,0x37,0x6A,0x38,0x66,0x32,0x47,0x4A,0x5A,0x39,0x67,0x52,0x77,0x45, - 0x47,0x4D,0x47,0x65,0x34,0x46,0x66,0x68,0x69,0x35,0x46,0x45,0x67,0x6C,0x48, - 0x42,0x6C,0x41,0x62,0x58,0x41,0x6C,0x73,0x42,0x57,0x34,0x47,0x62,0x67,0x41, - 0x32,0x56,0x37,0x63,0x36,0x30,0x31,0x69,0x52,0x76,0x39,0x34,0x33,0x77,0x2F, - 0x39,0x37,0x44,0x58,0x67,0x4A,0x65,0x41,0x48,0x59,0x44,0x62,0x78,0x64,0x20, - 0x77,0x58,0x6F,0x4A,0x43,0x32,0x51,0x41,0x79,0x65,0x51,0x47,0x34,0x42,0x61, - 0x4D,0x34,0x47,0x38,0x47,0x46,0x6C,0x65,0x33,0x4F,0x70,0x48,0x5A,0x6E,0x4C, - 0x2F,0x75,0x7A,0x62,0x38,0x2B,0x6A,0x54,0x47,0x43,0x46,0x34,0x44,0x6E,0x38, - 0x7A,0x2B,0x4C,0x4B,0x69,0x49,0x44,0x53,0x41,0x61,0x62,0x67,0x4F,0x33,0x41, - 0x48,0x52,0x6A,0x42,0x4E,0x31,0x57,0x33,0x4F,0x6D,0x56,0x6A,0x20,0x4D,0x66, - 0x43,0x68,0x2F,0x41,0x57,0x51,0x77,0x35,0x6A,0x42,0x4C,0x6D,0x41,0x6E,0x70, - 0x67,0x73,0x68,0x4B,0x6F,0x67,0x4D,0x6F,0x44,0x70,0x30,0x59,0x63,0x52,0x2B, - 0x4F,0x33,0x41,0x58,0x30,0x77,0x66,0x6E,0x30,0x6B,0x51,0x57,0x32,0x4A,0x61, - 0x2F,0x2F,0x67,0x6F,0x7A,0x32,0x4C,0x67,0x44,0x65,0x42,0x5A,0x34,0x42,0x75, - 0x69,0x76,0x58,0x74,0x58,0x53,0x67,0x51,0x79,0x67,0x20,0x73,0x6E,0x77,0x55, - 0x75,0x44,0x74,0x2F,0x69,0x59,0x74,0x5A,0x41,0x76,0x78,0x42,0x2F,0x67,0x4A, - 0x34,0x4B,0x6E,0x2F,0x4A,0x44,0x4D,0x71,0x45,0x44,0x4B,0x44,0x38,0x33,0x41, - 0x6E,0x63,0x67,0x33,0x6E,0x53,0x5A,0x36,0x74,0x63,0x6C,0x31,0x6F,0x6A,0x62, - 0x4A,0x5A,0x50,0x41,0x64,0x2F,0x41,0x64,0x42,0x64,0x45,0x54,0x4D,0x67,0x41, - 0x79,0x6B,0x4D,0x50,0x38,0x48,0x47,0x4D,0x20,0x38,0x46,0x64,0x57,0x74,0x79, - 0x70,0x31,0x51,0x38,0x45,0x4D,0x6A,0x6D,0x4F,0x4D,0x34,0x4A,0x75,0x59,0x36, - 0x55,0x64,0x52,0x41,0x6C,0x55,0x33,0x67,0x47,0x2B,0x38,0x31,0x56,0x6A,0x74, - 0x4B,0x70,0x54,0x45,0x50,0x52,0x73,0x6D,0x77,0x79,0x38,0x2F,0x43,0x4E,0x79, - 0x50,0x47,0x64,0x41,0x54,0x35,0x57,0x45,0x6C,0x38,0x46,0x44,0x2B,0x32,0x67, - 0x6B,0x38,0x41,0x54,0x78,0x64,0x20,0x2B,0x4A,0x2B,0x31,0x31,0x70,0x36,0x4B, - 0x32,0x6B,0x2F,0x46,0x71,0x62,0x6F,0x42,0x31,0x43,0x49,0x7A,0x66,0x47,0x6E, - 0x33,0x59,0x59,0x53,0x2F,0x71,0x66,0x4B,0x31,0x6D,0x55,0x34,0x75,0x67,0x4C, - 0x50,0x6A,0x48,0x6D,0x66,0x48,0x50,0x53,0x5A,0x38,0x47,0x42,0x67,0x33,0x32, - 0x62,0x37,0x44,0x6B,0x78,0x35,0x6A,0x75,0x51,0x76,0x6C,0x42,0x69,0x63,0x38, - 0x4A,0x76,0x32,0x5A,0x20,0x37,0x39,0x47,0x59,0x67,0x59,0x36,0x6D,0x43,0x7A, - 0x6B,0x38,0x4C,0x56,0x6C,0x6F,0x61,0x7A,0x53,0x76,0x4F,0x35,0x73,0x44,0x6D, - 0x6A,0x4B,0x77,0x73,0x44,0x6C,0x67,0x59,0x58,0x4E,0x41,0x64,0x72,0x5A,0x6B, - 0x34,0x73,0x71,0x77,0x50,0x58,0x2F,0x74,0x78,0x52,0x6A,0x42,0x56,0x38,0x50, - 0x66,0x54,0x61,0x32,0x5A,0x51,0x54,0x57,0x51,0x41,0x54,0x68,0x51,0x4A,0x50, - 0x77,0x75,0x20,0x34,0x4A,0x4D,0x59,0x34,0x53,0x2B,0x72,0x64,0x46,0x32,0x47, - 0x4A,0x6A,0x79,0x47,0x4A,0x73,0x31,0x2F,0x43,0x34,0x49,0x2F,0x4E,0x77,0x6E, - 0x6E,0x70,0x30,0x70,0x58,0x35,0x4B,0x51,0x50,0x70,0x38,0x65,0x4B,0x37,0x7A, - 0x50,0x7A,0x66,0x65,0x63,0x31,0x42,0x4C,0x51,0x33,0x58,0x6A,0x43,0x45,0x42, - 0x55,0x30,0x42,0x43,0x78,0x70,0x68,0x51,0x56,0x4E,0x46,0x6B,0x77,0x41,0x33, - 0x20,0x41,0x55,0x38,0x43,0x44,0x32,0x4F,0x4D,0x34,0x48,0x47,0x67,0x76,0x2F, - 0x42,0x39,0x79,0x51,0x68,0x6D,0x52,0x77,0x5A,0x67,0x53,0x55,0x6A,0x38,0x6A, - 0x63,0x43,0x44,0x6D,0x4D,0x5A,0x57,0x45,0x59,0x59,0x6D,0x50,0x45,0x36,0x4E, - 0x65,0x76,0x53,0x4F,0x65,0x76,0x53,0x4E,0x65,0x5A,0x79,0x35,0x53,0x4A,0x7A, - 0x56,0x34,0x2F,0x79,0x55,0x78,0x2F,0x6B,0x70,0x36,0x42,0x32,0x39,0x20,0x75, - 0x45,0x36,0x4C,0x57,0x67,0x4B,0x57,0x74,0x41,0x52,0x30,0x74,0x77,0x59,0x73, - 0x62,0x51,0x30,0x71,0x59,0x51,0x72,0x4C,0x67,0x45,0x66,0x79,0x31,0x31,0x38, - 0x43,0x6E,0x77,0x63,0x6D,0x37,0x39,0x6B,0x77,0x4B,0x52,0x4F,0x59,0x42,0x52, - 0x6E,0x41,0x48,0x42,0x51,0x39,0x39,0x66,0x38,0x63,0x38,0x38,0x51,0x76,0x36, - 0x38,0x44,0x65,0x38,0x4B,0x54,0x48,0x30,0x52,0x47,0x50,0x20,0x34,0x79,0x4D, - 0x65,0x76,0x65,0x63,0x7A,0x30,0x30,0x4C,0x33,0x57,0x75,0x4A,0x4D,0x33,0x71, - 0x7A,0x65,0x47,0x6A,0x43,0x76,0x57,0x37,0x4B,0x77,0x74,0x4E,0x58,0x6E,0x73, - 0x72,0x61,0x41,0x56,0x66,0x4F,0x44,0x64,0x37,0x73,0x56,0x5A,0x65,0x4A,0x68, - 0x34,0x42,0x4F,0x59,0x69,0x4F,0x41,0x4C,0x69,0x67,0x5A,0x6D,0x52,0x67,0x59, - 0x77,0x43,0x30,0x58,0x43,0x66,0x77,0x41,0x6A,0x20,0x2F,0x50,0x58,0x6C,0x2B, - 0x46,0x73,0x42,0x63,0x48,0x7A,0x45,0x34,0x38,0x52,0x49,0x68,0x73,0x50,0x44, - 0x48,0x6B,0x4D,0x54,0x79,0x58,0x6E,0x43,0x78,0x38,0x6C,0x59,0x44,0x6F,0x34, - 0x4D,0x5A,0x7A,0x67,0x79,0x62,0x46,0x34,0x76,0x61,0x41,0x71,0x34,0x76,0x43, - 0x31,0x67,0x78,0x58,0x79,0x66,0x6C,0x66,0x4F,0x44,0x57,0x64,0x63,0x6D,0x6C, - 0x38,0x42,0x4B,0x54,0x42,0x54,0x77,0x20,0x58,0x7A,0x42,0x47,0x38,0x4A,0x69, - 0x4D,0x59,0x44,0x6F,0x79,0x67,0x43,0x49,0x71,0x4F,0x61,0x70,0x2F,0x62,0x4D, - 0x54,0x6A,0x34,0x4C,0x6B,0x4D,0x68,0x38,0x39,0x6C,0x47,0x4B,0x2F,0x52,0x70, - 0x33,0x77,0x70,0x44,0x45,0x31,0x34,0x37,0x4F,0x33,0x33,0x32,0x4E,0x75,0x66, - 0x6F,0x54,0x6B,0x4C,0x6C,0x37,0x66,0x37,0x39,0x4C,0x53,0x58,0x78,0x51,0x7A, - 0x57,0x41,0x31,0x38,0x47,0x20,0x50,0x6B,0x42,0x2B,0x31,0x6B,0x42,0x47,0x59, - 0x4A,0x41,0x42,0x68,0x41,0x69,0x4A,0x66,0x77,0x32,0x6D,0x6E,0x2F,0x2B,0x4A, - 0x75,0x50,0x2F,0x47,0x71,0x56,0x47,0x50,0x66,0x59,0x50,0x70,0x46,0x66,0x31, - 0x73,0x6A,0x4F,0x64,0x67,0x2F,0x30,0x43,0x47,0x2F,0x51,0x4D,0x58,0x7A,0x47, - 0x42,0x39,0x68,0x38,0x2F,0x53,0x31,0x6C,0x69,0x37,0x43,0x59,0x56,0x5A,0x67, - 0x36,0x39,0x6A,0x20,0x49,0x6F,0x4E,0x44,0x61,0x52,0x38,0x66,0x6B,0x41,0x46, - 0x77,0x30,0x56,0x50,0x2F,0x73,0x35,0x68,0x42,0x70,0x4E,0x67,0x59,0x7A,0x38, - 0x48,0x62,0x67,0x78,0x6E,0x32,0x44,0x57,0x62,0x65,0x6E,0x5A,0x59,0x54,0x73, - 0x78,0x4D,0x32,0x67,0x38,0x37,0x6D,0x67,0x50,0x55,0x64,0x50,0x6C,0x64,0x32, - 0x2B,0x44,0x54,0x48,0x6C,0x30,0x66,0x35,0x69,0x66,0x7A,0x31,0x45,0x50,0x42, - 0x6F,0x20,0x6D,0x71,0x4F,0x42,0x31,0x4F,0x38,0x4A,0x47,0x42,0x4C,0x2F,0x65, - 0x34,0x48,0x76,0x45,0x61,0x50,0x34,0x2B,0x38,0x59,0x38,0x66,0x6E,0x51,0x69, - 0x79,0x7A,0x2F,0x38,0x73,0x70,0x47,0x66,0x6E,0x73,0x70,0x4B,0x2F,0x42,0x45, - 0x59,0x47,0x50,0x66,0x34,0x36,0x53,0x6E,0x7A,0x47,0x66,0x37,0x6F,0x52,0x4A, - 0x61,0x2B,0x65,0x47,0x64,0x41,0x48,0x73,0x46,0x38,0x35,0x2B,0x2B,0x46,0x20, - 0x36,0x69,0x66,0x6C,0x56,0x49,0x50,0x55,0x52,0x67,0x42,0x46,0x58,0x2F,0x61, - 0x6A,0x77,0x47,0x66,0x69,0x75,0x76,0x65,0x52,0x34,0x51,0x77,0x2F,0x50,0x35, - 0x4F,0x5A,0x63,0x57,0x70,0x4D,0x52,0x4D,0x4D,0x50,0x34,0x4D,0x42,0x51,0x68, - 0x67,0x4E,0x44,0x47,0x62,0x70,0x62,0x41,0x39,0x36,0x7A,0x79,0x47,0x64,0x31, - 0x32,0x79,0x79,0x5A,0x54,0x47,0x37,0x63,0x6D,0x62,0x38,0x2B,0x20,0x42,0x33, - 0x77,0x32,0x62,0x64,0x46,0x41,0x4B,0x69,0x4F,0x41,0x6B,0x50,0x6A,0x58,0x59, - 0x35,0x61,0x65,0x6C,0x69,0x7A,0x2B,0x41,0x42,0x4F,0x32,0x50,0x76,0x56,0x4F, - 0x41,0x38,0x38,0x63,0x79,0x30,0x72,0x38,0x5A,0x61,0x52,0x33,0x31,0x4F,0x4F, - 0x5A,0x59,0x31,0x6D,0x65,0x65,0x71,0x65,0x42,0x2F,0x51,0x4F,0x5A,0x75,0x50, - 0x59,0x64,0x2B,0x77,0x79,0x6D,0x4C,0x61,0x79,0x48,0x20,0x39,0x45,0x51,0x44, - 0x71,0x54,0x4F,0x41,0x30,0x42,0x66,0x37,0x2B,0x35,0x67,0x74,0x71,0x32,0x34, - 0x72,0x39,0x5A,0x35,0x76,0x44,0x78,0x72,0x68,0x50,0x33,0x38,0x79,0x79,0x32, - 0x43,0x64,0x54,0x75,0x45,0x6C,0x6B,0x63,0x45,0x4A,0x6A,0x2B,0x64,0x50,0x47, - 0x69,0x4E,0x34,0x65,0x7A,0x43,0x57,0x70,0x6E,0x77,0x62,0x70,0x6B,0x33,0x38, - 0x50,0x71,0x54,0x44,0x42,0x46,0x4C,0x54,0x20,0x42,0x53,0x6A,0x36,0x4D,0x70, - 0x2F,0x45,0x35,0x4F,0x2B,0x58,0x78,0x44,0x74,0x44,0x47,0x66,0x61,0x63,0x30, - 0x63,0x42,0x65,0x74,0x52,0x6D,0x61,0x38,0x50,0x6A,0x58,0x58,0x32,0x58,0x35, - 0x65,0x58,0x2B,0x47,0x36,0x78,0x62,0x35,0x72,0x46,0x31,0x51,0x55,0x74,0x65, - 0x67,0x47,0x66,0x67,0x57,0x5A,0x6F,0x2F,0x44,0x50,0x36,0x72,0x33,0x4C,0x6B, - 0x45,0x71,0x49,0x6F,0x43,0x51,0x20,0x2B,0x44,0x64,0x6A,0x48,0x4C,0x34,0x6B, - 0x38,0x66,0x65,0x4E,0x65,0x58,0x7A,0x33,0x55,0x41,0x50,0x50,0x6E,0x64,0x44, - 0x41,0x58,0x70,0x49,0x59,0x47,0x50,0x64,0x34,0x37,0x6B,0x53,0x57,0x37,0x78, - 0x35,0x71,0x69,0x47,0x4F,0x77,0x38,0x44,0x35,0x4D,0x57,0x39,0x6B,0x4D,0x39, - 0x52,0x73,0x4E,0x31,0x48,0x55,0x45,0x55,0x50,0x53,0x6C,0x2F,0x56,0x66,0x67, - 0x66,0x7A,0x4C,0x37,0x20,0x59,0x52,0x68,0x7A,0x4D,0x6A,0x7A,0x70,0x38,0x58, - 0x4B,0x66,0x47,0x59,0x67,0x53,0x79,0x61,0x56,0x67,0x30,0x46,0x63,0x73,0x38, - 0x4C,0x6C,0x2B,0x69,0x56,0x39,0x4B,0x79,0x76,0x46,0x37,0x67,0x44,0x33,0x41, - 0x66,0x77,0x50,0x2B,0x56,0x7A,0x31,0x47,0x41,0x33,0x58,0x62,0x6B,0x6B,0x50, - 0x69,0x7A,0x77,0x4A,0x66,0x77,0x32,0x77,0x67,0x45,0x55,0x6E,0x38,0x66,0x67, - 0x43,0x76,0x20,0x6E,0x6A,0x48,0x39,0x66,0x49,0x6D,0x2F,0x64,0x6A,0x67,0x77, - 0x5A,0x4C,0x36,0x7A,0x56,0x38,0x39,0x6B,0x38,0x4B,0x4F,0x50,0x46,0x48,0x71, - 0x59,0x74,0x76,0x4D,0x31,0x38,0x6A,0x73,0x36,0x31,0x56,0x4D,0x30,0x55,0x4A, - 0x65,0x74,0x4F,0x66,0x51,0x46,0x58,0x59,0x73,0x4A,0x34,0x2B,0x36,0x64,0x76, - 0x66,0x53,0x6C,0x36,0x52,0x76,0x7A,0x32,0x48,0x47,0x6F,0x67,0x5A,0x2F,0x31, - 0x20,0x5A,0x63,0x6E,0x70,0x6D,0x49,0x75,0x61,0x49,0x78,0x66,0x41,0x7A,0x2F, - 0x71,0x79,0x37,0x43,0x69,0x39,0x57,0x33,0x41,0x76,0x70,0x69,0x31,0x64,0x43, - 0x2F,0x56,0x6A,0x41,0x6E,0x56,0x6E,0x41,0x4B,0x45,0x76,0x35,0x73,0x4F,0x59, - 0x38,0x4F,0x33,0x71,0x4B,0x50,0x65,0x5A,0x39,0x4F,0x48,0x46,0x58,0x74,0x4F, - 0x66,0x56,0x44,0x2B,0x2F,0x39,0x68,0x6B,0x59,0x4E,0x39,0x32,0x43,0x20,0x46, - 0x33,0x75,0x7A,0x73,0x32,0x36,0x45,0x59,0x73,0x48,0x56,0x6D,0x44,0x62,0x31, - 0x59,0x61,0x67,0x50,0x45,0x36,0x67,0x72,0x41,0x77,0x68,0x39,0x49,0x51,0x39, - 0x67,0x74,0x70,0x65,0x4F,0x52,0x4F,0x2B,0x6F,0x78,0x34,0x36,0x44,0x44,0x66, - 0x7A,0x69,0x62,0x46,0x31,0x39,0x50,0x41,0x4C,0x34,0x78,0x64,0x6B,0x4D,0x4F, - 0x77,0x34,0x32,0x6C,0x4A,0x71,0x6E,0x73,0x51,0x50,0x54,0x20,0x78,0x6D,0x72, - 0x65,0x42,0x4F,0x70,0x69,0x45,0x4C,0x44,0x6F,0x53,0x33,0x67,0x4D,0x2B,0x46, - 0x54,0x55,0x65,0x37,0x31,0x32,0x4A,0x73,0x50,0x50,0x2B,0x72,0x49,0x36,0x31, - 0x4B,0x36,0x4F,0x4F,0x54,0x66,0x70,0x73,0x66,0x4E,0x77,0x41,0x37,0x2B,0x2B, - 0x4A,0x4D,0x66,0x6D,0x52,0x5A,0x48,0x44,0x67,0x53,0x39,0x6A,0x7A,0x6D,0x56, - 0x38,0x6F,0x4A,0x59,0x48,0x42,0x32,0x76,0x2B,0x20,0x45,0x52,0x63,0x53,0x2F, - 0x79,0x72,0x67,0x58,0x34,0x67,0x6F,0x2F,0x72,0x45,0x63,0x66,0x50,0x39,0x6F, - 0x41,0x79,0x39,0x4C,0x2F,0x4B,0x6B,0x67,0x41,0x46,0x37,0x75,0x79,0x2F,0x4C, - 0x39,0x6F,0x77,0x32,0x6C,0x62,0x4C,0x6A,0x79,0x4B,0x55,0x79,0x62,0x57,0x77, - 0x57,0x31,0x47,0x51,0x33,0x55,0x74,0x41,0x45,0x55,0x4C,0x64,0x2F,0x39,0x4E, - 0x68,0x48,0x58,0x37,0x52,0x64,0x43,0x20,0x2F,0x6D,0x4D,0x6A,0x36,0x75,0x75, - 0x6E,0x6A,0x57,0x4D,0x6A,0x58,0x71,0x6C,0x64,0x67,0x75,0x33,0x41,0x50,0x32, - 0x4C,0x61,0x59,0x4D,0x32,0x5A,0x51,0x4D,0x30,0x61,0x51,0x4F,0x69,0x44,0x76, - 0x67,0x4C,0x34,0x4A,0x38,0x78,0x68,0x6D,0x73,0x37,0x73,0x4F,0x5A,0x31,0x68, - 0x35,0x2B,0x47,0x47,0x57,0x44,0x62,0x54,0x46,0x4C,0x58,0x4A,0x2B,0x53,0x6E, - 0x54,0x4A,0x64,0x68,0x7A,0x20,0x4F,0x72,0x49,0x63,0x62,0x73,0x4B,0x30,0x77, - 0x53,0x75,0x67,0x74,0x6B,0x79,0x67,0x4A,0x67,0x32,0x67,0x53,0x50,0x7A,0x2F, - 0x41,0x6C,0x7A,0x76,0x65,0x6F,0x2B,0x78,0x48,0x4F,0x77,0x36,0x32,0x73,0x41, - 0x72,0x70,0x78,0x58,0x79,0x43,0x39,0x4D,0x6C,0x65,0x4F,0x56,0x30,0x6C,0x6C, - 0x33,0x52,0x75,0x77,0x54,0x58,0x59,0x39,0x70,0x69,0x54,0x5A,0x6C,0x41,0x7A, - 0x52,0x6C,0x41,0x20,0x6B,0x66,0x68,0x2F,0x41,0x47,0x78,0x77,0x76,0x55,0x66, - 0x66,0x6D,0x4D,0x66,0x2F,0x50,0x64,0x6A,0x49,0x63,0x59,0x58,0x38,0x6F,0x6F, - 0x6A,0x6A,0x49,0x36,0x5A,0x74,0x52,0x4D,0x77,0x5A,0x32,0x49,0x42,0x70,0x6B, - 0x7A,0x56,0x6A,0x41,0x6A,0x56,0x6C,0x41,0x45,0x56,0x39,0x2F,0x76,0x38,0x48, - 0x72,0x48,0x57,0x39,0x78,0x38,0x46,0x7A,0x4A,0x75,0x51,0x66,0x6E,0x59,0x71, - 0x78,0x20,0x59,0x71,0x4B,0x75,0x47,0x4A,0x32,0x43,0x6E,0x59,0x63,0x62,0x4F, - 0x48,0x67,0x75,0x6B,0x6A,0x7A,0x57,0x59,0x74,0x72,0x6D,0x47,0x6B,0x69,0x2B, - 0x43,0x64,0x53,0x4D,0x41,0x52,0x53,0x4A,0x2F,0x35,0x2B,0x49,0x6B,0x4F,0x44, - 0x7A,0x32,0x70,0x6B,0x4D,0x7A,0x78,0x35,0x58,0x52,0x70,0x2B,0x59,0x6D,0x31, - 0x77,0x41,0x7A,0x78,0x37,0x50,0x38,0x74,0x71,0x5A,0x53,0x42,0x4B,0x35,0x20, - 0x47,0x74,0x4E,0x47,0x31,0x30,0x43,0x79,0x54,0x61,0x42,0x6D,0x44,0x43,0x44, - 0x50,0x4B,0x75,0x42,0x2F,0x34,0x39,0x6A,0x6E,0x44,0x34,0x44,0x64,0x76,0x56, - 0x6C,0x65,0x37,0x74,0x50,0x68,0x76,0x4D,0x4B,0x4E,0x6C,0x2F,0x75,0x79,0x37, - 0x4F,0x36,0x4E,0x4E,0x45,0x35,0x30,0x50,0x61,0x61,0x74,0x72,0x6F,0x71,0x37, - 0x54,0x6E,0x46,0x53,0x45,0x77,0x59,0x51,0x63,0x74,0x41,0x6E,0x20,0x63,0x52, - 0x7A,0x74,0x39,0x77,0x50,0x34,0x30,0x59,0x6B,0x73,0x62,0x79,0x69,0x72,0x54, - 0x30,0x54,0x6B,0x6A,0x62,0x4D,0x5A,0x6E,0x6A,0x75,0x65,0x6A,0x62,0x4B,0x67, - 0x36,0x42,0x5A,0x4D,0x6D,0x30,0x31,0x73,0x46,0x4A,0x42,0x34,0x56,0x59,0x51, - 0x2B,0x75,0x4D,0x64,0x77,0x6E,0x4F,0x66,0x50,0x42,0x66,0x44,0x44,0x34,0x31, - 0x6E,0x65,0x30,0x51,0x6F,0x2B,0x55,0x53,0x49,0x48,0x20,0x7A,0x32,0x58,0x34, - 0x59,0x62,0x54,0x75,0x34,0x33,0x5A,0x4D,0x32,0x30,0x32,0x6B,0x43,0x53,0x52, - 0x61,0x47,0x61,0x45,0x50,0x37,0x44,0x34,0x63,0x4D,0x2F,0x78,0x79,0x41,0x66, - 0x7A,0x67,0x61,0x41,0x4E,0x48,0x68,0x68,0x50,0x39,0x54,0x78,0x51,0x31,0x78, - 0x4A,0x48,0x68,0x44,0x44,0x38,0x34,0x32,0x68,0x44,0x46,0x42,0x44,0x35,0x46, - 0x66,0x68,0x4F,0x61,0x70,0x4A,0x6C,0x41,0x20,0x59,0x74,0x56,0x52,0x74,0x4B, - 0x72,0x76,0x53,0x5A,0x66,0x33,0x35,0x67,0x4C,0x34,0x33,0x70,0x45,0x47,0x54, - 0x70,0x7A,0x58,0x4E,0x4A,0x2B,0x49,0x6C,0x78,0x50,0x6E,0x50,0x62,0x35,0x33, - 0x4A,0x4A,0x49,0x4A,0x50,0x45,0x6B,0x43,0x56,0x78,0x45,0x6D,0x30,0x67,0x42, - 0x43,0x48,0x39,0x41,0x57,0x48,0x46,0x66,0x31,0x2B,0x51,0x45,0x38,0x63,0x36, - 0x7A,0x6B,0x31,0x56,0x35,0x43,0x20,0x7A,0x49,0x72,0x5A,0x6C,0x62,0x67,0x68, - 0x79,0x70,0x6A,0x41,0x44,0x6B,0x79,0x62,0x54,0x6F,0x77,0x4A,0x4A,0x4E,0x49, - 0x41,0x38,0x71,0x7A,0x42,0x54,0x4B,0x56,0x59,0x34,0x2B,0x66,0x37,0x2F,0x45, - 0x72,0x77,0x45,0x65,0x58,0x6D,0x2B,0x49,0x6A,0x48,0x44,0x36,0x4D,0x4E,0x44, - 0x4C,0x34,0x37,0x50,0x5A,0x67,0x45,0x45,0x6D,0x63,0x41,0x52,0x53,0x50,0x2B, - 0x31,0x6F,0x6B,0x2B,0x20,0x41,0x66,0x44,0x6A,0x58,0x32,0x58,0x56,0x35,0x78, - 0x63,0x56,0x34,0x38,0x68,0x77,0x68,0x68,0x2F,0x2F,0x79,0x6E,0x6D,0x4B,0x63, - 0x43,0x30,0x4A,0x6D,0x68,0x6C,0x49,0x6C,0x46,0x70,0x43,0x48,0x38,0x68,0x6E, - 0x4D,0x61,0x65,0x31,0x57,0x4C,0x50,0x37,0x70,0x45,0x62,0x37,0x52,0x65,0x56, - 0x35,0x5A,0x79,0x6A,0x44,0x37,0x70,0x50,0x4F,0x2B,0x53,0x56,0x33,0x59,0x74, - 0x70,0x34,0x20,0x31,0x55,0x6D,0x4D,0x59,0x6B,0x4C,0x69,0x76,0x77,0x33,0x48, - 0x38,0x2F,0x6C,0x65,0x4F,0x35,0x50,0x68,0x7A,0x59,0x48,0x45,0x2F,0x46,0x4E, - 0x45,0x79,0x6E,0x68,0x7A,0x49,0x42,0x4D,0x6C,0x59,0x2F,0x41,0x52,0x59,0x6A, - 0x69,0x55,0x70,0x6C,0x53,0x53,0x70,0x70,0x6F,0x31,0x6D,0x48,0x58,0x39,0x31, - 0x68,0x77,0x5A,0x4E,0x6A,0x76,0x34,0x43,0x46,0x46,0x4E,0x58,0x75,0x36,0x4C, - 0x20,0x31,0x50,0x33,0x38,0x4E,0x6C,0x55,0x65,0x44,0x30,0x69,0x45,0x41,0x52, - 0x54,0x31,0x2B,0x35,0x66,0x62,0x76,0x71,0x39,0x76,0x7A,0x4F,0x50,0x5A,0x34, - 0x31,0x72,0x4F,0x4B,0x35,0x4C,0x42,0x73,0x38,0x65,0x64,0x54,0x79,0x39,0x65, - 0x6A,0x75,0x4D,0x55,0x64,0x39,0x78,0x55,0x33,0x51,0x43,0x69,0x39,0x76,0x74, - 0x48,0x70,0x38,0x78,0x30,0x6E,0x78,0x62,0x32,0x69,0x4B,0x53,0x51,0x20,0x79, - 0x30,0x39,0x42,0x4F,0x36,0x34,0x30,0x72,0x65,0x70,0x34,0x51,0x4E,0x55,0x4E, - 0x49,0x4D,0x38,0x31,0x4F,0x50,0x54,0x37,0x7A,0x58,0x53,0x66,0x6C,0x76,0x53, - 0x4B,0x35,0x44,0x45,0x36,0x5A,0x64,0x71,0x6D,0x34,0x2F,0x54,0x67,0x49,0x78, - 0x67,0x4E,0x56,0x4A,0x79,0x6B,0x47,0x4D,0x44,0x6A,0x4C,0x6F,0x56,0x66,0x4F, - 0x71,0x58,0x6A,0x74,0x30,0x56,0x79,0x36,0x52,0x33,0x31,0x20,0x2B,0x4F,0x6B, - 0x70,0x35,0x33,0x45,0x70,0x4A,0x77,0x33,0x45,0x52,0x52,0x49,0x4D,0x34,0x41, - 0x76,0x41,0x72,0x62,0x61,0x46,0x33,0x78,0x37,0x4D,0x61,0x4C,0x39,0x2B,0x6B, - 0x58,0x6A,0x65,0x4F,0x4A,0x74,0x78,0x50,0x62,0x4C,0x38,0x56,0x6F,0x77,0x57, - 0x4B,0x6B,0x71,0x31,0x6C,0x58,0x51,0x6A,0x38,0x47,0x65,0x32,0x68,0x51,0x63, - 0x6E,0x50,0x48,0x62,0x33,0x61,0x73,0x52,0x66,0x20,0x31,0x41,0x61,0x37,0x65, - 0x37,0x4D,0x4D,0x54,0x6A,0x68,0x46,0x71,0x6E,0x2B,0x47,0x30,0x55,0x54,0x46, - 0x71,0x4C,0x59,0x42,0x50,0x47,0x78,0x62,0x73,0x4C,0x43,0x75,0x76,0x34,0x52, - 0x6A,0x6E,0x59,0x53,0x6F,0x4B,0x4A,0x4F,0x2B,0x61,0x62,0x4F,0x4F,0x34,0x77, - 0x48,0x57,0x6D,0x6F,0x69,0x44,0x61,0x68,0x71,0x41,0x30,0x36,0x6A,0x2F,0x4B, - 0x36,0x65,0x7A,0x6E,0x43,0x37,0x39,0x20,0x7A,0x48,0x63,0x68,0x4B,0x73,0x72, - 0x70,0x4D,0x59,0x39,0x58,0x54,0x6A,0x74,0x46,0x72,0x52,0x57,0x64,0x46,0x61, - 0x69,0x57,0x41,0x61,0x7A,0x43,0x59,0x64,0x54,0x2F,0x78,0x48,0x6D,0x50,0x6E, - 0x30,0x66,0x62,0x6D,0x30,0x32,0x49,0x71,0x76,0x50,0x7A,0x4D,0x78,0x6E,0x58, - 0x70,0x65,0x6D,0x50,0x55,0x4B,0x47,0x74,0x78,0x4B,0x71,0x6C,0x71,0x67,0x64, - 0x74,0x43,0x30,0x37,0x36,0x20,0x38,0x4C,0x7A,0x37,0x67,0x67,0x73,0x68,0x45, - 0x6B,0x4F,0x41,0x61,0x63,0x4F,0x4F,0x33,0x56,0x64,0x72,0x6A,0x5A,0x52,0x43, - 0x4E,0x51,0x7A,0x67,0x67,0x38,0x41,0x66,0x32,0x68,0x5A,0x2B,0x75,0x53,0x2F, - 0x4C,0x38,0x4B,0x52,0x43,0x66,0x31,0x48,0x62,0x44,0x45,0x39,0x36,0x72,0x70, - 0x76,0x53,0x2F,0x69,0x46,0x47,0x4B,0x32,0x57,0x6C,0x47,0x67,0x5A,0x77,0x76, - 0x32,0x33,0x42,0x20,0x55,0x36,0x4D,0x65,0x62,0x32,0x72,0x4B,0x54,0x39,0x51, - 0x4A,0x62,0x35,0x37,0x4E,0x63,0x4D,0x6F,0x74,0x66,0x38,0x56,0x61,0x4B,0x31, - 0x47,0x70,0x74,0x4C,0x72,0x2B,0x46,0x4D,0x75,0x4E,0x50,0x66,0x30,0x41,0x6E, - 0x6A,0x2B,0x70,0x30,0x46,0x2F,0x55,0x44,0x77,0x47,0x6D,0x54,0x54,0x76,0x4D, - 0x43,0x6D,0x77,0x48,0x2F,0x72,0x68,0x73,0x46,0x61,0x4C,0x79,0x42,0x6D,0x44, - 0x74,0x20,0x61,0x48,0x76,0x37,0x4D,0x77,0x79,0x4D,0x4B,0x2F,0x51,0x58,0x39, - 0x63,0x58,0x41,0x75,0x4D,0x66,0x65,0x66,0x69,0x66,0x5A,0x6C,0x54,0x55,0x4B, - 0x71,0x4B,0x51,0x42,0x2F,0x44,0x6E,0x51,0x59,0x31,0x50,0x77,0x2F,0x4A,0x54, - 0x48,0x61,0x32,0x65,0x55,0x38,0x43,0x50,0x71,0x6B,0x39,0x66,0x4F,0x5A,0x46, - 0x31,0x4F,0x6F,0x31,0x36,0x48,0x30,0x55,0x35,0x5A,0x71,0x4A,0x51,0x42,0x20, - 0x64,0x41,0x47,0x66,0x74,0x79,0x33,0x38,0x30,0x71,0x6D,0x4D,0x45,0x6E,0x35, - 0x45,0x33,0x54,0x4C,0x70,0x6D,0x7A,0x62,0x75,0x77,0x4F,0x63,0x78,0x47,0x6F, - 0x71,0x64,0x53,0x68,0x6E,0x41,0x41,0x37,0x59,0x46,0x65,0x30,0x63,0x39,0x44, - 0x6D,0x68,0x72,0x4C,0x31,0x48,0x6E,0x48,0x42,0x6A,0x4B,0x75,0x43,0x35,0x6F, - 0x73,0x39,0x61,0x51,0x43,0x35,0x56,0x51,0x57,0x68,0x63,0x4F,0x20,0x36,0x59, - 0x33,0x4B,0x39,0x52,0x64,0x70,0x34,0x55,0x57,0x33,0x74,0x76,0x34,0x77,0x5A, - 0x59,0x67,0x43,0x4B,0x6D,0x45,0x41,0x39,0x39,0x6B,0x57,0x66,0x47,0x63,0x6F, - 0x77,0x78,0x6D,0x6C,0x2B,0x34,0x71,0x55,0x63,0x48,0x72,0x4D,0x63,0x7A,0x32, - 0x43,0x33,0x46,0x70,0x4C,0x74,0x6C,0x54,0x43,0x41,0x4B,0x78,0x47,0x4D,0x51, - 0x4E,0x67,0x6A,0x39,0x4A,0x39,0x52,0x63,0x70,0x34,0x20,0x35,0x58,0x54,0x47, - 0x5A,0x61,0x6F,0x37,0x39,0x68,0x6D,0x42,0x63,0x69,0x76,0x75,0x58,0x6D,0x43, - 0x6C,0x54,0x63,0x45,0x44,0x67,0x35,0x72,0x32,0x45,0x2B,0x6C,0x6A,0x59,0x4E, - 0x7A,0x6A,0x67,0x50,0x32,0x2B,0x41,0x53,0x73,0x78,0x6D,0x6F,0x71,0x4E,0x63, - 0x68,0x75,0x41,0x6E,0x76,0x35,0x43,0x7A,0x4D,0x47,0x65,0x4D,0x39,0x57,0x4C, - 0x41,0x73,0x71,0x70,0x75,0x67,0x38,0x43,0x20,0x31,0x39,0x6F,0x55,0x66,0x48, - 0x73,0x67,0x77,0x35,0x44,0x62,0x78,0x67,0x6C,0x43,0x31,0x41,0x31,0x44,0x45, - 0x78,0x35,0x76,0x32,0x35,0x39,0x72,0x63,0x53,0x30,0x78,0x72,0x68,0x45,0x6F, - 0x70,0x77,0x48,0x59,0x5A,0x2F,0x30,0x70,0x33,0x31,0x2B,0x6B,0x48,0x45,0x63, - 0x4E,0x78,0x42,0x59,0x46,0x6C,0x45,0x74,0x35,0x50,0x56,0x6A,0x6D,0x2F,0x42, - 0x38,0x5A,0x56,0x74,0x39,0x66,0x20,0x69,0x49,0x46,0x78,0x7A,0x2B,0x56,0x67, - 0x6B,0x65,0x31,0x59,0x5A,0x74,0x58,0x4F,0x52,0x62,0x6B,0x4D,0x34,0x44,0x2F, - 0x62,0x46,0x6E,0x54,0x4D,0x69,0x78,0x61,0x69,0x62,0x6E,0x48,0x55,0x67,0x72, - 0x58,0x47,0x4C,0x6B,0x57,0x35,0x31,0x48,0x65,0x50,0x54,0x61,0x48,0x54,0x59, - 0x78,0x34,0x6E,0x33,0x58,0x5A,0x4B,0x45,0x61,0x4A,0x75,0x4F,0x58,0x6E,0x65, - 0x63,0x7A,0x6C,0x5A,0x20,0x36,0x42,0x36,0x41,0x4A,0x31,0x34,0x5A,0x4C,0x2B, - 0x6C,0x76,0x6C,0x73,0x4D,0x41,0x37,0x67,0x42,0x57,0x32,0x78,0x52,0x38,0x58, - 0x55,0x39,0x2F,0x49,0x61,0x62,0x78,0x43,0x33,0x74,0x4E,0x72,0x4D,0x62,0x78, - 0x42,0x4F,0x32,0x5A,0x4B,0x49,0x63,0x43,0x72,0x5A,0x37,0x2B,0x34,0x7A,0x6B, - 0x34,0x35,0x4A,0x59,0x46,0x4A,0x55,0x54,0x64,0x63,0x2B,0x68,0x63,0x68,0x76, - 0x47,0x63,0x20,0x64,0x66,0x47,0x50,0x51,0x32,0x6C,0x52,0x51,0x4E,0x77,0x4B, - 0x37,0x41,0x49,0x2B,0x61,0x6C,0x50,0x77,0x6C,0x30,0x4D,0x5A,0x6E,0x65,0x73, - 0x6E,0x52,0x42,0x47,0x35,0x77,0x47,0x6A,0x44,0x6B,0x6F,0x39,0x53,0x34,0x76, - 0x71,0x41,0x75,0x41,0x33,0x67,0x44,0x74,0x75,0x43,0x2B,0x2B,0x7A,0x6E,0x50, - 0x59,0x56,0x49,0x46,0x59,0x37,0x61,0x73,0x4E,0x62,0x63,0x54,0x4D,0x53,0x74, - 0x20,0x77,0x72,0x74,0x74,0x43,0x76,0x57,0x4E,0x65,0x5A,0x7A,0x56,0x31,0x4A, - 0x38,0x51,0x4D,0x33,0x4A,0x32,0x33,0x48,0x50,0x5A,0x4F,0x2F,0x42,0x75,0x69, - 0x4E,0x34,0x4E,0x69,0x4E,0x4D,0x41,0x6C,0x6D,0x42,0x70,0x41,0x50,0x76,0x31, - 0x39,0x42,0x66,0x69,0x6B,0x6A,0x69,0x63,0x4B,0x33,0x67,0x33,0x52,0x6E,0x75, - 0x52,0x69,0x46,0x4F,0x4A,0x56,0x71,0x46,0x49,0x41,0x4B,0x35,0x4C,0x20,0x49, - 0x49,0x56,0x49,0x48,0x51,0x66,0x50,0x4F,0x61,0x30,0x50,0x69,0x4E,0x77,0x4E, - 0x71,0x4C,0x67,0x42,0x48,0x42,0x2F,0x78,0x58,0x45,0x59,0x35,0x68,0x55,0x67, - 0x6C,0x34,0x7A,0x6D,0x6A,0x46,0x55,0x73,0x53,0x59,0x51,0x43,0x33,0x32,0x78, - 0x54,0x53,0x30,0x31,0x38,0x49,0x4F,0x78,0x79,0x30,0x63,0x6A,0x74,0x45,0x47, - 0x77,0x65,0x49,0x53,0x34,0x32,0x62,0x73,0x45,0x6A,0x2B,0x20,0x38,0x51,0x4D, - 0x34,0x4C,0x41,0x4D,0x51,0x77,0x6F,0x72,0x44,0x35,0x7A,0x4B,0x32,0x5A,0x77, - 0x69,0x73,0x78,0x6D,0x6A,0x51,0x6D,0x62,0x6A,0x55,0x61,0x4C,0x58,0x77,0x52, - 0x2B,0x47,0x2F,0x45,0x50,0x59,0x34,0x64,0x67,0x4F,0x73,0x4E,0x46,0x68,0x4D, - 0x53,0x51,0x59,0x51,0x43,0x6A,0x6D,0x73,0x55,0x68,0x4B,0x50,0x6A,0x2B,0x6A, - 0x70,0x4C,0x34,0x51,0x4C,0x44,0x70,0x71,0x35,0x20,0x45,0x39,0x79,0x37,0x41, - 0x58,0x45,0x6F,0x73,0x67,0x76,0x59,0x5A,0x6C,0x50,0x51,0x38,0x59,0x68,0x6B, - 0x49,0x56,0x4B,0x50,0x67,0x32,0x61,0x32,0x45,0x53,0x45,0x72,0x4D,0x41,0x34, - 0x44,0x75,0x4E,0x6D,0x6D,0x30,0x50,0x43,0x6B,0x6B,0x6E,0x2B,0x45,0x63,0x4F, - 0x58,0x73,0x75,0x4F,0x64,0x79,0x4F,0x72,0x61,0x56,0x46,0x73,0x4E,0x55,0x7A, - 0x41,0x43,0x4F,0x32,0x76,0x64,0x6C,0x20,0x68,0x42,0x41,0x68,0x48,0x4C,0x52, - 0x54,0x4F,0x51,0x4D,0x49,0x39,0x54,0x56,0x75,0x73,0x53,0x6C,0x2F,0x62,0x46, - 0x67,0x47,0x49,0x45,0x51,0x55,0x48,0x4C,0x52,0x7A,0x43,0x37,0x69,0x4E,0x41, - 0x35,0x51,0x61,0x41,0x54,0x51,0x41,0x4E,0x38,0x35,0x56,0x4B,0x41,0x42,0x36, - 0x52,0x7A,0x55,0x41,0x4B,0x45,0x51,0x55,0x65,0x6B,0x65,0x74,0x73,0x77,0x4A, - 0x76,0x78,0x47,0x6A,0x53,0x20,0x6D,0x6C,0x4A,0x56,0x65,0x5A,0x56,0x4E,0x6F, - 0x59,0x46,0x78,0x54,0x66,0x38,0x4A,0x45,0x5A,0x58,0x78,0x48,0x43,0x37,0x37, - 0x5A,0x6C,0x70,0x70,0x73,0x6B,0x43,0x70,0x42,0x72,0x44,0x56,0x70,0x70,0x44, - 0x6A,0x49,0x59,0x68,0x43,0x69,0x43,0x49,0x63,0x4E,0x47,0x53,0x6C,0x79,0x51, - 0x49,0x56,0x4D,0x51,0x43,0x48,0x70,0x59,0x31,0x43,0x69,0x42,0x6C,0x77,0x30, - 0x46,0x44,0x35,0x20,0x44,0x53,0x41,0x30,0x79,0x48,0x43,0x44,0x54,0x58,0x6D, - 0x48,0x6A,0x51,0x36,0x46,0x45,0x44,0x50,0x67,0x6F,0x4B,0x45,0x62,0x77,0x48, - 0x34,0x67,0x73,0x4A,0x51,0x49,0x6F,0x42,0x6E,0x59,0x4F,0x46,0x63,0x68,0x50, - 0x34,0x42,0x42,0x7A,0x66,0x38,0x4C,0x55,0x52,0x4B,0x44,0x34,0x35,0x37,0x74, - 0x75,0x6F,0x43,0x4E,0x47,0x47,0x31,0x61,0x55,0x59,0x6F,0x42,0x57,0x41,0x30, - 0x32,0x20,0x6E,0x42,0x33,0x33,0x58,0x4E,0x59,0x31,0x43,0x79,0x46,0x6D,0x49, - 0x41,0x43,0x58,0x52,0x44,0x72,0x72,0x67,0x63,0x42,0x53,0x44,0x4D,0x44,0x71, - 0x33,0x4C,0x39,0x2B,0x50,0x66,0x32,0x46,0x69,0x41,0x55,0x48,0x4C,0x56,0x6C, - 0x70,0x45,0x30,0x6F,0x7A,0x41,0x4B,0x76,0x6C,0x68,0x7A,0x49,0x41,0x49,0x65, - 0x4C,0x42,0x51,0x55,0x76,0x57,0x53,0x34,0x50,0x4C,0x33,0x67,0x58,0x51,0x20, - 0x75,0x58,0x39,0x43,0x78,0x45,0x4D,0x35,0x63,0x67,0x47,0x63,0x44,0x53,0x41, - 0x30,0x75,0x72,0x6A,0x65,0x70,0x76,0x7A,0x67,0x68,0x4F,0x74,0x66,0x45,0x45, - 0x4C,0x4D,0x68,0x49,0x4F,0x57,0x31,0x6F,0x50,0x64,0x54,0x45,0x44,0x55,0x43, - 0x4B,0x41,0x42,0x57,0x44,0x4E,0x58,0x6F,0x51,0x41,0x59,0x6D,0x56,0x49,0x45, - 0x49,0x45,0x51,0x63,0x6A,0x45,0x78,0x5A,0x44,0x36,0x69,0x76,0x20,0x77,0x54, - 0x49,0x6C,0x4F,0x4B,0x6F,0x42,0x72,0x4C,0x51,0x70,0x4E,0x44,0x4A,0x70,0x50, - 0x58,0x55,0x68,0x68,0x4A,0x67,0x44,0x50,0x7A,0x43,0x61,0x73,0x73,0x52,0x4B, - 0x6F,0x31,0x45,0x4E,0x77,0x4F,0x70,0x73,0x38,0x75,0x48,0x4A,0x69,0x48,0x63, - 0x58,0x51,0x73,0x79,0x49,0x67,0x36,0x61,0x73,0x4E,0x46,0x70,0x57,0x41,0x7A, - 0x68,0x6E,0x37,0x31,0x5A,0x43,0x43,0x41,0x73,0x63,0x20,0x4E,0x46,0x56,0x57, - 0x41,0x37,0x41,0x36,0x2F,0x6C,0x73,0x52,0x67,0x42,0x44,0x78,0x34,0x71,0x41, - 0x70,0x4B,0x34,0x31,0x47,0x4E,0x51,0x43,0x72,0x76,0x63,0x66,0x47,0x63,0x34, - 0x6F,0x41,0x68,0x49,0x67,0x54,0x42,0x30,0x31,0x5A,0x61,0x62,0x53,0x73,0x67, - 0x34,0x44,0x6E,0x70,0x79,0x4C,0x65,0x58,0x51,0x67,0x78,0x49,0x77,0x36,0x61, - 0x4B,0x75,0x73,0x67,0x59,0x49,0x64,0x4E,0x20,0x6F,0x51,0x6C,0x66,0x45,0x59, - 0x41,0x51,0x63,0x65,0x4B,0x67,0x4B,0x53,0x75,0x4E,0x6C,0x72,0x6B,0x4C,0x45, - 0x50,0x48,0x75,0x51,0x6F,0x67,0x5A,0x63,0x64,0x42,0x55,0x57,0x62,0x73,0x41, - 0x6C,0x68,0x46,0x41,0x78,0x4C,0x73,0x4C,0x49,0x57,0x62,0x45,0x51,0x56,0x4E, - 0x6C,0x6A,0x51,0x42,0x61,0x62,0x51,0x70,0x4E,0x79,0x51,0x43,0x45,0x69,0x42, - 0x55,0x48,0x54,0x56,0x6C,0x70,0x20,0x4E,0x4B,0x6F,0x42,0x74,0x4E,0x6B,0x55, - 0x6D,0x74,0x49,0x59,0x67,0x42,0x43,0x78,0x34,0x71,0x41,0x70,0x4B,0x34,0x30, - 0x36,0x47,0x55,0x42,0x6F,0x63,0x55,0x47,0x54,0x54,0x66,0x6D,0x63,0x30,0x6F, - 0x43,0x46,0x69,0x42,0x55,0x48,0x53,0x57,0x56,0x68,0x37,0x67,0x56,0x42,0x55, - 0x53,0x49,0x41,0x44,0x32,0x69,0x78,0x4B,0x53,0x67,0x44,0x45,0x43,0x4A,0x65, - 0x4A,0x75,0x32,0x37,0x20,0x41,0x50,0x4D,0x78,0x57,0x72,0x30,0x6B,0x4F,0x71, - 0x31,0x44,0x69,0x42,0x51,0x6A,0x41,0x78,0x41,0x69,0x78,0x63,0x67,0x41,0x68, - 0x4B,0x67,0x68,0x47,0x75,0x30,0x56,0x4F,0x34,0x4C,0x46,0x6B,0x45,0x45,0x55, - 0x41,0x77,0x69,0x41,0x4D,0x5A,0x75,0x43,0x57,0x55,0x30,0x43,0x43,0x42,0x45, - 0x72,0x44,0x70,0x4C,0x4B,0x41,0x64,0x79,0x2F,0x35,0x64,0x49,0x37,0x68,0x44, - 0x73,0x5A,0x20,0x51,0x4F,0x68,0x6D,0x56,0x70,0x73,0x54,0x79,0x51,0x43,0x45, - 0x69,0x4A,0x65,0x4D,0x76,0x61,0x61,0x73,0x4E,0x42,0x71,0x31,0x43,0x7A,0x42, - 0x73,0x55,0x36,0x67,0x68,0x6F,0x32,0x6B,0x41,0x49,0x65,0x4C,0x45,0x51,0x56, - 0x4F,0x6A,0x4E,0x6F,0x57,0x69,0x47,0x6F,0x44,0x56,0x7A,0x52,0x73,0x30,0x77, - 0x69,0x42,0x45,0x72,0x43,0x51,0x6C,0x41,0x68,0x69,0x30,0x4B,0x64,0x51,0x6B, - 0x20,0x41,0x78,0x41,0x69,0x56,0x68,0x77,0x30,0x5A,0x61,0x58,0x52,0x71,0x42, - 0x4C,0x74,0x74,0x79,0x6E,0x55,0x6E,0x49,0x31,0x34,0x64,0x79,0x48,0x45,0x6A, - 0x44,0x68,0x6F,0x79,0x6B,0x71,0x6A,0x5A,0x59,0x34,0x41,0x4E,0x41,0x59,0x67, - 0x52,0x4A,0x77,0x34,0x61,0x4B,0x71,0x73,0x45,0x63,0x42,0x78,0x6D,0x30,0x4C, - 0x7A,0x72,0x48,0x59,0x6D,0x46,0x30,0x4C,0x59,0x30,0x6D,0x71,0x76,0x20,0x71, - 0x5A,0x4D,0x32,0x68,0x63,0x72,0x63,0x42,0x56,0x41,0x45,0x49,0x45,0x53,0x63, - 0x74,0x4E,0x68,0x72,0x71,0x73,0x2B,0x6D,0x55,0x46,0x51,0x44,0x4F,0x47,0x4A, - 0x54,0x71,0x4B,0x30,0x78,0x34,0x74,0x32,0x46,0x45,0x44,0x50,0x69,0x6F,0x43, - 0x6B,0x72,0x6A,0x55,0x59,0x31,0x67,0x49,0x4D,0x32,0x68,0x64,0x6F,0x62,0x46, - 0x51,0x45,0x49,0x45,0x53,0x63,0x4F,0x6D,0x72,0x4C,0x53,0x20,0x61,0x46,0x6B, - 0x6A,0x67,0x50,0x6D,0x4B,0x41,0x49,0x53,0x49,0x46,0x51,0x64,0x4E,0x6C,0x54, - 0x55,0x43,0x73,0x4F,0x77,0x43,0x42,0x43,0x36,0x35,0x79,0x30,0x4B,0x49,0x53, - 0x35,0x44,0x78,0x6A,0x4B,0x59,0x73,0x4B,0x61,0x73,0x42,0x54,0x41,0x47,0x48, - 0x35,0x69,0x72,0x6B,0x34,0x56,0x52,0x68,0x49,0x63,0x51,0x6C,0x6D,0x4E,0x39, - 0x67,0x2F,0x55,0x41,0x39,0x68,0x4E,0x48,0x6F,0x20,0x6E,0x44,0x67,0x62,0x51, - 0x47,0x68,0x42,0x30,0x44,0x36,0x62,0x38,0x68,0x31,0x57,0x6D,0x34,0x63,0x4A, - 0x49,0x65,0x62,0x43,0x51,0x55,0x76,0x37,0x59,0x4F,0x36,0x56,0x67,0x46,0x44, - 0x61,0x66,0x67,0x42,0x76,0x32,0x42,0x54,0x71,0x62,0x46,0x59,0x45,0x49,0x45, - 0x51,0x63,0x4F,0x47,0x6A,0x4A,0x53,0x70,0x74,0x51,0x6D,0x67,0x48,0x73,0x74, - 0x53,0x6E,0x55,0x4A,0x51,0x4D,0x51,0x20,0x49,0x68,0x59,0x63,0x74,0x47,0x53, - 0x6C,0x54,0x61,0x69,0x41,0x41,0x53,0x79,0x55,0x41,0x51,0x67,0x52,0x43,0x77, - 0x35,0x61,0x71,0x6F,0x67,0x42,0x57,0x49,0x55,0x5A,0x43,0x35,0x73,0x31,0x45, - 0x79,0x42,0x45,0x71,0x58,0x67,0x6B,0x4C,0x77,0x49,0x34,0x44,0x37,0x77,0x35, - 0x56,0x36,0x47,0x73,0x42,0x78,0x32,0x4B,0x41,0x6F,0x51,0x6F,0x69,0x59,0x37, - 0x6D,0x77,0x48,0x59,0x76,0x20,0x67,0x44,0x65,0x42,0x53,0x78,0x38,0x47,0x45, - 0x43,0x4B,0x53,0x41,0x59,0x52,0x47,0x46,0x31,0x2B,0x79,0x4B,0x62,0x2B,0x6B, - 0x52,0x51,0x59,0x67,0x52,0x43,0x6B,0x34,0x61,0x4F,0x67,0x6C,0x73,0x4A,0x73, - 0x42,0x67,0x4E,0x4A,0x33,0x42,0x64,0x35,0x74,0x55,0x32,0x68,0x70,0x71,0x77, - 0x78,0x41,0x69,0x46,0x4A,0x77,0x30,0x4A,0x43,0x56,0x4A,0x67,0x74,0x55,0x78, - 0x41,0x43,0x36,0x20,0x5A,0x51,0x42,0x43,0x6C,0x49,0x53,0x44,0x68,0x69,0x70, - 0x71,0x41,0x4E,0x61,0x35,0x41,0x4E,0x6F,0x64,0x53,0x49,0x68,0x6F,0x4E,0x47, - 0x66,0x4C,0x6B,0x77,0x4D,0x41,0x70,0x52,0x76,0x41,0x46,0x50,0x44,0x69,0x58, - 0x49,0x55,0x38,0x6F,0x4C,0x74,0x56,0x5A,0x34,0x55,0x4C,0x45,0x59,0x58,0x75, - 0x56,0x74,0x39,0x32,0x4A,0x75,0x31,0x46,0x4C,0x46,0x4F,0x41,0x43,0x30,0x51, - 0x32,0x20,0x67,0x4E,0x41,0x67,0x77,0x2F,0x4D,0x32,0x35,0x53,0x39,0x72,0x55, - 0x7A,0x64,0x41,0x69,0x43,0x67,0x34,0x61,0x4F,0x64,0x35,0x73,0x42,0x38,0x41, - 0x68,0x48,0x69,0x4F,0x42,0x6E,0x76,0x42,0x70,0x74,0x43,0x71,0x2B,0x54,0x49, - 0x41,0x49,0x61,0x4C,0x67,0x6F,0x42,0x30,0x72,0x4C,0x59,0x61,0x70,0x6D,0x41, - 0x47,0x30,0x4E,0x51,0x62,0x4B,0x43,0x68,0x54,0x43,0x6B,0x59,0x58,0x4E,0x20, - 0x67,0x63,0x75,0x4B,0x32,0x71,0x6F,0x59,0x51,0x44,0x2F,0x77,0x59,0x35,0x75, - 0x43,0x79,0x7A,0x51,0x62,0x49,0x49,0x51,0x54,0x44,0x70,0x72,0x35,0x4D,0x5A, - 0x5A,0x37,0x64,0x59,0x59,0x70,0x79,0x51,0x42,0x43,0x66,0x59,0x31,0x64,0x4E, - 0x75,0x56,0x58,0x74,0x57,0x6B,0x67,0x55,0x41,0x67,0x58,0x48,0x44,0x53,0x7A, - 0x43,0x39,0x7A,0x36,0x2F,0x78,0x44,0x66,0x38,0x65,0x41,0x37,0x20,0x62,0x51, - 0x71,0x74,0x6E,0x4B,0x2F,0x70,0x51,0x43,0x46,0x73,0x61,0x63,0x34,0x61,0x7A, - 0x56,0x68,0x69,0x70,0x63,0x46,0x69,0x34,0x6A,0x4B,0x41,0x76,0x56,0x68,0x73, - 0x51,0x5A,0x54,0x78,0x59,0x4C,0x57,0x69,0x41,0x43,0x47,0x73,0x57,0x4E,0x33, - 0x6D,0x32,0x2B,0x62,0x2F,0x48,0x38,0x46,0x68,0x41,0x56,0x43,0x59,0x4F,0x45, - 0x2F,0x76,0x73,0x78,0x71,0x41,0x36,0x47,0x6D,0x58,0x20,0x41,0x51,0x68,0x68, - 0x67,0x34,0x4E,0x57,0x58,0x67,0x44,0x33,0x38,0x42,0x2F,0x69,0x4E,0x51,0x43, - 0x72,0x45,0x4F,0x53,0x79,0x4E,0x6E,0x55,0x44,0x68,0x4A,0x69,0x4C,0x35,0x71, - 0x7A,0x54,0x2F,0x48,0x2B,0x6B,0x38,0x42,0x2F,0x69,0x4E,0x59,0x42,0x6E,0x62, - 0x41,0x70,0x35,0x4B,0x41,0x6F,0x51,0x59,0x69,0x35,0x36,0x32,0x71,0x32,0x7A, - 0x2F,0x38,0x42,0x53,0x65,0x7A,0x4D,0x52,0x20,0x70,0x77,0x48,0x30,0x41,0x54, - 0x74,0x73,0x43,0x71,0x37,0x72,0x6B,0x41,0x45,0x49,0x63,0x53,0x6B,0x63,0x4E, - 0x4C,0x49,0x44,0x79,0x32,0x50,0x41,0x5A,0x69,0x4A,0x4F,0x41,0x77,0x42,0x34, - 0x79,0x71,0x5A,0x51,0x64,0x32,0x74,0x41,0x52,0x35,0x4E,0x79,0x41,0x6F,0x53, - 0x59,0x69,0x59,0x36,0x6D,0x77,0x47,0x58,0x31,0x33,0x31,0x4D,0x51,0x72,0x66, - 0x38,0x50,0x38,0x52,0x75,0x41,0x20,0x56,0x54,0x34,0x41,0x77,0x4D,0x61,0x46, - 0x69,0x67,0x4B,0x45,0x6D,0x49,0x6B,0x4E,0x6E,0x55,0x37,0x61,0x73,0x4E,0x62, - 0x63,0x54,0x4D,0x52,0x74,0x41,0x50,0x33,0x41,0x64,0x32,0x77,0x4B,0x72,0x6C, - 0x76,0x67,0x6B,0x39,0x56,0x6D,0x67,0x55,0x4A,0x4D,0x49,0x2B,0x76,0x42,0x6C, - 0x66,0x62,0x68,0x2F,0x33,0x65,0x49,0x6B,0x50,0x30,0x58,0x4A,0x6D,0x34,0x44, - 0x41,0x50,0x69,0x57,0x20,0x54,0x61,0x48,0x6D,0x4C,0x4B,0x7A,0x52,0x59,0x4B, - 0x41,0x51,0x30,0x31,0x6A,0x54,0x37,0x72,0x76,0x4D,0x6B,0x6E,0x30,0x4C,0x6F, - 0x6F,0x66,0x2F,0x55,0x42,0x34,0x44,0x32,0x41,0x6D,0x63,0x74,0x43,0x6C,0x34, - 0x64,0x5A,0x63,0x4D,0x51,0x49,0x67,0x77,0x56,0x39,0x6C,0x33,0x6A,0x55,0x39, - 0x53,0x77,0x76,0x52,0x66,0x67,0x58,0x49,0x59,0x41,0x4D,0x43,0x54,0x4E,0x6F, - 0x57,0x57,0x20,0x74,0x41,0x51,0x73,0x6D,0x36,0x66,0x42,0x51,0x43,0x45,0x41, - 0x6C,0x73,0x30,0x4C,0x58,0x50,0x62,0x2B,0x2B,0x78,0x71,0x55,0x39,0x76,0x53, - 0x48,0x38,0x68,0x6D,0x41,0x56,0x54,0x63,0x41,0x59,0x4A,0x4F,0x69,0x41,0x43, - 0x45,0x41,0x5A,0x79,0x31,0x38,0x4D,0x34,0x36,0x2F,0x57,0x53,0x34,0x44,0x4F, - 0x49,0x68,0x6C,0x65,0x4C,0x4B,0x71,0x7A,0x64,0x66,0x35,0x67,0x53,0x4C,0x31, - 0x20,0x64,0x44,0x51,0x46,0x4C,0x69,0x76,0x2F,0x64,0x6D,0x49,0x30,0x56,0x6A, - 0x4C,0x6C,0x4D,0x67,0x43,0x41,0x4A,0x32,0x77,0x4B,0x65,0x63,0x41,0x6D,0x54, - 0x51,0x6D,0x4B,0x6C,0x50,0x4F,0x65,0x4C,0x71,0x66,0x4D,0x50,0x79,0x74,0x74, - 0x32,0x56,0x42,0x4F,0x41,0x33,0x67,0x61,0x65,0x4E,0x57,0x6D,0x34,0x4A,0x57, - 0x64,0x50,0x75,0x33,0x32,0x75,0x35,0x34,0x49,0x55,0x56,0x65,0x30,0x20,0x4E, - 0x77,0x5A,0x63,0x61,0x54,0x2F,0x33,0x2F,0x79,0x70,0x47,0x57,0x37,0x46,0x51, - 0x54,0x67,0x4D,0x41,0x68,0x79,0x6A,0x67,0x75,0x73,0x57,0x4B,0x41,0x6B,0x51, - 0x36,0x75,0x57,0x35,0x78,0x64,0x5A,0x37,0x2B,0x55,0x48,0x34,0x44,0x2B,0x44, - 0x2B,0x32,0x42,0x64,0x64,0x31,0x2B,0x45,0x6F,0x50,0x46,0x71,0x6D,0x6A,0x6F, - 0x79,0x6C,0x77,0x58,0x52,0x74,0x6A,0x72,0x53,0x6B,0x62,0x20,0x79,0x6D,0x30, - 0x41,0x2F,0x63,0x43,0x44,0x4E,0x67,0x55,0x39,0x59,0x49,0x75,0x69,0x41,0x4A, - 0x45,0x79,0x74,0x72,0x67,0x39,0x2F,0x52,0x2B,0x69,0x78,0x4D,0x79,0x2F,0x59, - 0x73,0x70,0x74,0x41,0x41,0x42,0x66,0x74,0x53,0x33,0x59,0x73,0x38,0x42,0x6E, - 0x6B,0x51,0x34,0x53,0x46,0x53,0x6C,0x68,0x55,0x55,0x74,0x41,0x7A,0x77,0x4B, - 0x6E,0x68,0x39,0x37,0x6A,0x63,0x64,0x65,0x68,0x20,0x45,0x67,0x62,0x51,0x44, - 0x33,0x7A,0x4F,0x70,0x71,0x41,0x48,0x62,0x4F,0x33,0x4F,0x6C,0x62,0x63,0x32, - 0x51,0x69,0x53,0x45,0x72,0x64,0x30,0x35,0x6C,0x36,0x66,0x2F,0x35,0x34,0x6A, - 0x35,0x36,0x51,0x2B,0x56,0x4D,0x51,0x43,0x41,0x4C,0x39,0x6B,0x57,0x37,0x47, - 0x34,0x4E,0x75,0x4D,0x4C,0x4E,0x46,0x59,0x57,0x6F,0x4F,0x61,0x35,0x59,0x34, - 0x4C,0x73,0x65,0x6D,0x6D,0x75,0x74,0x20,0x49,0x52,0x63,0x71,0x5A,0x51,0x44, - 0x39,0x6D,0x50,0x36,0x4C,0x46,0x54,0x63,0x73,0x39,0x57,0x6D,0x73,0x56,0x4D, - 0x32,0x45,0x71,0x44,0x43,0x4E,0x47,0x64,0x50,0x47,0x48,0x59,0x69,0x39,0x37, - 0x31,0x2B,0x67,0x6B,0x6A,0x4B,0x7A,0x37,0x72,0x2F,0x4D,0x61,0x77,0x69,0x34, - 0x52,0x69,0x6E,0x43,0x6F,0x6B,0x37,0x5A,0x31,0x4A,0x56,0x6A,0x58,0x6F,0x50, - 0x54,0x30,0x7A,0x2F,0x32,0x20,0x76,0x6E,0x2B,0x42,0x53,0x68,0x71,0x41,0x39, - 0x59,0x77,0x41,0x77,0x4C,0x57,0x4C,0x63,0x70,0x6F,0x57,0x46,0x48,0x56,0x48, - 0x5A,0x33,0x50,0x41,0x35,0x6B,0x56,0x4F,0x44,0x37,0x63,0x48,0x4B,0x64,0x50, - 0x54,0x48,0x79,0x70,0x72,0x41,0x41,0x42,0x66,0x77,0x48,0x4B,0x4E,0x51,0x4D, - 0x61,0x44,0x57,0x35,0x59,0x37,0x44,0x5A,0x49,0x49,0x6B,0x57,0x67,0x38,0x34, - 0x4F,0x5A,0x6C,0x20,0x4F,0x64,0x75,0x39,0x2F,0x73,0x46,0x6F,0x35,0x51,0x74, - 0x6C,0x71,0x78,0x43,0x56,0x4E,0x77,0x42,0x77,0x79,0x47,0x54,0x71,0x62,0x67, - 0x31,0x63,0x74,0x30,0x63,0x53,0x49,0x72,0x46,0x73,0x58,0x4F,0x67,0x38,0x38, - 0x42,0x64,0x72,0x31,0x74,0x39,0x4D,0x56,0x4D,0x4D,0x41,0x6E,0x67,0x62,0x2B, - 0x33,0x72,0x62,0x77,0x65,0x35,0x63,0x36,0x39,0x35,0x65,0x45,0x53,0x42,0x7A, - 0x7A,0x20,0x47,0x67,0x4B,0x75,0x58,0x2B,0x49,0x30,0x78,0x66,0x33,0x33,0x78, - 0x4A,0x6A,0x7A,0x50,0x78,0x76,0x56,0x47,0x6D,0x76,0x2F,0x4F,0x39,0x75,0x43, - 0x6A,0x52,0x6E,0x59,0x74,0x6B,0x4A,0x64,0x41,0x56,0x47,0x37,0x65,0x4A,0x67, - 0x32,0x37,0x44,0x69,0x7A,0x39,0x54,0x66,0x6C,0x71,0x63,0x31,0x30,0x71,0x6D, - 0x55,0x41,0x2B,0x33,0x47,0x59,0x46,0x6C,0x77,0x78,0x54,0x37,0x4D,0x43,0x20, - 0x6F,0x6E,0x61,0x35,0x70,0x73,0x74,0x6E,0x68,0x64,0x76,0x4F,0x56,0x77,0x38, - 0x42,0x42,0x38,0x70,0x55,0x6E,0x57,0x6C,0x55,0x63,0x37,0x62,0x39,0x55,0x65, - 0x44,0x37,0x74,0x6F,0x57,0x76,0x58,0x35,0x4A,0x54,0x6D,0x72,0x43,0x6F,0x4F, - 0x52,0x61,0x31,0x4F,0x49,0x66,0x2B,0x75,0x7A,0x44,0x61,0x71,0x41,0x6A,0x56, - 0x54,0x72,0x65,0x78,0x2F,0x6F,0x64,0x6D,0x50,0x4C,0x68,0x74,0x20,0x52,0x55, - 0x35,0x62,0x69,0x59,0x75,0x61,0x49,0x5A,0x74,0x76,0x73,0x77,0x36,0x6A,0x2F, - 0x67,0x42,0x2F,0x57,0x61,0x62,0x71,0x7A,0x45,0x69,0x31,0x44,0x65,0x44,0x66, - 0x67,0x43,0x2F,0x61,0x46,0x75,0x35,0x6F,0x43,0x6E,0x6A,0x66,0x4D,0x71,0x30, - 0x56,0x45,0x4C,0x58,0x42,0x2B,0x35,0x59,0x35,0x35,0x37,0x4A,0x38,0x45,0x58, - 0x69,0x78,0x54,0x4E,0x57,0x5A,0x6B,0x57,0x6F,0x62,0x20,0x41,0x4D,0x43,0x6E, - 0x4D,0x55,0x5A,0x67,0x78,0x5A,0x55,0x64,0x50,0x68,0x73,0x31,0x4E,0x53,0x67, - 0x53,0x7A,0x73,0x5A,0x4F,0x33,0x2B,0x57,0x41,0x44,0x7A,0x41,0x61,0x2B,0x48, - 0x53,0x5A,0x71,0x6A,0x4D,0x72,0x53,0x54,0x41,0x41,0x67,0x45,0x2B,0x36,0x46, - 0x4C,0x36,0x78,0x4F,0x2B,0x65,0x79,0x66,0x62,0x49,0x51,0x46,0x57,0x56,0x70, - 0x61,0x38,0x43,0x4E,0x37,0x71,0x74,0x61,0x20,0x6E,0x54,0x51,0x51,0x46,0x30, - 0x6B,0x78,0x67,0x4E,0x64,0x77,0x6D,0x42,0x58,0x49,0x65,0x50,0x41,0x62,0x4B, - 0x33,0x4F,0x30,0x32,0x4A,0x2B,0x67,0x49,0x6B,0x52,0x46,0x61,0x4D,0x6D,0x61, - 0x74,0x75,0x6E,0x59,0x37,0x33,0x38,0x49,0x6F,0x34,0x47,0x4B,0x55,0x33,0x55, - 0x44,0x2B,0x4D,0x5A,0x62,0x6A,0x59,0x55,0x66,0x48,0x38,0x58,0x68,0x6F,0x4D, - 0x4E,0x35,0x44,0x51,0x45,0x66,0x20,0x57,0x44,0x57,0x6C,0x51,0x55,0x47,0x52, - 0x47,0x4C,0x49,0x65,0x66,0x47,0x44,0x56,0x6C,0x47,0x76,0x69,0x57,0x6B,0x56, - 0x48,0x2F,0x59,0x75,0x70,0x75,0x67,0x48,0x41,0x4E,0x42,0x50,0x34,0x49,0x2B, - 0x43,0x55,0x37,0x66,0x75,0x57,0x74,0x41,0x54,0x63,0x75,0x6C,0x79,0x44,0x67, - 0x69,0x49,0x5A,0x33,0x4C,0x6F,0x38,0x78,0x78,0x4B,0x33,0x71,0x65,0x70,0x54, - 0x6D,0x44,0x5A,0x66,0x20,0x4E,0x52,0x4A,0x68,0x41,0x43,0x45,0x4F,0x41,0x52, - 0x39,0x7A,0x65,0x63,0x50,0x61,0x42,0x62,0x37,0x72,0x50,0x4B,0x73,0x51,0x73, - 0x58,0x50,0x39,0x6B,0x68,0x78,0x72,0x33,0x54,0x65,0x79,0x2B,0x52,0x69,0x6D, - 0x7A,0x56,0x65,0x4E,0x78,0x42,0x68,0x41,0x4B,0x41,0x70,0x34,0x44,0x6F,0x66, - 0x78,0x41,0x49,0x44,0x4E,0x69,0x7A,0x51,0x7A,0x49,0x4B,0x72,0x48,0x78,0x6B, - 0x37,0x66,0x20,0x64,0x59,0x6B,0x76,0x6D,0x44,0x62,0x2B,0x58,0x42,0x6D,0x71, - 0x34,0x30,0x52,0x69,0x44,0x41,0x43,0x69,0x6A,0x77,0x63,0x41,0x62,0x46,0x32, - 0x57,0x6F,0x30,0x66,0x48,0x6A,0x59,0x73,0x4B,0x30,0x39,0x50,0x75,0x73,0x39, - 0x55,0x39,0x4E,0x36,0x57,0x71,0x2F,0x66,0x34,0x77,0x69,0x54,0x49,0x41,0x75, - 0x47,0x67,0x38,0x34,0x4C,0x44,0x74,0x2B,0x7A,0x7A,0x67,0x2F,0x53,0x74,0x79, - 0x20,0x72,0x47,0x72,0x54,0x39,0x4B,0x43,0x6F,0x44,0x4B,0x76,0x61,0x41,0x74, - 0x37,0x76,0x76,0x6C,0x44,0x74,0x4D,0x50,0x6C,0x2B,0x66,0x36,0x69,0x74,0x56, - 0x34,0x33,0x45,0x47,0x55,0x43,0x49,0x51,0x38,0x42,0x2F,0x63,0x6E,0x6D,0x44, - 0x6D,0x52,0x36,0x63,0x63,0x6C,0x31,0x34,0x49,0x59,0x51,0x7A,0x4B,0x2B,0x59, - 0x46,0x2F,0x4D,0x62,0x4B,0x4B,0x64,0x66,0x70,0x50,0x6A,0x42,0x74,0x20,0x2B, - 0x6C,0x44,0x73,0x46,0x59,0x70,0x49,0x49,0x67,0x30,0x67,0x35,0x49,0x7A,0x2F, - 0x48,0x37,0x6A,0x4C,0x35,0x62,0x32,0x46,0x71,0x52,0x67,0x6C,0x43,0x6F,0x6C, - 0x79,0x73,0x62,0x51,0x31,0x38,0x68,0x54,0x30,0x58,0x5A,0x67,0x32,0x6E,0x59, - 0x69,0x6E,0x50,0x79,0x54,0x55,0x41,0x47,0x44,0x61,0x42,0x2F,0x54,0x50,0x77, - 0x4A,0x2B,0x34,0x76,0x44,0x66,0x72,0x77,0x5A,0x32,0x72,0x20,0x46,0x41,0x6D, - 0x49,0x2B,0x46,0x6B,0x78,0x4C,0x2B,0x44,0x4F,0x61,0x4F,0x4C,0x2F,0x45,0x30, - 0x78,0x62,0x54,0x6F,0x7A,0x34,0x49,0x63,0x45,0x47,0x41,0x4E,0x4D,0x2B,0x71, - 0x43,0x38,0x42,0x58,0x33,0x46,0x35,0x62,0x32,0x50,0x47,0x52,0x41,0x49,0x61, - 0x45,0x78,0x42,0x78,0x73,0x61,0x72,0x4E,0x50,0x50,0x6B,0x6A,0x62,0x46,0x6E, - 0x2F,0x46,0x66,0x4C,0x37,0x2B,0x69,0x64,0x4A,0x20,0x2F,0x4A,0x42,0x77,0x41, - 0x34,0x42,0x70,0x48,0x39,0x67,0x44,0x57,0x47,0x34,0x6F,0x57,0x69,0x44,0x72, - 0x77,0x57,0x2B,0x75,0x6E,0x4E,0x4C,0x73,0x67,0x43,0x69,0x5A,0x6E,0x6E,0x61, - 0x66,0x33,0x31,0x77,0x5A,0x36,0x63,0x6D,0x2F,0x45,0x39,0x4E,0x32,0x45,0x79, - 0x64,0x2B,0x71,0x41,0x45,0x44,0x67,0x49,0x74,0x6D,0x42,0x6E,0x37,0x69,0x38, - 0x74,0x36,0x4D,0x42,0x37,0x65,0x74,0x20,0x7A,0x48,0x48,0x56,0x51,0x70,0x6D, - 0x41,0x69,0x4D,0x5A,0x56,0x43,0x33,0x31,0x75,0x63,0x38,0x2F,0x76,0x42,0x39, - 0x4E,0x57,0x45,0x7A,0x50,0x69,0x50,0x78,0x4D,0x31,0x59,0x51,0x41,0x68,0x6A, - 0x67,0x4B,0x2F,0x42,0x2B,0x78,0x78,0x65,0x56,0x50,0x68,0x7A,0x45,0x46,0x6C, - 0x44,0x41,0x70,0x58,0x72,0x6C,0x2B,0x53,0x63,0x7A,0x33,0x44,0x72,0x38,0x41, - 0x65,0x54,0x46,0x73,0x39,0x20,0x47,0x6E,0x65,0x64,0x34,0x71,0x52,0x6D,0x44, - 0x43,0x44,0x6B,0x6F,0x49,0x63,0x77,0x55,0x79,0x6C,0x76,0x75,0x64,0x35,0x6A, - 0x38,0x79,0x4B,0x66,0x32,0x31,0x64,0x71,0x56,0x79,0x45,0x78,0x4E,0x31,0x6B, - 0x50,0x62,0x6C,0x2B,0x5A,0x69,0x35,0x4C,0x68,0x42,0x36,0x5A,0x74,0x76,0x6A, - 0x76,0x64,0x6C,0x39,0x53,0x6E,0x50,0x39,0x53,0x51,0x41,0x63,0x43,0x30,0x44, - 0x2F,0x49,0x41,0x20,0x38,0x4E,0x73,0x34,0x4A,0x41,0x6F,0x56,0x36,0x47,0x6E, - 0x33,0x32,0x58,0x37,0x35,0x46,0x4B,0x30,0x4E,0x63,0x64,0x5A,0x4D,0x31,0x42, - 0x4F,0x74,0x44,0x62,0x44,0x39,0x38,0x73,0x68,0x6A,0x52,0x34,0x63,0x78,0x62, - 0x66,0x4D,0x41,0x4A,0x46,0x76,0x38,0x55,0x47,0x4D,0x47,0x41,0x42,0x65,0x5A, - 0x77,0x41,0x65,0x49,0x45,0x41,0x6B,0x73,0x61,0x51,0x6E,0x34,0x38,0x42,0x72, - 0x6C,0x20,0x43,0x6F,0x69,0x4C,0x57,0x64,0x70,0x71,0x32,0x6F,0x62,0x6A,0x71, - 0x72,0x34,0x43,0x62,0x32,0x48,0x61,0x5A,0x45,0x32,0x49,0x48,0x32,0x72,0x51, - 0x41,0x47,0x44,0x61,0x42,0x37,0x73,0x66,0x34,0x37,0x5A,0x4F,0x59,0x77,0x4A, - 0x67,0x39,0x68,0x50,0x59,0x76,0x6E,0x70,0x4B,0x69,0x34,0x6A,0x45,0x75,0x32, - 0x7A,0x73,0x39,0x4E,0x6D,0x2B,0x32,0x6E,0x6B,0x39,0x66,0x34,0x45,0x39,0x20, - 0x6D,0x4C,0x61,0x34,0x48,0x32,0x70,0x44,0x2F,0x46,0x43,0x6A,0x42,0x67,0x41, - 0x58,0x52,0x51,0x49,0x66,0x77,0x58,0x46,0x32,0x41,0x4D,0x77,0x4D,0x77,0x55, - 0x33,0x4C,0x63,0x6D,0x78,0x62,0x72,0x6E,0x47,0x42,0x4E,0x4A,0x50,0x31,0x59, - 0x4E,0x76,0x79,0x48,0x44,0x65,0x35,0x6E,0x64,0x73,0x58,0x35,0x69,0x65,0x59, - 0x4E,0x6C,0x67,0x7A,0x54,0x2F,0x34,0x43,0x4E,0x57,0x73,0x41,0x20,0x63,0x4E, - 0x48,0x41,0x34,0x4D,0x64,0x77,0x7A,0x42,0x4D,0x6F,0x73,0x4B,0x37,0x44,0x35, - 0x36,0x36,0x65,0x4B,0x52,0x62,0x72,0x33,0x49,0x48,0x55,0x73,0x61,0x67,0x6C, - 0x34,0x4B,0x36,0x65,0x4B,0x64,0x61,0x35,0x62,0x65,0x41,0x5A,0x5A,0x69,0x65, - 0x68,0x64,0x66,0x32,0x31,0x4A,0x48,0x36,0x6F,0x63,0x51,0x4F,0x41,0x61,0x52, - 0x2F,0x34,0x55,0x55,0x77,0x49,0x35,0x70,0x51,0x78,0x20,0x57,0x4B,0x43,0x6A, - 0x4B,0x65,0x42,0x44,0x6C,0x30,0x39,0x46,0x48,0x66,0x55,0x56,0x4E,0x63,0x6A, - 0x6D,0x52,0x54,0x36,0x2F,0x63,0x2F,0x6C,0x55,0x4B,0x63,0x66,0x51,0x66,0x77, - 0x58,0x54,0x35,0x6F,0x35,0x43,0x37,0x59,0x6B,0x66,0x6F,0x43,0x37,0x47,0x77, - 0x67,0x73,0x66,0x2F,0x44,0x30,0x62,0x4A,0x73,0x46,0x6B,0x58,0x66,0x30,0x53, - 0x2B,0x4C,0x4C,0x72,0x66,0x54,0x4B,0x65,0x20,0x6D,0x66,0x65,0x39,0x62,0x4C, - 0x37,0x50,0x63,0x79,0x65,0x79,0x6E,0x4A,0x39,0x53,0x76,0x36,0x41,0x65,0x6D, - 0x64,0x63,0x51,0x73,0x47,0x31,0x46,0x72,0x74,0x53,0x31,0x49,0x76,0x38,0x64, - 0x65,0x41,0x78,0x71,0x55,0x2F,0x67,0x46,0x61,0x6A,0x34,0x43,0x43,0x42,0x50, - 0x36,0x49,0x68,0x37,0x44,0x63,0x52,0x56,0x68,0x6D,0x47,0x58,0x7A,0x41,0x75, - 0x35,0x65,0x4F,0x36,0x58,0x73,0x20,0x77,0x54,0x72,0x6B,0x71,0x6F,0x55,0x2B, - 0x64,0x36,0x38,0x74,0x65,0x61,0x48,0x59,0x58,0x64,0x53,0x42,0x2B,0x4B,0x48, - 0x4F,0x44,0x41,0x41,0x75,0x57,0x6B,0x56,0x34,0x41,0x78,0x46,0x79,0x42,0x63, - 0x41,0x73,0x4A,0x74,0x72,0x61,0x6E,0x65,0x4E,0x44,0x70,0x59,0x57,0x49,0x49, - 0x69,0x45,0x55,0x75,0x6E,0x68,0x62,0x75,0x35,0x31,0x50,0x36,0x51,0x31,0x7A, - 0x47,0x4E,0x4F,0x6D,0x20,0x45,0x72,0x65,0x71,0x4C,0x79,0x70,0x31,0x5A,0x77, - 0x42,0x77,0x30,0x58,0x34,0x43,0x37,0x38,0x64,0x78,0x65,0x37,0x45,0x77,0x53, - 0x31,0x73,0x44,0x50,0x74,0x49,0x7A,0x78,0x58,0x57,0x4C,0x66,0x63,0x30,0x55, - 0x31,0x43,0x42,0x5A,0x44,0x36,0x35,0x62,0x37,0x50,0x4F,0x52,0x6E,0x70,0x4C, - 0x7A,0x50,0x6E,0x5A,0x68,0x32,0x6C,0x4B,0x69,0x31,0x76,0x4F,0x58,0x53,0x6C, - 0x30,0x61,0x20,0x41,0x46,0x77,0x30,0x51,0x2F,0x42,0x62,0x4F,0x47,0x34,0x30, - 0x47,0x69,0x62,0x6A,0x77,0x5A,0x62,0x46,0x4F,0x65,0x35,0x65,0x4F,0x38,0x55, - 0x56,0x37,0x6A,0x75,0x2F,0x69,0x69,0x70,0x78,0x78,0x51,0x49,0x54,0x37,0x6D, - 0x39,0x5A,0x48,0x48,0x6C,0x36,0x72,0x38,0x42,0x44,0x6D,0x44,0x5A,0x30,0x43, - 0x4F,0x70,0x48,0x2F,0x46,0x41,0x6E,0x67,0x34,0x43,0x7A,0x55,0x54,0x51,0x34, - 0x20,0x2B,0x43,0x6A,0x77,0x41,0x76,0x42,0x74,0x59,0x48,0x6D,0x55,0x2B,0x37, - 0x55,0x31,0x6D,0x6A,0x33,0x67,0x72,0x6C,0x72,0x6F,0x38,0x35,0x50,0x65,0x4C, - 0x47,0x66,0x47,0x46,0x42,0x49,0x6B,0x6B,0x55,0x55,0x74,0x41,0x54,0x66,0x46, - 0x63,0x33,0x7A,0x63,0x4B,0x63,0x77,0x55,0x33,0x33,0x4E,0x51,0x58,0x38,0x49, - 0x76,0x55,0x4C,0x63,0x52,0x51,0x4A,0x69,0x69,0x4C,0x63,0x64,0x76,0x20,0x6F, - 0x6F,0x51,0x75,0x41,0x56,0x78,0x49,0x46,0x39,0x32,0x32,0x33,0x50,0x6E,0x30, - 0x56,0x31,0x46,0x47,0x4F,0x70,0x6F,0x43,0x74,0x69,0x33,0x50,0x78,0x5A,0x58, - 0x6D,0x76,0x51,0x76,0x34,0x44,0x39,0x53,0x78,0x2B,0x43,0x45,0x6C,0x42,0x67, - 0x44,0x78,0x64,0x67,0x6B,0x4B,0x72,0x4F,0x76,0x77,0x2B,0x64,0x32,0x31,0x55, - 0x39,0x79,0x36,0x50,0x45,0x64,0x37,0x6F,0x34,0x79,0x67,0x20,0x57,0x72,0x51, - 0x33,0x6D,0x68,0x4F,0x69,0x66,0x6E,0x64,0x74,0x53,0x51,0x6B,0x39,0x59,0x65, - 0x6F,0x32,0x35,0x43,0x2B,0x6D,0x72,0x72,0x73,0x41,0x78,0x63,0x7A,0x51,0x4A, - 0x66,0x68,0x6E,0x34,0x45,0x6E,0x67,0x66,0x56,0x48,0x76,0x36,0x57,0x47,0x4F, - 0x4C,0x46,0x2F,0x58,0x34,0x62,0x4E,0x76,0x49,0x4D,0x50,0x72,0x2F,0x52,0x6B, - 0x47,0x4A,0x39,0x51,0x31,0x71,0x41,0x51,0x64,0x20,0x54,0x51,0x48,0x58,0x64, - 0x50,0x6D,0x73,0x37,0x2F,0x53,0x6A,0x72,0x4E,0x65,0x66,0x69,0x58,0x2F,0x44, - 0x62,0x4F,0x43,0x78,0x46,0x2B,0x70,0x62,0x2B,0x41,0x56,0x53,0x45,0x77,0x47, - 0x45,0x43,0x58,0x32,0x78,0x65,0x34,0x47,0x62,0x67,0x53,0x2B,0x57,0x65,0x6B, - 0x38,0x50,0x32,0x4E,0x42,0x70,0x42,0x70,0x33,0x75,0x75,0x43,0x78,0x48,0x74, - 0x31,0x59,0x61,0x6C,0x6F,0x33,0x75,0x20,0x31,0x6F,0x41,0x37,0x4C,0x6A,0x4F, - 0x44,0x73,0x68,0x76,0x69,0x45,0x2F,0x38,0x58,0x4D,0x57,0x30,0x68,0x4E,0x65, - 0x4B,0x48,0x6C,0x45,0x55,0x41,0x59,0x59,0x71,0x69,0x67,0x55,0x38,0x44,0x4F, - 0x34,0x43,0x2F,0x41,0x50,0x35,0x6A,0x71,0x66,0x64,0x65,0x33,0x65,0x61,0x7A, - 0x75,0x73,0x32,0x6E,0x62,0x38,0x7A,0x6A,0x39,0x66,0x34,0x4D,0x68,0x38,0x35, - 0x6C,0x38,0x4F,0x55,0x48,0x20,0x4A,0x5A,0x48,0x78,0x7A,0x46,0x34,0x4F,0x56, - 0x33,0x66,0x35,0x55,0x5A,0x66,0x71,0x7A,0x73,0x62,0x33,0x4D,0x64,0x2F,0x37, - 0x69,0x35,0x41,0x65,0x34,0x52,0x64,0x49,0x72,0x51,0x45,0x55,0x2B,0x4D,0x5A, - 0x62,0x6A,0x51,0x55,0x54,0x65,0x42,0x47,0x34,0x45,0x2F,0x67,0x73,0x38,0x45, - 0x67,0x63,0x39,0x31,0x37,0x53,0x45,0x6E,0x44,0x62,0x69,0x68,0x7A,0x6A,0x75, - 0x52,0x78,0x76,0x20,0x44,0x32,0x5A,0x34,0x61,0x30,0x44,0x64,0x41,0x31,0x63, - 0x36,0x6D,0x67,0x49,0x32,0x64,0x50,0x70,0x63,0x32,0x65,0x48,0x54,0x6E,0x49, - 0x33,0x39,0x39,0x67,0x38,0x52,0x4F,0x71,0x49,0x72,0x62,0x65,0x49,0x48,0x47, - 0x51,0x41,0x77,0x34,0x39,0x6A,0x41,0x64,0x34,0x44,0x2F,0x41,0x58,0x77,0x69, - 0x6A,0x76,0x73,0x33,0x5A,0x2B,0x47,0x61,0x4C,0x70,0x39,0x72,0x75,0x6E,0x78, - 0x36,0x20,0x52,0x7A,0x33,0x32,0x44,0x32,0x59,0x34,0x66,0x43,0x37,0x44,0x75, - 0x4C,0x59,0x6F,0x6E,0x4A,0x48,0x6D,0x4C,0x46,0x7A,0x65,0x37,0x76,0x4E,0x72, - 0x48,0x58,0x36,0x35,0x75,0x6C,0x4A,0x66,0x42,0x2F,0x36,0x47,0x47,0x6C,0x75, - 0x37,0x58,0x77,0x35,0x6B,0x41,0x43,0x46,0x43,0x30,0x63,0x42,0x2B,0x34,0x46, - 0x35,0x4D,0x74,0x2B,0x42,0x2B,0x59,0x48,0x74,0x63,0x66,0x36,0x4F,0x37,0x20, - 0x4E,0x61,0x43,0x37,0x4E,0x63,0x66,0x4E,0x79,0x33,0x49,0x63,0x47,0x2F,0x5A, - 0x34,0x35,0x31,0x79,0x47,0x49,0x2B,0x63,0x79,0x54,0x4B,0x51,0x38,0x76,0x36, - 0x67,0x70,0x41,0x36,0x76,0x62,0x66,0x64,0x61,0x32,0x2B,0x31,0x7A,0x57,0x46, - 0x73,0x54,0x56,0x72,0x79,0x39,0x6D,0x4A,0x2F,0x41,0x45,0x38,0x48,0x54,0x68, - 0x46,0x32,0x6B,0x57,0x50,0x38,0x67,0x41,0x4C,0x71,0x49,0x6F,0x20,0x47,0x6E, - 0x67,0x36,0x66,0x2F,0x30,0x70,0x78,0x67,0x68,0x36,0x34,0x76,0x6F,0x37,0x48, - 0x75,0x61,0x67,0x69,0x56,0x56,0x74,0x4F,0x66,0x78,0x6C,0x4F,0x59,0x36,0x50, - 0x65,0x42,0x77,0x66,0x79,0x58,0x42,0x30,0x78,0x47,0x4D,0x6F,0x4A,0x64,0x32, - 0x45,0x39,0x73,0x61,0x41,0x31,0x57,0x30,0x42,0x4B,0x2B,0x66,0x37,0x72,0x4A, - 0x77,0x66,0x6C,0x4A,0x71,0x74,0x64,0x79,0x6B,0x4F,0x20,0x59,0x6F,0x54,0x2F, - 0x74,0x34,0x56,0x66,0x70,0x46,0x33,0x34,0x42,0x57,0x51,0x41,0x73,0x31,0x42, - 0x6B,0x42,0x48,0x38,0x4C,0x2F,0x42,0x33,0x77,0x49,0x44,0x47,0x4E,0x44,0x34, - 0x54,0x4A,0x65,0x42,0x66,0x4D,0x34,0x45,0x5A,0x67,0x65,0x4E,0x4C,0x6A,0x36, - 0x49,0x6A,0x48,0x73,0x57,0x47,0x50,0x55,0x36,0x4D,0x5A,0x78,0x75,0x71,0x6B, - 0x71,0x39,0x43,0x53,0x68,0x61,0x57,0x74,0x20,0x50,0x69,0x76,0x6D,0x47,0x2B, - 0x46,0x58,0x4B,0x48,0x66,0x69,0x49,0x65,0x44,0x7A,0x67,0x41,0x38,0x53,0x66, - 0x6A,0x45,0x79,0x67,0x44,0x6B,0x49,0x64,0x51,0x74,0x38,0x7A,0x50,0x6A,0x41, - 0x34,0x38,0x41,0x66,0x41,0x35,0x38,0x70,0x31,0x39,0x39,0x73,0x61,0x77,0x7A, - 0x59,0x32,0x42,0x6D,0x77,0x73,0x52,0x4D,0x67,0x78,0x39,0x43,0x45,0x52,0x2B, - 0x2B,0x6F,0x78,0x36,0x2F,0x4F,0x20,0x65,0x35,0x77,0x65,0x38,0x7A,0x67,0x37, - 0x58,0x68,0x73,0x52,0x77,0x73,0x4C,0x6D,0x67,0x4D,0x55,0x74,0x41,0x63,0x76, - 0x6E,0x42,0x58,0x53,0x33,0x42,0x69,0x79,0x6F,0x62,0x4E,0x62,0x6B,0x35,0x7A, - 0x44,0x48,0x63,0x66,0x55,0x58,0x66,0x69,0x48,0x78,0x58,0x34,0x77,0x4D,0x77, - 0x49,0x4B,0x69,0x61,0x4B,0x41,0x66,0x4D,0x31,0x50,0x77,0x4A,0x65,0x43,0x54, - 0x6D,0x4B,0x37,0x42,0x20,0x73,0x6E,0x4C,0x2B,0x2F,0x51,0x56,0x4E,0x52,0x6A, - 0x78,0x58,0x64,0x6C,0x7A,0x34,0x33,0x63,0x43,0x34,0x78,0x37,0x6C,0x4A,0x47, - 0x4A,0x72,0x30,0x47,0x42,0x6A,0x33,0x36,0x42,0x38,0x33,0x58,0x59,0x64,0x4B, - 0x52,0x77,0x73,0x74,0x57,0x56,0x4F,0x2F,0x72,0x75,0x61,0x41,0x7A,0x75,0x61, - 0x41,0x42,0x59,0x30,0x42,0x37,0x59,0x33,0x51,0x32,0x56,0x79,0x56,0x65,0x63, - 0x2B,0x54,0x20,0x6D,0x46,0x44,0x2F,0x63,0x53,0x52,0x38,0x4B,0x32,0x51,0x41, - 0x44,0x73,0x78,0x67,0x42,0x49,0x2F,0x6D,0x72,0x2F,0x73,0x77,0x52,0x72,0x43, - 0x70,0x55,0x6E,0x58,0x70,0x62,0x41,0x37,0x6F,0x62,0x41,0x61,0x59,0x4C,0x72, - 0x51,0x4A,0x48,0x34,0x59,0x6D,0x50,0x50,0x72,0x48,0x50,0x45,0x5A,0x7A,0x70, - 0x6A,0x73,0x42,0x35,0x6E,0x65,0x46,0x67,0x63,0x5A,0x4A,0x6E,0x31,0x6D,0x6E, - 0x20,0x49,0x78,0x63,0x32,0x42,0x39,0x4F,0x57,0x50,0x52,0x65,0x2F,0x37,0x6D, - 0x6F,0x4A,0x79,0x4F,0x62,0x2F,0x75,0x36,0x41,0x70,0x6F,0x43,0x6B,0x5A,0x71, - 0x57,0x52,0x37,0x4D,0x63,0x4C,0x2F,0x61,0x76,0x69,0x58,0x45,0x76,0x37,0x63, - 0x79,0x41,0x41,0x69,0x45,0x47,0x35,0x59,0x65,0x54,0x50,0x34,0x61,0x76,0x37, - 0x36,0x45,0x4D,0x59,0x49,0x37,0x71,0x78,0x4B,0x78,0x54,0x43,0x6A,0x20,0x36, - 0x59,0x74,0x62,0x67,0x72,0x52,0x73,0x63,0x4B,0x70,0x52,0x2F,0x52,0x4C,0x78, - 0x67,0x71,0x43,0x30,0x68,0x76,0x4C,0x45,0x4B,0x2B,0x4D,0x78,0x56,0x61,0x57, - 0x75,0x36,0x41,0x45,0x2B,0x44,0x76,0x77,0x42,0x5A,0x65,0x34,0x65,0x70,0x4A, - 0x43,0x54,0x77,0x4E,0x65,0x41,0x62,0x32,0x4A,0x47,0x39,0x31,0x50,0x4E,0x2F, - 0x56,0x75,0x61,0x53,0x33,0x70,0x2F,0x4D,0x67,0x4B,0x34,0x20,0x2B,0x75,0x4D, - 0x67,0x38,0x44,0x42,0x6D,0x33,0x34,0x48,0x66,0x42,0x70,0x36,0x71,0x62,0x6E, - 0x58,0x71,0x67,0x71,0x63,0x77,0x6E,0x2B,0x56,0x79,0x7A,0x47,0x65,0x62,0x65, - 0x76,0x48,0x48,0x67,0x62,0x6F,0x41,0x35,0x57,0x64,0x6E,0x2F,0x75,0x72,0x43, - 0x64,0x41,0x30,0x2B,0x43,0x76,0x78,0x4F,0x56,0x57,0x74,0x55,0x4F,0x33,0x77, - 0x58,0x6B,0x35,0x57,0x35,0x69,0x39,0x43,0x67,0x20,0x6E,0x6F,0x67,0x50,0x47, - 0x55,0x44,0x6C,0x36,0x41,0x66,0x2B,0x49,0x58,0x38,0x74,0x41,0x65,0x37,0x49, - 0x58,0x39,0x76,0x7A,0x72,0x34,0x58,0x35,0x6A,0x4C,0x34,0x4C,0x50,0x4A,0x4F, - 0x2F,0x2B,0x71,0x70,0x62,0x6E,0x66,0x70,0x48,0x42,0x6C,0x41,0x64,0x2B,0x72, - 0x68,0x67,0x42,0x6D,0x42,0x6D,0x44,0x37,0x5A,0x6A,0x49,0x6F,0x53,0x62,0x67, - 0x66,0x69,0x58,0x76,0x53,0x53,0x54,0x20,0x48,0x47,0x61,0x62,0x74,0x6D,0x63, - 0x78,0x77,0x6E,0x2B,0x31,0x75,0x74,0x56,0x4A,0x48,0x7A,0x4B,0x41,0x5A,0x4C, - 0x41,0x33,0x66,0x2F,0x31,0x31,0x2F,0x76,0x56,0x57,0x34,0x42,0x61,0x4D,0x47, - 0x57,0x77,0x46,0x46,0x6C,0x65,0x70,0x58,0x6E,0x46,0x7A,0x47,0x74,0x69,0x4E, - 0x45,0x66,0x33,0x7A,0x2B,0x5A,0x39,0x46,0x46,0x5A,0x45,0x42,0x4A,0x4A,0x50, - 0x64,0x2B,0x61,0x75,0x77,0x20,0x55,0x63,0x6C,0x36,0x4C,0x68,0x6A,0x43,0x72, - 0x77,0x50,0x58,0x56,0x4B,0x6C,0x65,0x72,0x72,0x77,0x4F,0x2F,0x49,0x77,0x4C, - 0x67,0x74,0x39,0x58,0x33,0x65,0x71,0x49,0x59,0x6D,0x51,0x41,0x74,0x63,0x47, - 0x2B,0x2F,0x50,0x58,0x31,0x2F,0x47,0x73,0x50,0x75,0x41,0x6F,0x7A,0x33,0x62, - 0x67,0x75,0x2F,0x2F,0x4F,0x6D,0x2F,0x4D,0x2B,0x56,0x6A,0x68,0x5A,0x4F,0x59, - 0x34,0x35,0x69,0x20,0x32,0x77,0x75,0x38,0x6B,0x66,0x2F,0x35,0x59,0x50,0x37, - 0x6E,0x56,0x43,0x51,0x6A,0x31,0x44,0x49,0x79,0x67,0x4E,0x6F,0x6B,0x41,0x48, - 0x36,0x52,0x76,0x34,0x72,0x70,0x78,0x42,0x6A,0x42,0x74,0x5A,0x6A,0x42,0x78, - 0x63,0x49,0x4B,0x78,0x6E,0x56,0x41,0x49,0x5A,0x6D,0x34,0x44,0x66,0x69,0x31, - 0x57,0x65,0x37,0x39,0x4F,0x6A,0x41,0x52,0x65,0x72,0x32,0x33,0x36,0x50,0x57, - 0x72,0x20,0x2B,0x64,0x65,0x76,0x59,0x73,0x51,0x2B,0x34,0x46,0x35,0x39,0x6B, - 0x52,0x52,0x6B,0x41,0x50,0x58,0x48,0x41,0x50,0x42,0x79,0x2F,0x72,0x6F,0x55, - 0x73,0x36,0x30,0x6F,0x30,0x6C,0x4D,0x37,0x52,0x63,0x67,0x41,0x30,0x6F,0x75, - 0x45,0x4C,0x70,0x51,0x4A,0x4B,0x45,0x53,0x61,0x4B,0x58,0x6B,0x74,0x67,0x42, - 0x43,0x69,0x64,0x6C,0x45,0x45,0x49,0x45,0x53,0x4B,0x6B,0x51,0x45,0x49,0x20, - 0x6B,0x57,0x4A,0x6B,0x41,0x45,0x4B,0x6B,0x47,0x42,0x6D,0x41,0x45,0x43,0x6C, - 0x47,0x42,0x69,0x42,0x45,0x69,0x70,0x45,0x42,0x43,0x4A,0x46,0x69,0x2F,0x68, - 0x30,0x37,0x77,0x4F,0x37,0x35,0x36,0x2F,0x2B,0x71,0x74,0x67,0x41,0x41,0x41, - 0x41,0x42,0x4A,0x52,0x55,0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D,0x3D, - 0x5D,0x5D,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x74,0x61,0x72,0x31,0x5F, - 0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x43,0x41,0x41,0x41,0x41,0x41,0x67,0x43, - 0x41,0x59,0x41,0x41,0x41,0x42,0x7A,0x65,0x6E,0x72,0x30,0x41,0x41,0x41,0x42, - 0x53,0x45,0x6C,0x45,0x51,0x56,0x52,0x59,0x68,0x65,0x32,0x57,0x30,0x57,0x33, - 0x43,0x4D,0x42,0x43,0x47,0x76,0x31,0x53,0x38,0x20,0x4E,0x79,0x4E,0x55,0x36, - 0x67,0x4B,0x77,0x51,0x64,0x6D,0x6B,0x33,0x53,0x42,0x4D,0x41,0x45,0x78,0x41, - 0x6D,0x51,0x42,0x31,0x41,0x74,0x6F,0x4A,0x6D,0x6B,0x35,0x51,0x47,0x41,0x43, - 0x4A,0x45,0x63,0x49,0x45,0x36,0x59,0x4D,0x64,0x39,0x62,0x42,0x51,0x66,0x4F, - 0x65,0x6B,0x53,0x68,0x2F,0x79,0x50,0x7A,0x6D,0x4F,0x37,0x66,0x2F,0x2F,0x7A, - 0x33,0x65,0x32,0x73,0x37,0x71,0x75,0x20,0x47,0x52,0x4A,0x33,0x67,0x37,0x4B, - 0x50,0x41,0x6B,0x59,0x42,0x2F,0x30,0x48,0x41,0x70,0x4B,0x2B,0x46,0x54,0x70, - 0x66,0x72,0x37,0x38,0x64,0x37,0x33,0x62,0x7A,0x4F,0x45,0x54,0x68,0x64,0x72, - 0x73,0x68,0x58,0x77,0x4E,0x51,0x79,0x58,0x78,0x57,0x42,0x30,0x42,0x30,0x34, - 0x68,0x36,0x49,0x2F,0x42,0x7A,0x62,0x41,0x4D,0x31,0x44,0x32,0x4C,0x73,0x42, - 0x6A,0x41,0x78,0x77,0x39,0x20,0x77,0x54,0x6B,0x67,0x2F,0x38,0x54,0x6F,0x50, - 0x45,0x56,0x41,0x44,0x75,0x78,0x38,0x2B,0x2B,0x43,0x46,0x66,0x50,0x6D,0x2B, - 0x50,0x49,0x55,0x63,0x49,0x4E,0x50,0x63,0x42,0x64,0x37,0x74,0x46,0x50,0x68, - 0x57,0x72,0x44,0x6B,0x48,0x79,0x72,0x39,0x49,0x77,0x73,0x5A,0x31,0x44,0x44, - 0x6E,0x63,0x7A,0x70,0x74,0x6B,0x41,0x63,0x4C,0x4E,0x6D,0x32,0x4C,0x34,0x44, - 0x69,0x67,0x61,0x20,0x45,0x54,0x45,0x68,0x71,0x69,0x31,0x6F,0x46,0x76,0x50, - 0x51,0x33,0x74,0x38,0x6C,0x73,0x4D,0x42,0x46,0x44,0x72,0x68,0x39,0x4E,0x71, - 0x67,0x69,0x49,0x4D,0x67,0x4C,0x4A,0x54,0x6E,0x41,0x45,0x79,0x35,0x6E,0x56, - 0x72,0x51,0x6B,0x71,0x53,0x55,0x48,0x48,0x6F,0x43,0x6C,0x59,0x54,0x77,0x34, - 0x39,0x31,0x58,0x62,0x67,0x47,0x67,0x5A,0x43,0x76,0x66,0x61,0x63,0x6A,0x73, - 0x44,0x20,0x37,0x38,0x44,0x57,0x74,0x31,0x75,0x68,0x50,0x51,0x63,0x4B,0x58, - 0x45,0x68,0x6A,0x4F,0x41,0x41,0x7A,0x32,0x52,0x45,0x72,0x52,0x38,0x74,0x42, - 0x74,0x42,0x59,0x6B,0x46,0x62,0x38,0x48,0x6B,0x34,0x7A,0x4B,0x68,0x34,0x59, - 0x30,0x52,0x63,0x42,0x72,0x79,0x37,0x2B,0x39,0x61,0x4A,0x64,0x36,0x61,0x67, - 0x64,0x31,0x47,0x59,0x59,0x49,0x62,0x73,0x41,0x6D,0x4F,0x54,0x4F,0x77,0x20, - 0x52,0x53,0x42,0x5A,0x51,0x43,0x42,0x69,0x6A,0x39,0x75,0x4B,0x75,0x59,0x55, - 0x63,0x4F,0x72,0x34,0x48,0x42,0x4E,0x6B,0x4C,0x4C,0x75,0x76,0x4E,0x36,0x4F, - 0x74,0x4A,0x56,0x75,0x46,0x4B,0x7A,0x34,0x78,0x4F,0x57,0x39,0x41,0x48,0x42, - 0x6E,0x2B,0x55,0x6A,0x67,0x4A,0x47,0x41,0x54,0x2F,0x6D,0x2F,0x46,0x57,0x39, - 0x51,0x77,0x43,0x69,0x33,0x41,0x41,0x41,0x41,0x41,0x42,0x4A,0x20,0x52,0x55, - 0x35,0x45,0x72,0x6B,0x4A,0x67,0x67,0x67,0x3D,0x3D,0x5D,0x5D,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72, - 0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x28,0x73,0x63,0x61,0x6C,0x65, - 0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6E, - 0x20,0x7B,0x20,0x78,0x30,0x20,0x3D,0x20,0x2D,0x31,0x30,0x30,0x2C,0x20,0x78, - 0x20,0x3D,0x20,0x31,0x30,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D,0x20,0x6D,0x61, - 0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x36, - 0x30,0x30,0x2C,0x20,0x72,0x30,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72, - 0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x6D,0x61,0x74,0x68,0x2E, - 0x70,0x69,0x20,0x2A,0x20,0x32,0x2C,0x20,0x72,0x76,0x20,0x3D,0x20,0x6D,0x61, - 0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x6D, - 0x61,0x74,0x68,0x2E,0x70,0x69,0x20,0x2A,0x20,0x34,0x2C,0x20,0x74,0x20,0x3D, - 0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x28,0x29,0x2C, - 0x20,0x73,0x63,0x61,0x6C,0x65,0x20,0x3D,0x20,0x73,0x63,0x61,0x6C,0x65,0x2C, - 0x20,0x73,0x70,0x65,0x65,0x64,0x20,0x3D,0x20,0x73,0x70,0x65,0x65,0x64,0x2C, - 0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75, - 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73, - 0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x6E,0x75,0x6D,0x5F,0x73, - 0x74,0x61,0x72,0x73,0x2C,0x20,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70, - 0x65,0x65,0x64,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x6C,0x61,0x79,0x65, - 0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F,0x72,0x20,0x69,0x20,0x3D,0x20, - 0x31,0x2C,0x6E,0x75,0x6D,0x5F,0x73,0x74,0x61,0x72,0x73,0x20,0x64,0x6F,0x20, - 0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61, - 0x79,0x65,0x72,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61, - 0x72,0x28,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x73,0x70,0x65,0x65,0x64,0x29, - 0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x6C,0x61, - 0x79,0x65,0x72,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F, - 0x73,0x74,0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x73,0x29,0x20,0x73,0x2E,0x74, - 0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2B,0x20,0x30,0x2E,0x31,0x20,0x2A,0x20, - 0x73,0x2E,0x73,0x70,0x65,0x65,0x64,0x20,0x2A,0x20,0x64,0x74,0x20,0x77,0x68, - 0x69,0x6C,0x65,0x20,0x73,0x2E,0x74,0x20,0x3E,0x20,0x31,0x20,0x64,0x6F,0x20, - 0x73,0x2E,0x74,0x20,0x3D,0x20,0x73,0x2E,0x74,0x20,0x2D,0x20,0x31,0x20,0x65, - 0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75, - 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61, - 0x72,0x28,0x73,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x78,0x20,0x3D,0x20, - 0x73,0x2E,0x78,0x30,0x20,0x2B,0x20,0x73,0x2E,0x78,0x20,0x2A,0x20,0x73,0x2E, - 0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D,0x20,0x73,0x2E,0x79, - 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x72,0x20,0x3D,0x20,0x73,0x2E,0x72,0x30, - 0x20,0x2B,0x20,0x73,0x2E,0x72,0x76,0x20,0x2A,0x20,0x73,0x2E,0x74,0x20,0x6C, - 0x6F,0x63,0x61,0x6C,0x20,0x73,0x78,0x20,0x3D,0x20,0x73,0x2E,0x73,0x63,0x61, - 0x6C,0x65,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x73,0x79,0x20,0x3D,0x20,0x73, - 0x2E,0x73,0x63,0x61,0x6C,0x65,0x20,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,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x32,0x35, - 0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x2C,0x20,0x32,0x35,0x35,0x2C, - 0x20,0x32,0x35,0x35,0x2A,0x73,0x2E,0x73,0x63,0x61,0x6C,0x65,0x29,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72, - 0x61,0x77,0x28,0x73,0x74,0x61,0x72,0x31,0x2C,0x20,0x78,0x2C,0x20,0x79,0x2C, - 0x20,0x72,0x2C,0x20,0x73,0x78,0x2C,0x20,0x73,0x79,0x2C,0x20,0x31,0x36,0x2C, - 0x20,0x31,0x36,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65, - 0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x64,0x74,0x2C, - 0x20,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x76, - 0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65, - 0x72,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x73,0x74, - 0x61,0x72,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x65, - 0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, - 0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61, - 0x79,0x65,0x72,0x28,0x6C,0x61,0x79,0x65,0x72,0x29,0x20,0x66,0x6F,0x72,0x20, - 0x6B,0x2C,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6C, - 0x61,0x79,0x65,0x72,0x29,0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77,0x5F,0x73, - 0x74,0x61,0x72,0x28,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20, - 0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, - 0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x70,0x29, - 0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x7B,0x20,0x70,0x20,0x3D,0x20,0x70, - 0x2C,0x20,0x74,0x30,0x20,0x3D,0x20,0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E, - 0x64,0x6F,0x6D,0x28,0x29,0x20,0x2A,0x20,0x31,0x30,0x2C,0x20,0x74,0x20,0x3D, - 0x20,0x30,0x20,0x7D,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20, - 0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x72,0x65,0x61,0x74,0x65, - 0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x28,0x6E,0x29,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x74,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x66,0x6F,0x72,0x20,0x69,0x20, - 0x3D,0x20,0x31,0x2C,0x6E,0x20,0x64,0x6F,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E, - 0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x74,0x2C,0x20,0x63,0x72,0x65,0x61,0x74, - 0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x28,0x6D,0x61,0x74,0x68,0x2E,0x70, - 0x69,0x20,0x2A,0x20,0x32,0x20,0x2F,0x20,0x6E,0x29,0x20,0x2A,0x20,0x69,0x29, - 0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x74,0x20, - 0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74, - 0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C, - 0x6C,0x28,0x64,0x74,0x2C,0x20,0x6B,0x29,0x20,0x6B,0x2E,0x74,0x20,0x3D,0x20, - 0x6B,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72, - 0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x6B,0x29,0x20,0x6C,0x6F,0x63, - 0x61,0x6C,0x20,0x78,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x78, - 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x79,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E, - 0x65,0x74,0x2E,0x79,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x61,0x20,0x3D,0x20, - 0x6B,0x2E,0x70,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x20,0x6C,0x6F,0x63,0x61,0x6C, - 0x20,0x68,0x20,0x3D,0x20,0x32,0x32,0x35,0x20,0x2B,0x20,0x32,0x30,0x20,0x2A, - 0x20,0x28,0x31,0x20,0x2B,0x20,0x6D,0x61,0x74,0x68,0x2E,0x73,0x69,0x6E,0x28, - 0x6B,0x2E,0x74,0x30,0x20,0x2B,0x20,0x6B,0x2E,0x74,0x29,0x29,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61, - 0x77,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x2C,0x20,0x78,0x2C,0x20,0x79,0x2C, - 0x20,0x61,0x2C,0x20,0x2E,0x37,0x35,0x2C,0x20,0x2E,0x37,0x35,0x2C,0x20,0x36, - 0x34,0x2C,0x20,0x68,0x29,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C, - 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61,0x74, - 0x65,0x5F,0x6C,0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20,0x6C,0x6F,0x67,0x6F, - 0x2E,0x72,0x20,0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x2B,0x20,0x64, - 0x74,0x20,0x69,0x66,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x3E,0x20,0x33, - 0x36,0x30,0x20,0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20, - 0x3D,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x20,0x2D,0x20,0x33,0x36,0x30,0x20, - 0x65,0x6E,0x64,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x20,0x3D,0x20,0x70,0x6C, - 0x61,0x6E,0x65,0x74,0x2E,0x79,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61, - 0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x70,0x64,0x61, - 0x74,0x65,0x5F,0x70,0x6C,0x61,0x6E,0x65,0x74,0x28,0x64,0x74,0x29,0x20,0x70, - 0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x20,0x3D,0x20,0x70,0x6C,0x61,0x6E,0x65, - 0x74,0x2E,0x74,0x20,0x2B,0x20,0x64,0x74,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74, - 0x2E,0x79,0x20,0x3D,0x20,0x33,0x30,0x30,0x20,0x2B,0x20,0x6D,0x61,0x74,0x68, - 0x2E,0x73,0x69,0x6E,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x74,0x29,0x2A, - 0x33,0x30,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75, - 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61, - 0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x62,0x36,0x34,0x2C,0x20,0x66,0x69,0x6C, - 0x65,0x6E,0x61,0x6D,0x65,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x69, - 0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,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,0x62,0x36,0x34,0x2C,0x20,0x66,0x69, - 0x6C,0x65,0x6E,0x61,0x6D,0x65,0x2C,0x20,0x22,0x62,0x61,0x73,0x65,0x36,0x34, - 0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x69,0x6D,0x61,0x67,0x65,0x5F, - 0x64,0x61,0x74,0x61,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x69,0x6D,0x61, - 0x67,0x65,0x2E,0x6E,0x65,0x77,0x49,0x6D,0x61,0x67,0x65,0x44,0x61,0x74,0x61, - 0x28,0x66,0x69,0x6C,0x65,0x5F,0x64,0x61,0x74,0x61,0x29,0x20,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,0x69,0x6D,0x61, - 0x67,0x65,0x5F,0x64,0x61,0x74,0x61,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x75, - 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x6C,0x6F,0x61, - 0x64,0x28,0x29,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x20,0x3D,0x20,0x7B,0x20, - 0x78,0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D,0x20,0x33,0x30, - 0x30,0x2C,0x20,0x77,0x20,0x3D,0x20,0x31,0x32,0x38,0x2C,0x20,0x68,0x20,0x3D, - 0x20,0x31,0x32,0x38,0x2C,0x20,0x74,0x20,0x3D,0x20,0x30,0x2C,0x20,0x69,0x6D, - 0x67,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F, - 0x62,0x36,0x34,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x5F,0x62,0x61,0x73,0x65, - 0x36,0x34,0x2C,0x20,0x22,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x70,0x6E,0x67, - 0x22,0x29,0x20,0x7D,0x20,0x6C,0x6F,0x67,0x6F,0x20,0x3D,0x20,0x7B,0x20,0x78, - 0x20,0x3D,0x20,0x34,0x30,0x30,0x2C,0x20,0x79,0x20,0x3D,0x20,0x33,0x30,0x30, - 0x2C,0x20,0x77,0x20,0x3D,0x20,0x32,0x35,0x36,0x2C,0x20,0x68,0x20,0x3D,0x20, - 0x36,0x34,0x2C,0x20,0x72,0x20,0x3D,0x20,0x30,0x2C,0x20,0x69,0x6D,0x67,0x20, - 0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36, - 0x34,0x28,0x6C,0x6F,0x76,0x65,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20, - 0x22,0x6C,0x6F,0x76,0x65,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x7D,0x20,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,0x38,0x2C,0x20,0x31,0x38,0x2C,0x20,0x31,0x38,0x29,0x20,0x73, - 0x74,0x61,0x72,0x31,0x20,0x3D,0x20,0x6C,0x6F,0x61,0x64,0x5F,0x69,0x6D,0x61, - 0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x73,0x74,0x61,0x72,0x31,0x5F,0x62,0x61, - 0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x73,0x74,0x61,0x72,0x31,0x2E,0x70,0x6E, - 0x67,0x22,0x29,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x31,0x20,0x3D,0x20,0x6C,0x6F, - 0x61,0x64,0x5F,0x69,0x6D,0x61,0x67,0x65,0x5F,0x62,0x36,0x34,0x28,0x6B,0x6E, - 0x6F,0x6C,0x6C,0x31,0x5F,0x62,0x61,0x73,0x65,0x36,0x34,0x2C,0x20,0x22,0x6B, - 0x6E,0x6F,0x6C,0x6C,0x31,0x2E,0x70,0x6E,0x67,0x22,0x29,0x20,0x6C,0x61,0x79, - 0x65,0x72,0x73,0x20,0x3D,0x20,0x7B,0x7D,0x20,0x6B,0x6E,0x6F,0x6C,0x6C,0x73, - 0x20,0x3D,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C, - 0x73,0x28,0x31,0x30,0x29,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73, - 0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65, - 0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28, - 0x31,0x30,0x30,0x2C,0x20,0x30,0x2E,0x35,0x2C,0x20,0x30,0x2E,0x35,0x29,0x29, - 0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C, - 0x61,0x79,0x65,0x72,0x73,0x2C,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73, - 0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x37,0x30,0x2C,0x20,0x30, - 0x2E,0x37,0x2C,0x20,0x30,0x2E,0x37,0x29,0x29,0x20,0x74,0x61,0x62,0x6C,0x65, - 0x2E,0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x6C,0x61,0x79,0x65,0x72,0x73,0x2C, - 0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61, - 0x79,0x65,0x72,0x28,0x35,0x30,0x2C,0x20,0x31,0x2C,0x20,0x31,0x29,0x29,0x20, - 0x6D,0x61,0x74,0x68,0x2E,0x72,0x61,0x6E,0x64,0x6F,0x6D,0x73,0x65,0x65,0x64, - 0x28,0x6F,0x73,0x2E,0x74,0x69,0x6D,0x65,0x28,0x29,0x29,0x20,0x65,0x6E,0x64, - 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76, - 0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6C,0x61,0x79,0x65, - 0x72,0x73,0x29,0x20,0x64,0x6F,0x20,0x64,0x72,0x61,0x77,0x5F,0x73,0x74,0x61, - 0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x76,0x29,0x20,0x65,0x6E,0x64,0x20, - 0x66,0x6F,0x72,0x20,0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61, - 0x69,0x72,0x73,0x28,0x6B,0x6E,0x6F,0x6C,0x6C,0x73,0x29,0x20,0x64,0x6F,0x20, - 0x64,0x72,0x61,0x77,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x76,0x29,0x20,0x65, - 0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63, - 0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x69, - 0x6D,0x67,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x78,0x2C,0x20,0x70, - 0x6C,0x61,0x6E,0x65,0x74,0x2E,0x79,0x2C,0x20,0x30,0x2C,0x20,0x31,0x2C,0x20, - 0x31,0x2C,0x20,0x70,0x6C,0x61,0x6E,0x65,0x74,0x2E,0x77,0x2C,0x20,0x70,0x6C, - 0x61,0x6E,0x65,0x74,0x2E,0x68,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, - 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x64,0x72,0x61,0x77,0x28,0x6C,0x6F,0x67, - 0x6F,0x2E,0x69,0x6D,0x67,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x78,0x2C,0x20, - 0x6C,0x6F,0x67,0x6F,0x2E,0x79,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x72,0x2C, - 0x20,0x31,0x2C,0x20,0x31,0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x77,0x2F,0x32, - 0x2C,0x20,0x6C,0x6F,0x67,0x6F,0x2E,0x68,0x2F,0x32,0x29,0x20,0x65,0x6E,0x64, - 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x75,0x70,0x64,0x61,0x74,0x65,0x28,0x64,0x74,0x29,0x20,0x66,0x6F,0x72,0x20, - 0x6B,0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28, - 0x6C,0x61,0x79,0x65,0x72,0x73,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61, - 0x74,0x65,0x5F,0x73,0x74,0x61,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x28,0x64, - 0x74,0x2C,0x20,0x76,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x6F,0x72,0x20,0x6B, - 0x2C,0x20,0x76,0x20,0x69,0x6E,0x20,0x69,0x70,0x61,0x69,0x72,0x73,0x28,0x6B, - 0x6E,0x6F,0x6C,0x6C,0x73,0x29,0x20,0x64,0x6F,0x20,0x75,0x70,0x64,0x61,0x74, - 0x65,0x5F,0x6B,0x6E,0x6F,0x6C,0x6C,0x28,0x64,0x74,0x2C,0x20,0x76,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x70,0x6C,0x61,0x6E, - 0x65,0x74,0x28,0x64,0x74,0x29,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x5F,0x6C, - 0x6F,0x67,0x6F,0x28,0x64,0x74,0x29,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E, - 0x63,0x74,0x69,0x6F,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x63,0x6F,0x6E,0x66, - 0x28,0x74,0x29,0x20,0x74,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20,0x3D,0x20,0x22, - 0x4C,0x4F,0x56,0x45,0x20,0x22,0x20,0x2E,0x2E,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x5F,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x5F,0x73,0x74,0x72,0x69,0x6E,0x67, - 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,0x20,0x74,0x2E,0x6D, - 0x6F,0x64,0x75,0x6C,0x65,0x73,0x2E,0x61,0x75,0x64,0x69,0x6F,0x20,0x3D,0x20, - 0x66,0x61,0x6C,0x73,0x65,0x20,0x74,0x2E,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x73, - 0x2E,0x73,0x6F,0x75,0x6E,0x64,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x20, - 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,0x20,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,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64, - 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x64,0x65,0x62,0x75,0x67,0x20,0x3D,0x20, - 0x64,0x65,0x62,0x75,0x67,0x20,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,0x20,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,0x6D,0x73,0x67,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,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x65,0x72,0x72,0x6F,0x72,0x5F, - 0x70,0x72,0x69,0x6E,0x74,0x65,0x72,0x28,0x6D,0x73,0x67,0x2C,0x20,0x32,0x29, - 0x20,0x69,0x66,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,0x6F,0x72,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,0x74,0x68, - 0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x72,0x65, - 0x73,0x65,0x74,0x28,0x29,0x20,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,0x20,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,0x31,0x34, - 0x29,0x20,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,0x20, - 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,0x20,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,0x20, - 0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63, - 0x6C,0x65,0x61,0x72,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x72, - 0x72,0x20,0x3D,0x20,0x7B,0x7D,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,0x74,0x61,0x62,0x6C,0x65,0x2E, - 0x69,0x6E,0x73,0x65,0x72,0x74,0x28,0x65,0x72,0x72,0x2C,0x20,0x6C,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,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,0x20,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,0x20,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,0x20,0x6C, - 0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x64, - 0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70, - 0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29,0x20,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, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E, - 0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x64, - 0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x2C,0x20, - 0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74, - 0x72,0x75,0x65,0x20,0x64,0x6F,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C, - 0x20,0x63,0x20,0x3D,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x76,0x65,0x6E,0x74, - 0x2E,0x77,0x61,0x69,0x74,0x28,0x29,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D, - 0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6E,0x20,0x65,0x6E,0x64,0x20,0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22, - 0x6B,0x70,0x22,0x20,0x61,0x6E,0x64,0x20,0x61,0x20,0x3D,0x3D,0x20,0x22,0x65, - 0x73,0x63,0x61,0x70,0x65,0x22,0x20,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74, - 0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20, - 0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x65, - 0x72,0x72,0x68,0x61,0x6E,0x64,0x28,0x6D,0x73,0x67,0x29,0x20,0x70,0x72,0x69, - 0x6E,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72,0x6F,0x72,0x20,0x68,0x61, - 0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20, - 0x67,0x61,0x6D,0x65,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6E,0x20,0x73, - 0x74,0x6F,0x70,0x70,0x65,0x64,0x2E,0x22,0x29,0x20,0x69,0x66,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,0x6F,0x72,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,0x74,0x68,0x65,0x6E,0x20,0x72,0x65,0x74, - 0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, - 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x52,0x65,0x6E,0x64,0x65, - 0x72,0x54,0x61,0x72,0x67,0x65,0x74,0x28,0x29,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x72,0x65,0x73,0x65,0x74,0x28, - 0x29,0x20,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,0x20,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,0x31,0x34,0x29,0x20,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,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67, - 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65,0x61,0x72,0x28,0x29, - 0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x65,0x72,0x72,0x20,0x3D,0x20,0x7B,0x7D, - 0x20,0x70,0x20,0x3D,0x20,0x73,0x74,0x72,0x69,0x6E,0x67,0x2E,0x66,0x6F,0x72, - 0x6D,0x61,0x74,0x28,0x22,0x41,0x6E,0x20,0x65,0x72,0x72,0x6F,0x72,0x20,0x68, - 0x61,0x73,0x20,0x6F,0x63,0x63,0x75,0x72,0x65,0x64,0x20,0x74,0x68,0x61,0x74, - 0x20,0x63,0x61,0x75,0x73,0x65,0x64,0x20,0x25,0x73,0x20,0x74,0x6F,0x20,0x73, - 0x74,0x6F,0x70,0x2E,0x5C,0x6E,0x59,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x6E, - 0x6F,0x74,0x69,0x66,0x79,0x20,0x25,0x73,0x20,0x61,0x62,0x6F,0x75,0x74,0x20, - 0x74,0x68,0x69,0x73,0x25,0x73,0x2E,0x22,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E, - 0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x74,0x69,0x74,0x6C,0x65,0x20, - 0x6F,0x72,0x20,0x22,0x74,0x68,0x69,0x73,0x20,0x67,0x61,0x6D,0x65,0x22,0x2C, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E, - 0x61,0x75,0x74,0x68,0x6F,0x72,0x20,0x6F,0x72,0x20,0x22,0x74,0x68,0x65,0x20, - 0x61,0x75,0x74,0x68,0x6F,0x72,0x22,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F, - 0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75,0x72,0x6C,0x20,0x61,0x6E,0x64, - 0x20,0x22,0x20,0x61,0x74,0x20,0x22,0x20,0x2E,0x2E,0x20,0x6C,0x6F,0x76,0x65, - 0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73,0x65,0x2E,0x75,0x72,0x6C,0x20,0x6F, - 0x72,0x20,0x22,0x22,0x29,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x66,0x75,0x6E, - 0x63,0x74,0x69,0x6F,0x6E,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F, - 0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x63,0x6C,0x65, - 0x61,0x72,0x28,0x29,0x20,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,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72, - 0x61,0x70,0x68,0x69,0x63,0x73,0x2E,0x70,0x72,0x65,0x73,0x65,0x6E,0x74,0x28, - 0x29,0x20,0x65,0x6E,0x64,0x20,0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x6C,0x6F, - 0x63,0x61,0x6C,0x20,0x65,0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20, - 0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x72,0x75,0x65,0x20,0x64,0x6F,0x20,0x65, - 0x2C,0x20,0x61,0x2C,0x20,0x62,0x2C,0x20,0x63,0x20,0x3D,0x20,0x6C,0x6F,0x76, - 0x65,0x2E,0x65,0x76,0x65,0x6E,0x74,0x2E,0x77,0x61,0x69,0x74,0x28,0x29,0x20, - 0x69,0x66,0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x71,0x22,0x20,0x74,0x68,0x65, - 0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20,0x69,0x66, - 0x20,0x65,0x20,0x3D,0x3D,0x20,0x22,0x6B,0x70,0x22,0x20,0x61,0x6E,0x64,0x20, - 0x61,0x20,0x3D,0x3D,0x20,0x22,0x65,0x73,0x63,0x61,0x70,0x65,0x22,0x20,0x74, - 0x68,0x65,0x6E,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x65,0x6E,0x64,0x20, - 0x64,0x72,0x61,0x77,0x28,0x29,0x20,0x65,0x6E,0x64,0x20,0x65,0x6E,0x64,0x20, - 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,0x20,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,0x65, - 0x6E,0x64,0x20,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,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C, - 0x65,0x61,0x73,0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72, - 0x65,0x6C,0x65,0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x20,0x6F, - 0x72,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x29, - 0x20,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,0x65,0x6E,0x64, - 0x20,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,0x72,0x75, - 0x6E,0x2C,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x5F,0x72,0x65,0x6C,0x65,0x61,0x73, - 0x65,0x20,0x61,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x72,0x65,0x6C,0x65, - 0x61,0x73,0x65,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x20,0x6F,0x72,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x65,0x72,0x72,0x68,0x61,0x6E,0x64,0x29,0x20,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,0x65,0x6E,0x64, -}; -// [/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, 0x31, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a,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,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,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,0x0a, + 0x2d, 0x2d, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2e, 0x0a, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x20, 0x65, 0x6e, 0x64, 0x0a,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,0x0a, + 0x2d, 0x2d, 0x20, 0x55, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x3a, 0x0a, + 0x61, 0x72, 0x67, 0x76, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,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,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,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,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,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,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,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,0x0a, + 0x65, 0x6e, 0x64, 0x0a,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,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,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,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,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,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,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,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,0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x0a, + 0x65, 0x6e, 0x64, 0x0a,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,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, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x7d, 0x0a, + 0x7d, 0x0a,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,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,0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x0a, + 0x65, 0x6e, 0x64, 0x0a,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,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,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,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,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,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,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, 0x7b, 0x0a, + 0x09, 0x09, 0x6b, 0x70, 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, 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, 0x72, 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, 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, 0x6d, 0x70, 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, 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, 0x72, 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, 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, 0x70, 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, 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, 0x72, 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, 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, 0x66, 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, 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, 0x71, 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, 0x7d, 0x0a,0x0a, + 0x65, 0x6e, 0x64, 0x0a,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,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,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,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,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,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,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,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, 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, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x5b, 0x31, 0x5d, + 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, 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,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,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,0x0a, + 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6e, 0x69, 0x74, + 0x28, 0x29, 0x0a,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, 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, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, + 0x64, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 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, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 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, 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, 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, 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, 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, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x0a, + 0x09, 0x7d, 0x0a,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, 0x2e, 0x6c, 0x75, + 0x61, 0x22, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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,0x0a, + 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x55, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x64, 0x22, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x63, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x22, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x63, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x75, 0x72, 0x6c, 0x0a, + 0x09, 0x09, 0x7d, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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,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, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x63, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x76, 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, 0x6b, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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,0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x65, 0x74, 0x75, 0x70, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x68, + 0x65, 0x72, 0x65, 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x66, + 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x2e, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x2e, 0x73, 0x63, + 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, + 0x65, 0x6e, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x63, 0x2e, 0x73, 0x63, + 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x76, 0x73, 0x79, 0x6e, 0x63, 0x2c, 0x20, 0x63, 0x2e, 0x73, 0x63, 0x72, 0x65, + 0x65, 0x6e, 0x2e, 0x66, 0x73, 0x61, 0x61, 0x29, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x22, + 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x28, 0x63, 0x2e, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x61, + 0x6d, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 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, 0x29, 0x20, 0x65, 0x6e, 0x64, 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, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, + 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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,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,0x0a, + 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x75, 0x6e, 0x28, + 0x29, 0x0a,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,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a,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, 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, 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, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 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, 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, 0x65, 0x6e, 0x64, 0x0a,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, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x2c, 0x61, 0x2c, 0x62, 0x2c, 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, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 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, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x31, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, + 0x73, 0x2e, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x65, 0x6e, 0x64, 0x0a,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,0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, + 0x6d, 0x65, 0x28, 0x29, 0x0a,0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, + 0x34, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 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, 0x43, 0x37, 0x6d, 0x6c, 0x44, 0x51, 0x31, + 0x42, 0x4a, 0x51, 0x30, 0x4d, 0x67, 0x55, 0x48, 0x4a, 0x76, 0x5a, 0x6d, 0x6c, 0x73, 0x5a, 0x51, 0x41, 0x41, 0x0a, + 0x65, 0x41, 0x47, 0x46, 0x56, 0x4d, 0x39, 0x72, 0x45, 0x30, 0x45, 0x55, 0x2f, 0x6a, 0x5a, 0x75, 0x71, 0x64, + 0x41, 0x69, 0x43, 0x46, 0x70, 0x72, 0x44, 0x72, 0x4a, 0x34, 0x6b, 0x43, 0x4a, 0x4a, 0x57, 0x61, 0x74, 0x6f, + 0x52, 0x64, 0x51, 0x32, 0x2f, 0x52, 0x46, 0x69, 0x61, 0x77, 0x7a, 0x62, 0x48, 0x37, 0x5a, 0x46, 0x6b, 0x47, + 0x51, 0x7a, 0x53, 0x64, 0x5a, 0x75, 0x4e, 0x75, 0x76, 0x75, 0x4a, 0x72, 0x57, 0x6c, 0x69, 0x4f, 0x54, 0x69, 0x0a, + 0x30, 0x53, 0x72, 0x65, 0x52, 0x65, 0x32, 0x68, 0x42, 0x2f, 0x2b, 0x41, 0x48, 0x6e, 0x72, 0x77, 0x5a, 0x43, + 0x39, 0x4b, 0x68, 0x56, 0x70, 0x46, 0x4b, 0x4e, 0x36, 0x72, 0x4b, 0x47, 0x4b, 0x68, 0x46, 0x79, 0x33, 0x78, + 0x7a, 0x57, 0x35, 0x4d, 0x74, 0x71, 0x58, 0x71, 0x77, 0x4d, 0x35, 0x2b, 0x38, 0x39, 0x34, 0x33, 0x37, 0x33, + 0x31, 0x76, 0x64, 0x74, 0x38, 0x41, 0x44, 0x58, 0x4c, 0x53, 0x4e, 0x50, 0x57, 0x41, 0x42, 0x4f, 0x51, 0x4e, 0x0a, + 0x78, 0x31, 0x4b, 0x69, 0x45, 0x57, 0x6c, 0x73, 0x66, 0x45, 0x4a, 0x71, 0x2f, 0x49, 0x67, 0x41, 0x6a, 0x71, + 0x49, 0x4a, 0x51, 0x54, 0x51, 0x6c, 0x56, 0x64, 0x76, 0x73, 0x54, 0x69, 0x51, 0x47, 0x51, 0x59, 0x4e, 0x7a, + 0x2b, 0x58, 0x76, 0x6e, 0x32, 0x48, 0x6f, 0x50, 0x67, 0x56, 0x74, 0x57, 0x77, 0x33, 0x76, 0x37, 0x64, 0x37, + 0x4a, 0x33, 0x72, 0x5a, 0x72, 0x53, 0x74, 0x70, 0x6f, 0x48, 0x68, 0x50, 0x31, 0x41, 0x34, 0x45, 0x65, 0x61, 0x0a, + 0x32, 0x53, 0x71, 0x77, 0x37, 0x78, 0x64, 0x78, 0x43, 0x6c, 0x6b, 0x53, 0x41, 0x6f, 0x67, 0x38, 0x33, 0x36, + 0x45, 0x70, 0x78, 0x33, 0x51, 0x49, 0x33, 0x2b, 0x50, 0x59, 0x38, 0x75, 0x79, 0x50, 0x4f, 0x55, 0x35, 0x35, + 0x65, 0x4d, 0x47, 0x31, 0x44, 0x79, 0x73, 0x39, 0x78, 0x46, 0x6b, 0x69, 0x66, 0x45, 0x41, 0x31, 0x4c, 0x63, + 0x35, 0x2f, 0x54, 0x62, 0x68, 0x54, 0x7a, 0x53, 0x58, 0x54, 0x51, 0x49, 0x4e, 0x49, 0x4f, 0x4a, 0x54, 0x31, 0x0a, + 0x63, 0x56, 0x49, 0x2b, 0x6e, 0x4e, 0x65, 0x4c, 0x6c, 0x4e, 0x63, 0x64, 0x42, 0x32, 0x6c, 0x75, 0x5a, 0x73, + 0x62, 0x49, 0x45, 0x4c, 0x31, 0x50, 0x6b, 0x4b, 0x61, 0x37, 0x7a, 0x4f, 0x36, 0x72, 0x59, 0x71, 0x47, 0x63, + 0x54, 0x76, 0x59, 0x4f, 0x6b, 0x4c, 0x32, 0x64, 0x39, 0x48, 0x35, 0x4f, 0x73, 0x39, 0x34, 0x2b, 0x77, 0x69, + 0x48, 0x43, 0x43, 0x78, 0x6d, 0x74, 0x50, 0x30, 0x61, 0x34, 0x6a, 0x5a, 0x37, 0x31, 0x6a, 0x4e, 0x55, 0x2f, 0x0a, + 0x34, 0x6d, 0x48, 0x68, 0x70, 0x4f, 0x62, 0x45, 0x68, 0x6a, 0x30, 0x63, 0x47, 0x44, 0x58, 0x30, 0x2b, 0x47, + 0x41, 0x56, 0x74, 0x78, 0x71, 0x70, 0x2b, 0x44, 0x58, 0x43, 0x46, 0x46, 0x38, 0x51, 0x54, 0x53, 0x65, 0x69, + 0x56, 0x48, 0x48, 0x5a, 0x4c, 0x67, 0x33, 0x78, 0x6d, 0x4b, 0x37, 0x39, 0x56, 0x76, 0x4a, 0x4b, 0x67, 0x6e, + 0x43, 0x51, 0x4f, 0x4d, 0x70, 0x6b, 0x59, 0x59, 0x42, 0x7a, 0x57, 0x6b, 0x68, 0x50, 0x31, 0x30, 0x78, 0x75, 0x0a, + 0x2b, 0x4c, 0x71, 0x48, 0x42, 0x58, 0x30, 0x6d, 0x31, 0x78, 0x4f, 0x76, 0x34, 0x6e, 0x64, 0x57, 0x55, 0x65, + 0x46, 0x35, 0x6a, 0x78, 0x4e, 0x6e, 0x33, 0x74, 0x54, 0x64, 0x37, 0x30, 0x58, 0x61, 0x41, 0x71, 0x38, 0x77, + 0x44, 0x68, 0x30, 0x4d, 0x47, 0x67, 0x79, 0x61, 0x44, 0x55, 0x68, 0x51, 0x45, 0x45, 0x55, 0x45, 0x59, 0x5a, + 0x69, 0x77, 0x55, 0x45, 0x43, 0x47, 0x50, 0x42, 0x6f, 0x78, 0x4e, 0x4c, 0x4a, 0x79, 0x50, 0x79, 0x4f, 0x72, 0x0a, + 0x42, 0x68, 0x75, 0x54, 0x65, 0x7a, 0x4a, 0x31, 0x4a, 0x47, 0x71, 0x37, 0x64, 0x47, 0x4a, 0x45, 0x73, 0x55, + 0x46, 0x37, 0x4e, 0x74, 0x77, 0x39, 0x74, 0x31, 0x47, 0x6b, 0x33, 0x54, 0x7a, 0x2b, 0x4b, 0x43, 0x4a, 0x78, + 0x6c, 0x45, 0x4f, 0x31, 0x43, 0x4a, 0x4c, 0x38, 0x51, 0x66, 0x34, 0x71, 0x72, 0x38, 0x6c, 0x50, 0x35, 0x58, + 0x6e, 0x35, 0x79, 0x31, 0x79, 0x77, 0x32, 0x46, 0x62, 0x33, 0x6c, 0x4b, 0x32, 0x62, 0x6d, 0x72, 0x72, 0x79, 0x0a, + 0x34, 0x44, 0x76, 0x46, 0x35, 0x5a, 0x6d, 0x35, 0x47, 0x68, 0x37, 0x58, 0x30, 0x38, 0x6a, 0x6a, 0x63, 0x30, + 0x31, 0x65, 0x66, 0x4a, 0x58, 0x55, 0x64, 0x70, 0x4e, 0x58, 0x52, 0x35, 0x61, 0x73, 0x65, 0x58, 0x71, 0x38, + 0x6d, 0x75, 0x77, 0x61, 0x50, 0x2b, 0x78, 0x58, 0x6c, 0x7a, 0x48, 0x6d, 0x67, 0x6a, 0x57, 0x50, 0x78, 0x48, + 0x4f, 0x77, 0x2b, 0x2f, 0x45, 0x74, 0x58, 0x35, 0x58, 0x4d, 0x6c, 0x79, 0x6d, 0x4d, 0x46, 0x4d, 0x58, 0x6a, 0x0a, + 0x56, 0x66, 0x50, 0x71, 0x53, 0x34, 0x52, 0x31, 0x57, 0x6a, 0x45, 0x33, 0x33, 0x35, 0x39, 0x73, 0x66, 0x7a, + 0x73, 0x39, 0x34, 0x69, 0x37, 0x50, 0x4c, 0x72, 0x58, 0x57, 0x63, 0x36, 0x32, 0x4a, 0x69, 0x7a, 0x64, 0x57, + 0x6d, 0x35, 0x64, 0x6e, 0x2f, 0x57, 0x70, 0x49, 0x2b, 0x2b, 0x36, 0x71, 0x76, 0x4a, 0x50, 0x6d, 0x56, 0x66, + 0x6c, 0x50, 0x58, 0x76, 0x58, 0x78, 0x2f, 0x47, 0x66, 0x4e, 0x78, 0x47, 0x50, 0x69, 0x4b, 0x54, 0x45, 0x6d, 0x0a, + 0x64, 0x6f, 0x72, 0x6e, 0x49, 0x59, 0x6d, 0x58, 0x78, 0x53, 0x37, 0x78, 0x6b, 0x74, 0x68, 0x4c, 0x71, 0x77, + 0x76, 0x69, 0x59, 0x47, 0x33, 0x48, 0x43, 0x4a, 0x32, 0x56, 0x68, 0x69, 0x6e, 0x53, 0x62, 0x5a, 0x48, 0x36, + 0x4a, 0x4e, 0x56, 0x67, 0x59, 0x4a, 0x71, 0x38, 0x39, 0x53, 0x39, 0x64, 0x50, 0x31, 0x74, 0x34, 0x76, 0x55, + 0x5a, 0x2f, 0x44, 0x50, 0x56, 0x52, 0x6c, 0x42, 0x6e, 0x4d, 0x30, 0x6c, 0x53, 0x4a, 0x39, 0x33, 0x2f, 0x43, 0x0a, + 0x4b, 0x6d, 0x51, 0x30, 0x6e, 0x62, 0x6b, 0x4f, 0x62, 0x2f, 0x71, 0x50, 0x32, 0x38, 0x66, 0x38, 0x46, 0x2b, + 0x54, 0x33, 0x69, 0x75, 0x65, 0x66, 0x4b, 0x41, 0x49, 0x76, 0x62, 0x4f, 0x44, 0x49, 0x6d, 0x62, 0x70, 0x74, + 0x55, 0x33, 0x48, 0x76, 0x45, 0x4b, 0x46, 0x6c, 0x70, 0x57, 0x35, 0x7a, 0x72, 0x67, 0x49, 0x58, 0x76, 0x39, + 0x46, 0x39, 0x38, 0x4c, 0x5a, 0x75, 0x61, 0x36, 0x4e, 0x2b, 0x4f, 0x50, 0x77, 0x45, 0x57, 0x44, 0x79, 0x72, 0x0a, + 0x46, 0x71, 0x31, 0x53, 0x4e, 0x5a, 0x38, 0x67, 0x76, 0x41, 0x45, 0x63, 0x64, 0x6f, 0x64, 0x36, 0x48, 0x75, + 0x67, 0x70, 0x6d, 0x4e, 0x4f, 0x57, 0x6c, 0x73, 0x30, 0x35, 0x55, 0x6f, 0x63, 0x73, 0x6e, 0x35, 0x4f, 0x36, + 0x36, 0x63, 0x70, 0x69, 0x55, 0x73, 0x78, 0x51, 0x32, 0x30, 0x4e, 0x53, 0x55, 0x74, 0x63, 0x6c, 0x31, 0x32, + 0x56, 0x4c, 0x46, 0x72, 0x4f, 0x5a, 0x56, 0x57, 0x4c, 0x70, 0x64, 0x74, 0x69, 0x5a, 0x30, 0x78, 0x31, 0x75, 0x0a, + 0x48, 0x4b, 0x45, 0x35, 0x51, 0x76, 0x66, 0x45, 0x70, 0x30, 0x70, 0x6c, 0x6b, 0x2f, 0x71, 0x76, 0x38, 0x52, + 0x47, 0x77, 0x2f, 0x62, 0x42, 0x53, 0x2b, 0x66, 0x6d, 0x73, 0x55, 0x74, 0x6c, 0x2b, 0x54, 0x68, 0x72, 0x57, + 0x67, 0x5a, 0x66, 0x36, 0x62, 0x38, 0x43, 0x38, 0x2f, 0x55, 0x58, 0x41, 0x65, 0x49, 0x75, 0x4a, 0x41, 0x41, + 0x41, 0x41, 0x43, 0x58, 0x42, 0x49, 0x57, 0x58, 0x4d, 0x41, 0x41, 0x41, 0x73, 0x54, 0x41, 0x41, 0x41, 0x4c, 0x0a, + 0x45, 0x77, 0x45, 0x41, 0x6d, 0x70, 0x77, 0x59, 0x41, 0x41, 0x41, 0x4b, 0x45, 0x45, 0x6c, 0x45, 0x51, 0x56, + 0x52, 0x34, 0x41, 0x65, 0x32, 0x62, 0x61, 0x32, 0x77, 0x55, 0x31, 0x78, 0x58, 0x48, 0x7a, 0x2b, 0x79, 0x75, + 0x71, 0x59, 0x33, 0x42, 0x59, 0x4f, 0x4d, 0x51, 0x61, 0x48, 0x69, 0x6b, 0x78, 0x6a, 0x7a, 0x69, 0x4e, 0x70, + 0x41, 0x55, 0x4d, 0x49, 0x4b, 0x6b, 0x77, 0x71, 0x56, 0x53, 0x68, 0x49, 0x54, 0x55, 0x79, 0x6c, 0x58, 0x56, 0x0a, + 0x56, 0x71, 0x6f, 0x71, 0x52, 0x61, 0x71, 0x45, 0x43, 0x46, 0x43, 0x70, 0x4c, 0x53, 0x4a, 0x53, 0x50, 0x79, + 0x56, 0x52, 0x50, 0x30, 0x51, 0x69, 0x55, 0x6c, 0x73, 0x56, 0x62, 0x45, 0x64, 0x52, 0x50, 0x31, 0x53, 0x4b, + 0x2b, 0x69, 0x47, 0x4b, 0x57, 0x74, 0x52, 0x55, 0x53, 0x47, 0x33, 0x56, 0x68, 0x78, 0x49, 0x6c, 0x63, 0x62, + 0x7a, 0x47, 0x45, 0x46, 0x4a, 0x6b, 0x31, 0x6d, 0x76, 0x41, 0x42, 0x76, 0x78, 0x65, 0x76, 0x4c, 0x62, 0x58, 0x0a, + 0x33, 0x76, 0x55, 0x2b, 0x35, 0x2f, 0x62, 0x63, 0x54, 0x55, 0x31, 0x32, 0x5a, 0x32, 0x62, 0x78, 0x47, 0x74, + 0x74, 0x6e, 0x7a, 0x39, 0x72, 0x6e, 0x66, 0x74, 0x6d, 0x39, 0x64, 0x2b, 0x37, 0x4d, 0x4f, 0x66, 0x64, 0x2f, + 0x66, 0x6e, 0x76, 0x75, 0x7a, 0x4a, 0x32, 0x37, 0x68, 0x6c, 0x49, 0x4b, 0x70, 0x43, 0x78, 0x66, 0x42, 0x56, + 0x7a, 0x4c, 0x64, 0x2b, 0x67, 0x79, 0x63, 0x71, 0x32, 0x41, 0x41, 0x4c, 0x44, 0x4d, 0x4f, 0x52, 0x41, 0x41, 0x0a, + 0x42, 0x49, 0x42, 0x6c, 0x72, 0x73, 0x41, 0x79, 0x48, 0x37, 0x35, 0x6b, 0x41, 0x41, 0x46, 0x67, 0x6d, 0x53, + 0x75, 0x77, 0x7a, 0x49, 0x63, 0x76, 0x47, 0x55, 0x41, 0x41, 0x57, 0x4f, 0x59, 0x4b, 0x4c, 0x50, 0x50, 0x68, + 0x65, 0x35, 0x62, 0x79, 0x2b, 0x4e, 0x73, 0x37, 0x6d, 0x7a, 0x65, 0x59, 0x62, 0x6e, 0x67, 0x65, 0x46, 0x4f, + 0x77, 0x46, 0x51, 0x32, 0x30, 0x48, 0x4d, 0x4a, 0x37, 0x45, 0x38, 0x64, 0x59, 0x41, 0x71, 0x45, 0x72, 0x38, 0x0a, + 0x7a, 0x43, 0x77, 0x39, 0x65, 0x43, 0x79, 0x49, 0x37, 0x64, 0x63, 0x4d, 0x4d, 0x47, 0x34, 0x72, 0x55, 0x33, + 0x6e, 0x4e, 0x31, 0x66, 0x45, 0x50, 0x44, 0x32, 0x37, 0x36, 0x2b, 0x58, 0x52, 0x6d, 0x70, 0x36, 0x58, 0x34, + 0x33, 0x56, 0x68, 0x4b, 0x4b, 0x34, 0x47, 0x74, 0x66, 0x62, 0x38, 0x70, 0x63, 0x30, 0x2b, 0x56, 0x4e, 0x49, + 0x4c, 0x68, 0x4f, 0x71, 0x49, 0x4d, 0x4f, 0x41, 0x78, 0x4b, 0x31, 0x63, 0x34, 0x76, 0x61, 0x45, 0x59, 0x48, 0x0a, + 0x43, 0x76, 0x51, 0x2b, 0x77, 0x6e, 0x4f, 0x70, 0x66, 0x75, 0x66, 0x70, 0x66, 0x38, 0x2f, 0x76, 0x57, 0x6a, + 0x7a, 0x50, 0x58, 0x68, 0x49, 0x41, 0x65, 0x50, 0x31, 0x4e, 0x6a, 0x57, 0x44, 0x43, 0x6a, 0x7a, 0x48, 0x6f, + 0x6a, 0x59, 0x73, 0x6c, 0x4d, 0x32, 0x61, 0x47, 0x43, 0x57, 0x57, 0x6f, 0x64, 0x38, 0x42, 0x30, 0x76, 0x58, + 0x56, 0x67, 0x31, 0x30, 0x73, 0x64, 0x69, 0x32, 0x57, 0x48, 0x2b, 0x72, 0x70, 0x46, 0x44, 0x59, 0x43, 0x33, 0x0a, + 0x75, 0x2b, 0x57, 0x59, 0x53, 0x70, 0x6e, 0x6e, 0x77, 0x49, 0x41, 0x36, 0x59, 0x75, 0x48, 0x65, 0x4d, 0x31, + 0x50, 0x47, 0x6d, 0x59, 0x4e, 0x31, 0x4a, 0x32, 0x38, 0x53, 0x32, 0x31, 0x31, 0x77, 0x63, 0x30, 0x55, 0x4a, + 0x51, 0x4b, 0x76, 0x2f, 0x66, 0x4c, 0x31, 0x62, 0x75, 0x56, 0x37, 0x48, 0x31, 0x31, 0x68, 0x48, 0x46, 0x6c, + 0x79, 0x52, 0x75, 0x56, 0x33, 0x77, 0x37, 0x52, 0x56, 0x75, 0x38, 0x38, 0x79, 0x7a, 0x74, 0x54, 0x38, 0x4e, 0x0a, + 0x7a, 0x4f, 0x30, 0x30, 0x50, 0x72, 0x32, 0x4c, 0x43, 0x6f, 0x42, 0x57, 0x2f, 0x35, 0x74, 0x50, 0x75, 0x4d, + 0x33, 0x55, 0x2b, 0x58, 0x78, 0x54, 0x66, 0x53, 0x49, 0x56, 0x68, 0x39, 0x42, 0x30, 0x45, 0x4d, 0x4c, 0x78, + 0x45, 0x45, 0x53, 0x54, 0x59, 0x59, 0x67, 0x6c, 0x6f, 0x68, 0x42, 0x4c, 0x52, 0x69, 0x46, 0x70, 0x4a, 0x72, + 0x49, 0x69, 0x38, 0x43, 0x56, 0x50, 0x47, 0x58, 0x68, 0x63, 0x48, 0x6c, 0x69, 0x35, 0x59, 0x6a, 0x57, 0x55, 0x0a, + 0x65, 0x6b, 0x71, 0x68, 0x76, 0x48, 0x51, 0x74, 0x72, 0x43, 0x6d, 0x74, 0x41, 0x73, 0x50, 0x49, 0x37, 0x79, + 0x6e, 0x5a, 0x41, 0x47, 0x68, 0x4a, 0x6c, 0x63, 0x66, 0x50, 0x46, 0x4f, 0x4e, 0x4e, 0x59, 0x39, 0x45, 0x41, + 0x34, 0x4f, 0x31, 0x71, 0x4f, 0x61, 0x48, 0x41, 0x62, 0x4d, 0x6d, 0x4b, 0x6e, 0x45, 0x4e, 0x6c, 0x4f, 0x68, + 0x47, 0x47, 0x2b, 0x31, 0x4d, 0x44, 0x45, 0x49, 0x79, 0x4d, 0x77, 0x48, 0x51, 0x38, 0x37, 0x4e, 0x41, 0x6a, 0x0a, + 0x76, 0x79, 0x59, 0x64, 0x2f, 0x41, 0x6f, 0x45, 0x6f, 0x57, 0x72, 0x6c, 0x65, 0x6c, 0x68, 0x58, 0x76, 0x68, + 0x45, 0x38, 0x37, 0x70, 0x4a, 0x5a, 0x54, 0x6a, 0x53, 0x36, 0x58, 0x59, 0x5a, 0x36, 0x61, 0x66, 0x2b, 0x4f, + 0x55, 0x2f, 0x2b, 0x61, 0x70, 0x53, 0x4f, 0x72, 0x77, 0x2b, 0x77, 0x42, 0x2b, 0x4c, 0x54, 0x33, 0x74, 0x32, + 0x74, 0x6a, 0x30, 0x5a, 0x49, 0x57, 0x6e, 0x4f, 0x64, 0x2f, 0x2b, 0x44, 0x44, 0x6c, 0x67, 0x70, 0x46, 0x68, 0x0a, + 0x36, 0x42, 0x2f, 0x76, 0x67, 0x58, 0x41, 0x73, 0x39, 0x4c, 0x42, 0x75, 0x6a, 0x33, 0x51, 0x4d, 0x62, 0x77, + 0x43, 0x68, 0x73, 0x72, 0x77, 0x61, 0x4e, 0x6c, 0x64, 0x75, 0x68, 0x37, 0x4b, 0x53, 0x56, 0x62, 0x4e, 0x64, + 0x34, 0x34, 0x30, 0x44, 0x4f, 0x30, 0x2b, 0x39, 0x50, 0x46, 0x73, 0x6e, 0x4c, 0x73, 0x64, 0x5a, 0x41, 0x2b, + 0x44, 0x74, 0x75, 0x72, 0x41, 0x50, 0x38, 0x2f, 0x41, 0x66, 0x63, 0x4d, 0x2f, 0x4b, 0x56, 0x33, 0x4d, 0x4a, 0x0a, + 0x4e, 0x68, 0x55, 0x64, 0x68, 0x7a, 0x76, 0x42, 0x4c, 0x70, 0x69, 0x4d, 0x54, 0x65, 0x54, 0x71, 0x73, 0x6d, + 0x44, 0x74, 0x47, 0x6f, 0x54, 0x71, 0x56, 0x52, 0x73, 0x52, 0x68, 0x46, 0x70, 0x59, 0x67, 0x56, 0x4e, 0x46, + 0x72, 0x6f, 0x4c, 0x39, 0x50, 0x6f, 0x34, 0x4d, 0x42, 0x67, 0x34, 0x33, 0x4e, 0x4c, 0x79, 0x53, 0x7a, 0x4e, + 0x57, 0x48, 0x53, 0x7a, 0x74, 0x62, 0x41, 0x44, 0x37, 0x78, 0x58, 0x57, 0x67, 0x77, 0x4d, 0x50, 0x67, 0x6f, 0x0a, + 0x31, 0x46, 0x59, 0x6e, 0x73, 0x58, 0x53, 0x71, 0x76, 0x78, 0x76, 0x30, 0x77, 0x31, 0x69, 0x45, 0x2f, 0x76, + 0x37, 0x4c, 0x5a, 0x62, 0x68, 0x68, 0x51, 0x38, 0x56, 0x6d, 0x65, 0x47, 0x4a, 0x4e, 0x44, 0x62, 0x6a, 0x64, + 0x4f, 0x64, 0x62, 0x53, 0x46, 0x4c, 0x52, 0x35, 0x56, 0x45, 0x6e, 0x6a, 0x33, 0x71, 0x65, 0x4f, 0x44, 0x7a, + 0x72, 0x35, 0x7a, 0x36, 0x57, 0x4e, 0x4a, 0x51, 0x44, 0x74, 0x2f, 0x71, 0x5a, 0x76, 0x6d, 0x51, 0x72, 0x65, 0x0a, + 0x51, 0x5a, 0x48, 0x57, 0x4f, 0x51, 0x6e, 0x56, 0x50, 0x33, 0x34, 0x4c, 0x2b, 0x73, 0x5a, 0x75, 0x34, 0x77, + 0x4a, 0x66, 0x59, 0x62, 0x65, 0x7a, 0x6c, 0x62, 0x68, 0x4b, 0x59, 0x4e, 0x76, 0x36, 0x70, 0x32, 0x46, 0x74, + 0x57, 0x62, 0x57, 0x54, 0x6d, 0x35, 0x69, 0x38, 0x6a, 0x4b, 0x74, 0x4a, 0x74, 0x2b, 0x76, 0x6f, 0x6f, 0x57, + 0x30, 0x6e, 0x52, 0x68, 0x77, 0x37, 0x4d, 0x47, 0x6a, 0x4d, 0x37, 0x7a, 0x61, 0x58, 0x30, 0x46, 0x47, 0x64, 0x0a, + 0x39, 0x70, 0x55, 0x79, 0x33, 0x6b, 0x61, 0x54, 0x74, 0x75, 0x41, 0x6e, 0x55, 0x77, 0x6d, 0x34, 0x4d, 0x64, + 0x51, 0x42, 0x39, 0x38, 0x5a, 0x75, 0x46, 0x54, 0x7a, 0x34, 0x57, 0x70, 0x49, 0x45, 0x50, 0x6b, 0x33, 0x34, + 0x68, 0x71, 0x36, 0x67, 0x50, 0x39, 0x31, 0x59, 0x73, 0x38, 0x4f, 0x49, 0x71, 0x36, 0x7a, 0x50, 0x75, 0x68, + 0x4f, 0x70, 0x39, 0x33, 0x52, 0x66, 0x72, 0x6f, 0x56, 0x56, 0x42, 0x76, 0x6a, 0x34, 0x31, 0x70, 0x76, 0x72, 0x0a, + 0x33, 0x63, 0x6e, 0x55, 0x2b, 0x79, 0x6a, 0x57, 0x4c, 0x71, 0x74, 0x67, 0x73, 0x65, 0x51, 0x30, 0x42, 0x76, + 0x38, 0x79, 0x52, 0x42, 0x4d, 0x38, 0x6c, 0x2b, 0x65, 0x72, 0x79, 0x68, 0x2b, 0x44, 0x37, 0x59, 0x2f, 0x74, + 0x79, 0x66, 0x48, 0x6f, 0x61, 0x44, 0x51, 0x66, 0x32, 0x48, 0x6e, 0x79, 0x6c, 0x48, 0x56, 0x4d, 0x48, 0x4f, + 0x71, 0x73, 0x4d, 0x6f, 0x41, 0x6e, 0x61, 0x56, 0x35, 0x30, 0x43, 0x76, 0x35, 0x30, 0x59, 0x67, 0x71, 0x75, 0x0a, + 0x39, 0x37, 0x65, 0x78, 0x44, 0x62, 0x34, 0x4f, 0x5a, 0x44, 0x41, 0x63, 0x67, 0x42, 0x75, 0x44, 0x6c, 0x79, + 0x47, 0x6c, 0x55, 0x67, 0x35, 0x78, 0x56, 0x53, 0x66, 0x62, 0x2f, 0x45, 0x30, 0x43, 0x67, 0x49, 0x4d, 0x79, + 0x44, 0x35, 0x72, 0x61, 0x75, 0x70, 0x72, 0x4f, 0x34, 0x5a, 0x78, 0x2b, 0x36, 0x45, 0x48, 0x44, 0x2f, 0x37, + 0x39, 0x45, 0x45, 0x78, 0x48, 0x6f, 0x48, 0x47, 0x6a, 0x48, 0x64, 0x42, 0x75, 0x33, 0x48, 0x6d, 0x4a, 0x58, 0x0a, + 0x44, 0x38, 0x58, 0x47, 0x6f, 0x57, 0x76, 0x34, 0x43, 0x72, 0x36, 0x44, 0x4d, 0x75, 0x32, 0x2b, 0x4b, 0x62, + 0x6a, 0x51, 0x37, 0x6d, 0x75, 0x32, 0x6a, 0x63, 0x2f, 0x65, 0x6b, 0x62, 0x61, 0x46, 0x52, 0x51, 0x62, 0x34, + 0x70, 0x4c, 0x76, 0x35, 0x4b, 0x52, 0x7a, 0x32, 0x57, 0x65, 0x76, 0x51, 0x39, 0x55, 0x71, 0x65, 0x62, 0x37, + 0x67, 0x6a, 0x50, 0x64, 0x64, 0x61, 0x6a, 0x33, 0x47, 0x74, 0x68, 0x36, 0x62, 0x48, 0x34, 0x47, 0x62, 0x67, 0x0a, + 0x76, 0x34, 0x37, 0x75, 0x6d, 0x51, 0x62, 0x4d, 0x75, 0x70, 0x44, 0x6c, 0x65, 0x4f, 0x49, 0x69, 0x4e, 0x72, + 0x49, 0x41, 0x77, 0x47, 0x58, 0x43, 0x37, 0x2b, 0x31, 0x6a, 0x56, 0x4e, 0x41, 0x64, 0x75, 0x4d, 0x59, 0x36, + 0x37, 0x64, 0x74, 0x39, 0x2f, 0x72, 0x78, 0x6c, 0x4e, 0x49, 0x79, 0x4c, 0x55, 0x6d, 0x4e, 0x4f, 0x37, 0x34, + 0x6e, 0x55, 0x62, 0x71, 0x2b, 0x2f, 0x2b, 0x58, 0x79, 0x75, 0x38, 0x77, 0x72, 0x52, 0x58, 0x6e, 0x41, 0x41, 0x0a, + 0x63, 0x71, 0x58, 0x2b, 0x65, 0x79, 0x69, 0x67, 0x2f, 0x6a, 0x55, 0x56, 0x61, 0x2b, 0x6e, 0x44, 0x56, 0x63, + 0x6c, 0x51, 0x31, 0x4f, 0x34, 0x2f, 0x50, 0x68, 0x6d, 0x63, 0x31, 0x68, 0x74, 0x56, 0x75, 0x49, 0x79, 0x72, + 0x6f, 0x41, 0x43, 0x38, 0x43, 0x2b, 0x2b, 0x36, 0x63, 0x64, 0x58, 0x73, 0x75, 0x46, 0x57, 0x4d, 0x53, 0x52, + 0x52, 0x75, 0x59, 0x4c, 0x7a, 0x58, 0x32, 0x6c, 0x78, 0x55, 0x64, 0x62, 0x31, 0x47, 0x6f, 0x61, 0x63, 0x43, 0x0a, + 0x70, 0x35, 0x74, 0x43, 0x33, 0x4b, 0x58, 0x45, 0x4a, 0x67, 0x73, 0x55, 0x46, 0x49, 0x43, 0x74, 0x76, 0x68, + 0x46, 0x39, 0x34, 0x37, 0x63, 0x6d, 0x4f, 0x37, 0x49, 0x4b, 0x65, 0x6b, 0x5a, 0x76, 0x73, 0x48, 0x6a, 0x4f, + 0x7a, 0x2f, 0x5a, 0x72, 0x37, 0x72, 0x55, 0x34, 0x76, 0x6e, 0x6e, 0x73, 0x78, 0x7a, 0x55, 0x4c, 0x65, 0x31, + 0x48, 0x66, 0x61, 0x2f, 0x56, 0x64, 0x65, 0x4e, 0x72, 0x65, 0x54, 0x74, 0x39, 0x53, 0x55, 0x41, 0x44, 0x77, 0x0a, + 0x6f, 0x66, 0x6b, 0x6e, 0x31, 0x69, 0x45, 0x50, 0x68, 0x2b, 0x35, 0x42, 0x4a, 0x44, 0x35, 0x6c, 0x62, 0x53, + 0x37, 0x61, 0x2b, 0x6d, 0x44, 0x6f, 0x4c, 0x74, 0x37, 0x48, 0x52, 0x47, 0x7a, 0x2b, 0x75, 0x38, 0x46, 0x34, + 0x7a, 0x64, 0x5a, 0x59, 0x67, 0x49, 0x61, 0x43, 0x41, 0x64, 0x44, 0x6d, 0x61, 0x7a, 0x70, 0x75, 0x2f, 0x66, + 0x58, 0x72, 0x78, 0x36, 0x66, 0x2b, 0x69, 0x5a, 0x34, 0x43, 0x79, 0x4c, 0x42, 0x34, 0x4a, 0x76, 0x57, 0x59, 0x0a, + 0x50, 0x6c, 0x38, 0x70, 0x7a, 0x4c, 0x61, 0x68, 0x39, 0x7a, 0x52, 0x30, 0x64, 0x50, 0x35, 0x75, 0x53, 0x33, + 0x59, 0x72, 0x66, 0x61, 0x31, 0x67, 0x41, 0x42, 0x67, 0x47, 0x76, 0x47, 0x67, 0x64, 0x37, 0x73, 0x68, 0x6b, + 0x48, 0x38, 0x53, 0x54, 0x4d, 0x57, 0x74, 0x7a, 0x30, 0x64, 0x65, 0x44, 0x59, 0x64, 0x79, 0x62, 0x67, 0x43, + 0x2b, 0x76, 0x72, 0x43, 0x58, 0x70, 0x39, 0x76, 0x7a, 0x43, 0x32, 0x6b, 0x5a, 0x64, 0x7a, 0x2f, 0x45, 0x71, 0x0a, + 0x61, 0x33, 0x48, 0x64, 0x61, 0x4f, 0x31, 0x73, 0x72, 0x6e, 0x57, 0x35, 0x34, 0x61, 0x44, 0x56, 0x79, 0x73, + 0x44, 0x45, 0x48, 0x57, 0x74, 0x54, 0x56, 0x6e, 0x33, 0x6e, 0x78, 0x75, 0x64, 0x67, 0x30, 0x37, 0x71, 0x76, + 0x34, 0x55, 0x61, 0x4e, 0x44, 0x54, 0x41, 0x53, 0x75, 0x67, 0x6b, 0x39, 0x67, 0x58, 0x59, 0x59, 0x47, 0x50, + 0x4e, 0x6e, 0x39, 0x58, 0x6e, 0x55, 0x79, 0x75, 0x71, 0x79, 0x4b, 0x74, 0x69, 0x31, 0x38, 0x54, 0x42, 0x73, 0x0a, + 0x71, 0x74, 0x71, 0x4e, 0x64, 0x2b, 0x39, 0x44, 0x30, 0x44, 0x64, 0x36, 0x48, 0x61, 0x39, 0x2f, 0x46, 0x59, + 0x47, 0x30, 0x70, 0x2b, 0x2b, 0x35, 0x32, 0x74, 0x41, 0x33, 0x68, 0x49, 0x4f, 0x68, 0x58, 0x71, 0x68, 0x5a, + 0x5a, 0x33, 0x32, 0x72, 0x72, 0x62, 0x36, 0x4e, 0x31, 0x2f, 0x72, 0x5a, 0x58, 0x4b, 0x2b, 0x33, 0x6b, 0x50, + 0x30, 0x4c, 0x38, 0x69, 0x37, 0x41, 0x32, 0x39, 0x56, 0x30, 0x46, 0x6c, 0x2b, 0x64, 0x6e, 0x4d, 0x73, 0x63, 0x0a, + 0x53, 0x43, 0x67, 0x61, 0x68, 0x45, 0x35, 0x63, 0x53, 0x6e, 0x55, 0x71, 0x4b, 0x7a, 0x77, 0x72, 0x34, 0x62, + 0x76, 0x31, 0x72, 0x38, 0x48, 0x6a, 0x46, 0x54, 0x74, 0x73, 0x68, 0x2b, 0x2f, 0x65, 0x76, 0x77, 0x4b, 0x58, + 0x50, 0x6e, 0x31, 0x6a, 0x58, 0x6f, 0x48, 0x61, 0x58, 0x39, 0x4d, 0x49, 0x68, 0x33, 0x61, 0x38, 0x61, 0x4c, + 0x74, 0x32, 0x4e, 0x42, 0x47, 0x43, 0x76, 0x33, 0x2f, 0x32, 0x61, 0x2b, 0x68, 0x46, 0x45, 0x4f, 0x5a, 0x62, 0x0a, + 0x33, 0x50, 0x67, 0x4b, 0x65, 0x65, 0x2f, 0x57, 0x42, 0x74, 0x43, 0x76, 0x6b, 0x6a, 0x4f, 0x4c, 0x71, 0x64, + 0x54, 0x75, 0x67, 0x37, 0x74, 0x4f, 0x4f, 0x36, 0x38, 0x63, 0x5a, 0x58, 0x5a, 0x63, 0x70, 0x4f, 0x38, 0x46, + 0x6d, 0x51, 0x4c, 0x77, 0x62, 0x64, 0x39, 0x68, 0x36, 0x33, 0x67, 0x43, 0x6b, 0x77, 0x50, 0x57, 0x70, 0x6e, + 0x54, 0x39, 0x59, 0x63, 0x48, 0x58, 0x48, 0x62, 0x5a, 0x55, 0x66, 0x7a, 0x30, 0x4e, 0x68, 0x2b, 0x37, 0x33, 0x0a, + 0x4b, 0x4f, 0x57, 0x35, 0x48, 0x54, 0x39, 0x79, 0x44, 0x4c, 0x36, 0x2b, 0x56, 0x6d, 0x6c, 0x4a, 0x42, 0x58, + 0x78, 0x6e, 0x37, 0x36, 0x75, 0x67, 0x4d, 0x38, 0x39, 0x38, 0x69, 0x33, 0x34, 0x63, 0x31, 0x46, 0x4f, 0x42, + 0x74, 0x62, 0x67, 0x4e, 0x34, 0x36, 0x69, 0x31, 0x6a, 0x62, 0x4a, 0x65, 0x45, 0x41, 0x44, 0x77, 0x6a, 0x78, + 0x5a, 0x48, 0x72, 0x49, 0x50, 0x4d, 0x74, 0x62, 0x48, 0x44, 0x2b, 0x73, 0x76, 0x58, 0x76, 0x30, 0x72, 0x39, 0x0a, + 0x71, 0x39, 0x65, 0x66, 0x4d, 0x30, 0x56, 0x6e, 0x42, 0x74, 0x31, 0x76, 0x72, 0x68, 0x44, 0x6f, 0x77, 0x4f, + 0x36, 0x72, 0x2b, 0x66, 0x37, 0x4d, 0x5a, 0x64, 0x4b, 0x66, 0x2b, 0x74, 0x72, 0x44, 0x6f, 0x65, 0x78, 0x70, + 0x35, 0x65, 0x69, 0x65, 0x6c, 0x78, 0x63, 0x45, 0x67, 0x6a, 0x48, 0x63, 0x70, 0x32, 0x67, 0x74, 0x6d, 0x41, + 0x6d, 0x66, 0x74, 0x37, 0x5a, 0x52, 0x31, 0x73, 0x6e, 0x76, 0x41, 0x64, 0x70, 0x38, 0x4c, 0x66, 0x67, 0x33, 0x0a, + 0x4c, 0x53, 0x6a, 0x4c, 0x48, 0x47, 0x51, 0x6b, 0x50, 0x6d, 0x6e, 0x62, 0x71, 0x61, 0x75, 0x50, 0x36, 0x39, + 0x53, 0x63, 0x6d, 0x66, 0x5a, 0x31, 0x59, 0x50, 0x37, 0x73, 0x66, 0x53, 0x57, 0x64, 0x37, 0x71, 0x32, 0x5a, + 0x51, 0x66, 0x63, 0x37, 0x39, 0x73, 0x78, 0x5a, 0x75, 0x48, 0x67, 0x35, 0x76, 0x36, 0x65, 0x72, 0x36, 0x6c, + 0x57, 0x62, 0x6f, 0x4b, 0x48, 0x75, 0x52, 0x4b, 0x59, 0x62, 0x38, 0x4c, 0x64, 0x72, 0x35, 0x36, 0x42, 0x72, 0x0a, + 0x38, 0x4b, 0x4e, 0x30, 0x32, 0x2b, 0x34, 0x74, 0x4c, 0x38, 0x41, 0x33, 0x36, 0x37, 0x35, 0x34, 0x67, 0x61, + 0x66, 0x37, 0x6a, 0x6b, 0x37, 0x65, 0x77, 0x51, 0x32, 0x6e, 0x66, 0x56, 0x6e, 0x6e, 0x7a, 0x4b, 0x55, 0x79, + 0x67, 0x54, 0x75, 0x55, 0x37, 0x63, 0x58, 0x34, 0x68, 0x72, 0x32, 0x4e, 0x72, 0x6f, 0x55, 0x2b, 0x41, 0x78, + 0x6a, 0x4b, 0x52, 0x76, 0x78, 0x45, 0x64, 0x4e, 0x51, 0x32, 0x59, 0x6e, 0x31, 0x54, 0x6c, 0x6a, 0x6b, 0x76, 0x0a, + 0x36, 0x31, 0x2f, 0x38, 0x54, 0x50, 0x42, 0x31, 0x5a, 0x33, 0x31, 0x7a, 0x70, 0x75, 0x75, 0x5a, 0x76, 0x31, + 0x59, 0x39, 0x48, 0x58, 0x79, 0x35, 0x30, 0x6e, 0x36, 0x66, 0x59, 0x4c, 0x73, 0x34, 0x4e, 0x74, 0x54, 0x58, + 0x2f, 0x69, 0x43, 0x64, 0x34, 0x6d, 0x65, 0x4f, 0x5a, 0x51, 0x5a, 0x66, 0x74, 0x33, 0x31, 0x32, 0x39, 0x78, + 0x2f, 0x77, 0x6e, 0x38, 0x36, 0x6d, 0x6d, 0x63, 0x50, 0x70, 0x76, 0x6e, 0x75, 0x65, 0x50, 0x50, 0x61, 0x67, 0x0a, + 0x2f, 0x69, 0x68, 0x66, 0x39, 0x48, 0x5a, 0x30, 0x2f, 0x57, 0x6f, 0x37, 0x75, 0x36, 0x6a, 0x4b, 0x74, 0x70, + 0x76, 0x6e, 0x36, 0x37, 0x4c, 0x62, 0x36, 0x47, 0x72, 0x30, 0x41, 0x41, 0x44, 0x73, 0x73, 0x77, 0x34, 0x76, + 0x48, 0x50, 0x30, 0x69, 0x6e, 0x56, 0x75, 0x50, 0x7a, 0x64, 0x54, 0x2f, 0x65, 0x75, 0x56, 0x58, 0x74, 0x68, + 0x73, 0x39, 0x44, 0x63, 0x47, 0x6c, 0x71, 0x36, 0x39, 0x6e, 0x54, 0x51, 0x65, 0x54, 0x30, 0x66, 0x73, 0x7a, 0x0a, + 0x70, 0x2b, 0x54, 0x39, 0x32, 0x54, 0x33, 0x30, 0x77, 0x59, 0x4e, 0x66, 0x66, 0x75, 0x5a, 0x4a, 0x47, 0x67, + 0x4a, 0x39, 0x62, 0x4b, 0x61, 0x45, 0x48, 0x46, 0x4c, 0x34, 0x7a, 0x4c, 0x46, 0x38, 0x50, 0x35, 0x31, 0x32, + 0x4c, 0x52, 0x74, 0x4a, 0x34, 0x35, 0x6c, 0x38, 0x7a, 0x31, 0x2f, 0x6f, 0x66, 0x75, 0x52, 0x54, 0x67, 0x41, + 0x46, 0x71, 0x47, 0x38, 0x35, 0x37, 0x57, 0x53, 0x57, 0x4b, 0x75, 0x33, 0x32, 0x73, 0x5a, 0x52, 0x4c, 0x54, 0x0a, + 0x35, 0x56, 0x38, 0x36, 0x58, 0x6f, 0x56, 0x74, 0x6a, 0x39, 0x66, 0x44, 0x72, 0x57, 0x46, 0x76, 0x7a, 0x73, + 0x63, 0x39, 0x33, 0x65, 0x39, 0x50, 0x62, 0x62, 0x2b, 0x45, 0x72, 0x36, 0x7a, 0x66, 0x44, 0x34, 0x48, 0x4a, + 0x58, 0x74, 0x44, 0x31, 0x66, 0x4d, 0x6f, 0x2f, 0x72, 0x37, 0x66, 0x41, 0x52, 0x47, 0x51, 0x6f, 0x33, 0x62, + 0x58, 0x39, 0x39, 0x73, 0x57, 0x63, 0x70, 0x2b, 0x68, 0x2b, 0x67, 0x64, 0x42, 0x74, 0x2f, 0x45, 0x4e, 0x4a, 0x0a, + 0x47, 0x48, 0x77, 0x44, 0x48, 0x2b, 0x62, 0x73, 0x6c, 0x2b, 0x2b, 0x42, 0x69, 0x43, 0x30, 0x44, 0x34, 0x4a, + 0x6d, 0x47, 0x71, 0x32, 0x41, 0x5a, 0x67, 0x42, 0x77, 0x41, 0x44, 0x4c, 0x37, 0x31, 0x59, 0x64, 0x68, 0x78, + 0x6b, 0x55, 0x51, 0x4c, 0x71, 0x68, 0x2b, 0x2f, 0x38, 0x6e, 0x6b, 0x45, 0x30, 0x2f, 0x50, 0x79, 0x58, 0x4f, + 0x64, 0x6d, 0x6e, 0x54, 0x30, 0x2b, 0x38, 0x76, 0x39, 0x78, 0x31, 0x72, 0x6a, 0x70, 0x66, 0x67, 0x38, 0x44, 0x0a, + 0x5a, 0x4e, 0x59, 0x4c, 0x57, 0x44, 0x72, 0x45, 0x48, 0x4a, 0x61, 0x46, 0x63, 0x54, 0x2f, 0x68, 0x64, 0x6b, + 0x73, 0x33, 0x73, 0x69, 0x72, 0x70, 0x46, 0x4e, 0x44, 0x52, 0x38, 0x64, 0x5a, 0x4b, 0x48, 0x46, 0x6c, 0x46, + 0x35, 0x75, 0x68, 0x4d, 0x66, 0x44, 0x78, 0x4b, 0x6d, 0x63, 0x6e, 0x4d, 0x70, 0x69, 0x58, 0x39, 0x50, 0x65, + 0x61, 0x38, 0x30, 0x72, 0x6d, 0x35, 0x55, 0x49, 0x4d, 0x6d, 0x42, 0x53, 0x43, 0x32, 0x31, 0x72, 0x54, 0x39, 0x0a, + 0x72, 0x53, 0x5a, 0x6c, 0x70, 0x67, 0x6f, 0x31, 0x39, 0x6f, 0x4c, 0x59, 0x54, 0x53, 0x6b, 0x37, 0x37, 0x4a, + 0x67, 0x56, 0x62, 0x62, 0x70, 0x51, 0x4f, 0x55, 0x63, 0x4b, 0x67, 0x43, 0x65, 0x5a, 0x4c, 0x4c, 0x63, 0x4f, + 0x7a, 0x48, 0x51, 0x51, 0x78, 0x4e, 0x70, 0x6e, 0x4b, 0x64, 0x57, 0x64, 0x67, 0x44, 0x63, 0x41, 0x4c, 0x4b, + 0x2f, 0x45, 0x36, 0x55, 0x5a, 0x4d, 0x43, 0x6b, 0x42, 0x4b, 0x32, 0x55, 0x6c, 0x33, 0x45, 0x6f, 0x52, 0x75, 0x0a, + 0x2b, 0x47, 0x4b, 0x4a, 0x46, 0x41, 0x43, 0x52, 0x6d, 0x35, 0x38, 0x43, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, + 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, + 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, + 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x0a, + 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, + 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, + 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, + 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x0a, + 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, + 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, + 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, + 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x0a, + 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, + 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, + 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, + 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x0a, + 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, + 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, + 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, + 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x0a, + 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, + 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, + 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, + 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x0a, + 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, + 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, + 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, + 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x0a, + 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, + 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, + 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, + 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x0a, + 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, + 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, + 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, + 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x0a, + 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, + 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, + 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, + 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x32, 0x50, 0x38, 0x41, 0x43, 0x2f, 0x6b, 0x64, 0x31, 0x2f, 0x36, 0x61, 0x0a, + 0x4b, 0x5a, 0x63, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, + 0x49, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x20, + 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 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, 0x42, 0x41, 0x43, 0x41, 0x59, 0x41, + 0x41, 0x41, 0x44, 0x31, 0x58, 0x61, 0x6d, 0x2b, 0x41, 0x41, 0x41, 0x41, 0x43, 0x58, 0x42, 0x49, 0x57, 0x58, + 0x4d, 0x41, 0x41, 0x41, 0x73, 0x54, 0x41, 0x41, 0x41, 0x4c, 0x45, 0x77, 0x45, 0x41, 0x6d, 0x70, 0x77, 0x59, 0x0a, + 0x41, 0x41, 0x41, 0x4c, 0x79, 0x30, 0x6c, 0x45, 0x51, 0x56, 0x52, 0x34, 0x41, 0x65, 0x32, 0x63, 0x6a, 0x31, + 0x58, 0x63, 0x4f, 0x68, 0x50, 0x46, 0x58, 0x39, 0x37, 0x35, 0x43, 0x6e, 0x41, 0x71, 0x69, 0x4b, 0x6b, 0x67, + 0x70, 0x6f, 0x4b, 0x59, 0x43, 0x6c, 0x67, 0x71, 0x77, 0x46, 0x54, 0x41, 0x70, 0x67, 0x4b, 0x57, 0x43, 0x69, + 0x41, 0x56, 0x73, 0x46, 0x54, 0x41, 0x70, 0x67, 0x4a, 0x4d, 0x42, 0x66, 0x47, 0x72, 0x41, 0x4b, 0x55, 0x43, 0x0a, + 0x33, 0x45, 0x47, 0x2b, 0x33, 0x30, 0x33, 0x73, 0x39, 0x35, 0x54, 0x42, 0x33, 0x6a, 0x39, 0x67, 0x37, 0x32, + 0x36, 0x51, 0x37, 0x6a, 0x6b, 0x33, 0x6d, 0x68, 0x6c, 0x4a, 0x4d, 0x2f, 0x4a, 0x49, 0x6d, 0x76, 0x58, 0x75, + 0x79, 0x65, 0x48, 0x64, 0x6a, 0x78, 0x38, 0x2f, 0x2f, 0x6f, 0x71, 0x49, 0x47, 0x59, 0x67, 0x5a, 0x43, 0x44, + 0x4d, 0x44, 0x66, 0x34, 0x66, 0x35, 0x32, 0x50, 0x47, 0x70, 0x59, 0x77, 0x5a, 0x69, 0x42, 0x70, 0x53, 0x42, 0x0a, + 0x57, 0x41, 0x44, 0x69, 0x4f, 0x59, 0x67, 0x5a, 0x43, 0x44, 0x67, 0x44, 0x73, 0x51, 0x41, 0x45, 0x76, 0x50, + 0x6e, 0x78, 0x30, 0x57, 0x4d, 0x47, 0x59, 0x67, 0x47, 0x49, 0x5a, 0x79, 0x42, 0x6d, 0x49, 0x4f, 0x41, 0x4d, + 0x78, 0x41, 0x49, 0x51, 0x38, 0x4f, 0x62, 0x48, 0x52, 0x34, 0x38, 0x5a, 0x69, 0x41, 0x55, 0x67, 0x6e, 0x6f, + 0x47, 0x59, 0x67, 0x59, 0x41, 0x7a, 0x38, 0x4c, 0x2b, 0x41, 0x6e, 0x2f, 0x31, 0x50, 0x65, 0x2f, 0x53, 0x4d, 0x0a, + 0x42, 0x65, 0x66, 0x51, 0x77, 0x52, 0x4c, 0x57, 0x4d, 0x4f, 0x4b, 0x76, 0x76, 0x35, 0x51, 0x58, 0x4d, 0x54, + 0x58, 0x4a, 0x63, 0x4f, 0x68, 0x69, 0x43, 0x53, 0x4e, 0x36, 0x4d, 0x68, 0x41, 0x4c, 0x51, 0x45, 0x39, 0x69, + 0x39, 0x73, 0x69, 0x63, 0x73, 0x4a, 0x59, 0x37, 0x6d, 0x48, 0x74, 0x72, 0x30, 0x75, 0x55, 0x2f, 0x67, 0x70, + 0x56, 0x6e, 0x43, 0x30, 0x6e, 0x4d, 0x65, 0x64, 0x68, 0x54, 0x4f, 0x49, 0x48, 0x4b, 0x7a, 0x79, 0x6f, 0x73, 0x0a, + 0x47, 0x50, 0x41, 0x56, 0x7a, 0x6c, 0x63, 0x4e, 0x44, 0x4b, 0x30, 0x2f, 0x66, 0x67, 0x58, 0x59, 0x2f, 0x59, + 0x35, 0x66, 0x73, 0x59, 0x51, 0x6e, 0x71, 0x50, 0x2b, 0x52, 0x70, 0x56, 0x61, 0x36, 0x44, 0x2b, 0x6d, 0x35, + 0x62, 0x30, 0x44, 0x57, 0x6f, 0x62, 0x39, 0x76, 0x57, 0x74, 0x50, 0x31, 0x70, 0x74, 0x57, 0x73, 0x65, 0x57, + 0x34, 0x39, 0x65, 0x77, 0x48, 0x58, 0x75, 0x66, 0x77, 0x4d, 0x2b, 0x31, 0x6b, 0x6f, 0x62, 0x6d, 0x67, 0x66, 0x0a, + 0x59, 0x51, 0x45, 0x6a, 0x6d, 0x67, 0x7a, 0x45, 0x41, 0x72, 0x44, 0x62, 0x6f, 0x36, 0x44, 0x4c, 0x50, 0x59, + 0x58, 0x74, 0x51, 0x56, 0x59, 0x72, 0x58, 0x59, 0x65, 0x31, 0x52, 0x64, 0x45, 0x4b, 0x70, 0x74, 0x58, 0x59, + 0x33, 0x4e, 0x6a, 0x2b, 0x4a, 0x46, 0x58, 0x50, 0x2b, 0x61, 0x4e, 0x68, 0x73, 0x63, 0x62, 0x43, 0x5a, 0x34, + 0x7a, 0x35, 0x42, 0x6e, 0x50, 0x34, 0x55, 0x71, 0x52, 0x4d, 0x56, 0x47, 0x37, 0x76, 0x6f, 0x66, 0x49, 0x58, 0x0a, + 0x50, 0x4e, 0x37, 0x46, 0x2f, 0x77, 0x71, 0x38, 0x73, 0x7a, 0x4f, 0x67, 0x41, 0x2f, 0x69, 0x30, 0x4a, 0x50, + 0x6f, 0x42, 0x66, 0x51, 0x37, 0x71, 0x6b, 0x76, 0x54, 0x68, 0x6b, 0x6f, 0x35, 0x5a, 0x58, 0x2b, 0x65, 0x65, + 0x32, 0x78, 0x39, 0x5a, 0x58, 0x39, 0x71, 0x73, 0x73, 0x61, 0x5a, 0x39, 0x33, 0x38, 0x69, 0x32, 0x55, 0x5a, + 0x37, 0x75, 0x59, 0x47, 0x34, 0x37, 0x47, 0x72, 0x32, 0x69, 0x4c, 0x65, 0x46, 0x33, 0x4b, 0x46, 0x6c, 0x49, 0x0a, + 0x47, 0x33, 0x36, 0x69, 0x7a, 0x57, 0x45, 0x58, 0x46, 0x50, 0x4d, 0x49, 0x74, 0x6e, 0x4f, 0x36, 0x78, 0x72, + 0x78, 0x35, 0x57, 0x2f, 0x77, 0x4e, 0x59, 0x48, 0x64, 0x62, 0x6e, 0x4b, 0x30, 0x49, 0x6e, 0x64, 0x4c, 0x76, + 0x6f, 0x41, 0x35, 0x71, 0x41, 0x72, 0x74, 0x51, 0x64, 0x68, 0x6e, 0x2f, 0x41, 0x4a, 0x75, 0x65, 0x50, 0x56, + 0x31, 0x6a, 0x6e, 0x58, 0x70, 0x75, 0x66, 0x56, 0x70, 0x72, 0x76, 0x4d, 0x55, 0x63, 0x77, 0x79, 0x56, 0x30, 0x0a, + 0x63, 0x42, 0x6c, 0x53, 0x4f, 0x67, 0x74, 0x34, 0x44, 0x76, 0x30, 0x38, 0x74, 0x72, 0x36, 0x44, 0x4c, 0x67, + 0x4a, 0x2f, 0x6b, 0x35, 0x53, 0x49, 0x33, 0x57, 0x53, 0x67, 0x58, 0x6a, 0x50, 0x73, 0x6c, 0x35, 0x35, 0x78, + 0x46, 0x66, 0x61, 0x79, 0x70, 0x32, 0x2f, 0x66, 0x7a, 0x62, 0x6c, 0x5a, 0x34, 0x4d, 0x4c, 0x6f, 0x72, 0x58, + 0x71, 0x44, 0x6b, 0x4c, 0x56, 0x4b, 0x30, 0x2b, 0x71, 0x35, 0x44, 0x2b, 0x45, 0x5a, 0x64, 0x48, 0x41, 0x56, 0x0a, + 0x48, 0x41, 0x4e, 0x6d, 0x38, 0x41, 0x44, 0x61, 0x4f, 0x41, 0x6b, 0x32, 0x78, 0x51, 0x67, 0x57, 0x73, 0x51, + 0x44, 0x73, 0x62, 0x75, 0x74, 0x31, 0x6b, 0x4d, 0x55, 0x75, 0x4f, 0x49, 0x78, 0x6c, 0x30, 0x7a, 0x47, 0x6a, + 0x31, 0x53, 0x64, 0x64, 0x33, 0x65, 0x68, 0x71, 0x53, 0x71, 0x68, 0x50, 0x72, 0x6b, 0x32, 0x51, 0x4d, 0x7a, + 0x6a, 0x64, 0x5a, 0x4d, 0x4b, 0x49, 0x59, 0x30, 0x2b, 0x4e, 0x62, 0x2f, 0x31, 0x43, 0x62, 0x7a, 0x48, 0x46, 0x0a, + 0x4d, 0x44, 0x46, 0x47, 0x35, 0x55, 0x76, 0x50, 0x72, 0x58, 0x5a, 0x54, 0x31, 0x45, 0x77, 0x34, 0x67, 0x58, + 0x4d, 0x7a, 0x4d, 0x55, 0x4f, 0x66, 0x47, 0x56, 0x73, 0x77, 0x61, 0x76, 0x77, 0x4e, 0x59, 0x4c, 0x64, 0x62, + 0x72, 0x63, 0x4f, 0x6e, 0x37, 0x37, 0x65, 0x70, 0x74, 0x77, 0x79, 0x48, 0x72, 0x49, 0x50, 0x61, 0x64, 0x63, + 0x68, 0x54, 0x37, 0x41, 0x35, 0x75, 0x69, 0x6d, 0x39, 0x4d, 0x55, 0x4b, 0x77, 0x61, 0x36, 0x74, 0x50, 0x54, 0x0a, + 0x77, 0x56, 0x30, 0x68, 0x49, 0x66, 0x43, 0x54, 0x43, 0x66, 0x34, 0x65, 0x58, 0x57, 0x74, 0x72, 0x6f, 0x54, + 0x47, 0x50, 0x55, 0x47, 0x32, 0x4c, 0x43, 0x6b, 0x47, 0x58, 0x33, 0x78, 0x2f, 0x58, 0x39, 0x6d, 0x33, 0x61, + 0x36, 0x6c, 0x4f, 0x2f, 0x38, 0x43, 0x62, 0x4a, 0x70, 0x39, 0x59, 0x51, 0x48, 0x47, 0x49, 0x42, 0x32, 0x49, + 0x38, 0x74, 0x6e, 0x37, 0x43, 0x4d, 0x44, 0x44, 0x71, 0x34, 0x67, 0x44, 0x71, 0x51, 0x51, 0x79, 0x48, 0x48, 0x0a, + 0x30, 0x62, 0x33, 0x6e, 0x72, 0x45, 0x54, 0x57, 0x52, 0x64, 0x6f, 0x56, 0x43, 0x67, 0x4c, 0x72, 0x41, 0x72, + 0x62, 0x51, 0x38, 0x36, 0x72, 0x67, 0x2b, 0x65, 0x69, 0x36, 0x6f, 0x41, 0x63, 0x4d, 0x47, 0x43, 0x6f, 0x76, + 0x43, 0x62, 0x34, 0x65, 0x6f, 0x64, 0x6f, 0x57, 0x79, 0x6b, 0x6e, 0x5a, 0x4b, 0x71, 0x47, 0x30, 0x38, 0x55, + 0x66, 0x41, 0x2f, 0x64, 0x68, 0x70, 0x58, 0x51, 0x4a, 0x52, 0x53, 0x4f, 0x45, 0x45, 0x66, 0x6d, 0x70, 0x6b, 0x0a, + 0x48, 0x64, 0x49, 0x4d, 0x43, 0x75, 0x58, 0x50, 0x66, 0x33, 0x2b, 0x39, 0x48, 0x54, 0x77, 0x30, 0x65, 0x74, + 0x33, 0x59, 0x2b, 0x68, 0x72, 0x62, 0x6e, 0x7a, 0x4e, 0x77, 0x41, 0x68, 0x64, 0x39, 0x45, 0x30, 0x61, 0x32, + 0x48, 0x78, 0x76, 0x2f, 0x65, 0x67, 0x34, 0x66, 0x43, 0x59, 0x72, 0x57, 0x35, 0x2b, 0x4d, 0x7a, 0x53, 0x75, + 0x30, 0x62, 0x58, 0x69, 0x6e, 0x4c, 0x31, 0x78, 0x78, 0x4f, 0x50, 0x54, 0x38, 0x35, 0x63, 0x75, 0x6e, 0x70, 0x0a, + 0x51, 0x59, 0x6a, 0x78, 0x44, 0x57, 0x42, 0x2f, 0x74, 0x72, 0x6c, 0x67, 0x4b, 0x65, 0x63, 0x77, 0x32, 0x33, + 0x42, 0x4a, 0x63, 0x38, 0x62, 0x66, 0x77, 0x68, 0x4c, 0x32, 0x34, 0x59, 0x36, 0x4f, 0x69, 0x64, 0x65, 0x70, + 0x43, 0x33, 0x41, 0x41, 0x31, 0x57, 0x34, 0x62, 0x50, 0x30, 0x78, 0x41, 0x72, 0x63, 0x4e, 0x35, 0x74, 0x67, + 0x4a, 0x5a, 0x62, 0x77, 0x41, 0x74, 0x48, 0x49, 0x4c, 0x47, 0x44, 0x49, 0x30, 0x70, 0x44, 0x71, 0x38, 0x38, 0x0a, + 0x70, 0x35, 0x66, 0x49, 0x4d, 0x30, 0x38, 0x50, 0x51, 0x6f, 0x77, 0x2f, 0x41, 0x75, 0x35, 0x2b, 0x6d, 0x33, + 0x55, 0x78, 0x39, 0x54, 0x71, 0x71, 0x51, 0x35, 0x2b, 0x39, 0x59, 0x44, 0x6b, 0x46, 0x63, 0x2b, 0x36, 0x68, + 0x4c, 0x6e, 0x6b, 0x4b, 0x75, 0x32, 0x41, 0x2f, 0x51, 0x52, 0x4d, 0x47, 0x58, 0x58, 0x51, 0x4e, 0x48, 0x4e, + 0x6d, 0x6d, 0x5a, 0x2f, 0x56, 0x52, 0x6f, 0x54, 0x6a, 0x66, 0x67, 0x48, 0x78, 0x73, 0x39, 0x43, 0x39, 0x47, 0x0a, + 0x48, 0x30, 0x70, 0x56, 0x44, 0x6f, 0x4a, 0x48, 0x4c, 0x41, 0x43, 0x37, 0x4f, 0x77, 0x49, 0x36, 0x67, 0x4c, + 0x71, 0x30, 0x79, 0x79, 0x37, 0x75, 0x4a, 0x71, 0x76, 0x54, 0x35, 0x66, 0x6f, 0x47, 0x69, 0x34, 0x35, 0x4a, + 0x44, 0x70, 0x75, 0x39, 0x53, 0x46, 0x4e, 0x73, 0x4b, 0x64, 0x77, 0x6d, 0x37, 0x4f, 0x55, 0x75, 0x4f, 0x34, + 0x4c, 0x72, 0x4f, 0x58, 0x77, 0x73, 0x66, 0x47, 0x56, 0x41, 0x2b, 0x65, 0x4f, 0x41, 0x76, 0x76, 0x35, 0x59, 0x0a, + 0x56, 0x2f, 0x45, 0x72, 0x77, 0x47, 0x36, 0x32, 0x4c, 0x69, 0x47, 0x73, 0x50, 0x72, 0x57, 0x7a, 0x6e, 0x76, + 0x41, 0x36, 0x39, 0x41, 0x2b, 0x77, 0x67, 0x69, 0x58, 0x30, 0x6b, 0x61, 0x4e, 0x6f, 0x33, 0x6d, 0x6e, 0x54, + 0x30, 0x6a, 0x7a, 0x44, 0x47, 0x5a, 0x62, 0x35, 0x4d, 0x2b, 0x75, 0x76, 0x4e, 0x34, 0x33, 0x55, 0x73, 0x35, + 0x66, 0x49, 0x52, 0x35, 0x34, 0x2b, 0x74, 0x76, 0x68, 0x45, 0x67, 0x4d, 0x51, 0x4c, 0x63, 0x6f, 0x69, 0x73, 0x0a, + 0x5a, 0x32, 0x79, 0x68, 0x35, 0x31, 0x49, 0x52, 0x61, 0x36, 0x45, 0x2b, 0x6a, 0x52, 0x6b, 0x61, 0x4e, 0x6f, + 0x37, 0x38, 0x4b, 0x77, 0x2b, 0x6c, 0x68, 0x4b, 0x43, 0x67, 0x2f, 0x77, 0x6f, 0x63, 0x47, 0x42, 0x4f, 0x65, + 0x64, 0x77, 0x70, 0x6e, 0x4d, 0x4e, 0x33, 0x42, 0x73, 0x79, 0x76, 0x2b, 0x4e, 0x32, 0x6a, 0x78, 0x68, 0x45, + 0x46, 0x72, 0x55, 0x76, 0x2b, 0x36, 0x65, 0x36, 0x4c, 0x31, 0x33, 0x38, 0x45, 0x75, 0x46, 0x42, 0x69, 0x74, 0x0a, + 0x6e, 0x37, 0x78, 0x6a, 0x59, 0x4e, 0x63, 0x34, 0x4f, 0x32, 0x38, 0x49, 0x33, 0x63, 0x5a, 0x2b, 0x58, 0x47, + 0x4e, 0x39, 0x4e, 0x78, 0x31, 0x6a, 0x68, 0x6c, 0x69, 0x4c, 0x7a, 0x58, 0x2f, 0x58, 0x57, 0x6f, 0x61, 0x49, + 0x73, 0x2f, 0x63, 0x2b, 0x51, 0x76, 0x77, 0x4b, 0x63, 0x45, 0x57, 0x46, 0x46, 0x2f, 0x55, 0x64, 0x32, 0x50, + 0x2b, 0x30, 0x32, 0x56, 0x62, 0x68, 0x37, 0x2f, 0x72, 0x6b, 0x4c, 0x77, 0x6d, 0x75, 0x54, 0x37, 0x6f, 0x5a, 0x0a, + 0x72, 0x4f, 0x47, 0x36, 0x63, 0x41, 0x77, 0x38, 0x61, 0x57, 0x6a, 0x6e, 0x33, 0x57, 0x44, 0x50, 0x6f, 0x59, + 0x38, 0x53, 0x5a, 0x65, 0x45, 0x62, 0x6b, 0x4a, 0x57, 0x4c, 0x78, 0x4e, 0x6a, 0x47, 0x55, 0x49, 0x2b, 0x4e, + 0x30, 0x39, 0x4c, 0x6f, 0x55, 0x6e, 0x4e, 0x6a, 0x2b, 0x32, 0x37, 0x30, 0x49, 0x56, 0x54, 0x6c, 0x4a, 0x54, + 0x4f, 0x4f, 0x62, 0x6f, 0x30, 0x65, 0x6a, 0x42, 0x70, 0x69, 0x41, 0x5a, 0x68, 0x34, 0x75, 0x37, 0x75, 0x4e, 0x0a, + 0x67, 0x2b, 0x2b, 0x46, 0x2b, 0x33, 0x6e, 0x42, 0x37, 0x65, 0x47, 0x62, 0x4d, 0x30, 0x43, 0x76, 0x6e, 0x77, + 0x36, 0x2b, 0x46, 0x41, 0x73, 0x6d, 0x79, 0x6b, 0x64, 0x74, 0x48, 0x4f, 0x69, 0x77, 0x32, 0x32, 0x66, 0x38, + 0x62, 0x4d, 0x61, 0x70, 0x2f, 0x38, 0x4c, 0x4d, 0x47, 0x30, 0x4f, 0x64, 0x47, 0x4b, 0x64, 0x66, 0x6a, 0x54, + 0x36, 0x32, 0x71, 0x75, 0x64, 0x55, 0x50, 0x67, 0x6f, 0x54, 0x71, 0x45, 0x4b, 0x66, 0x47, 0x56, 0x73, 0x77, 0x0a, + 0x61, 0x6d, 0x67, 0x46, 0x51, 0x49, 0x64, 0x41, 0x62, 0x4f, 0x46, 0x61, 0x59, 0x51, 0x74, 0x74, 0x53, 0x67, + 0x78, 0x37, 0x30, 0x65, 0x62, 0x59, 0x7a, 0x75, 0x41, 0x51, 0x30, 0x45, 0x46, 0x57, 0x45, 0x66, 0x43, 0x52, + 0x6f, 0x6b, 0x78, 0x39, 0x41, 0x37, 0x4b, 0x44, 0x58, 0x34, 0x78, 0x4e, 0x59, 0x7a, 0x4a, 0x6a, 0x47, 0x31, + 0x4b, 0x56, 0x37, 0x39, 0x52, 0x7a, 0x57, 0x43, 0x4d, 0x76, 0x50, 0x48, 0x31, 0x73, 0x55, 0x66, 0x48, 0x76, 0x0a, + 0x59, 0x57, 0x45, 0x43, 0x61, 0x52, 0x31, 0x36, 0x67, 0x77, 0x6f, 0x57, 0x6f, 0x52, 0x55, 0x41, 0x48, 0x51, + 0x51, 0x66, 0x7a, 0x6c, 0x64, 0x47, 0x6c, 0x75, 0x33, 0x6c, 0x56, 0x32, 0x78, 0x39, 0x47, 0x67, 0x2b, 0x4a, + 0x43, 0x6d, 0x65, 0x58, 0x78, 0x75, 0x45, 0x35, 0x65, 0x6d, 0x4a, 0x73, 0x4d, 0x33, 0x53, 0x4e, 0x39, 0x61, + 0x46, 0x50, 0x78, 0x37, 0x46, 0x77, 0x61, 0x68, 0x77, 0x76, 0x6a, 0x4e, 0x36, 0x71, 0x64, 0x53, 0x73, 0x4d, 0x0a, + 0x31, 0x4b, 0x62, 0x34, 0x30, 0x58, 0x50, 0x70, 0x71, 0x31, 0x34, 0x47, 0x66, 0x53, 0x69, 0x57, 0x43, 0x71, + 0x62, 0x7a, 0x6a, 0x61, 0x48, 0x4a, 0x6f, 0x52, 0x57, 0x41, 0x31, 0x47, 0x7a, 0x77, 0x67, 0x39, 0x48, 0x48, + 0x55, 0x68, 0x4d, 0x63, 0x46, 0x38, 0x62, 0x35, 0x47, 0x66, 0x72, 0x51, 0x42, 0x31, 0x34, 0x68, 0x5a, 0x74, + 0x44, 0x42, 0x46, 0x6c, 0x32, 0x78, 0x31, 0x57, 0x65, 0x4c, 0x54, 0x34, 0x5a, 0x74, 0x32, 0x6b, 0x34, 0x61, 0x0a, + 0x75, 0x4a, 0x30, 0x59, 0x66, 0x31, 0x2b, 0x4e, 0x33, 0x71, 0x70, 0x56, 0x4b, 0x7a, 0x54, 0x74, 0x42, 0x36, + 0x4f, 0x76, 0x71, 0x2b, 0x70, 0x5a, 0x64, 0x50, 0x45, 0x66, 0x59, 0x51, 0x45, 0x74, 0x46, 0x45, 0x65, 0x58, + 0x33, 0x38, 0x61, 0x7a, 0x34, 0x39, 0x36, 0x38, 0x48, 0x6e, 0x6f, 0x42, 0x32, 0x4e, 0x59, 0x47, 0x46, 0x79, + 0x61, 0x51, 0x44, 0x6c, 0x35, 0x70, 0x62, 0x45, 0x4f, 0x71, 0x6c, 0x38, 0x62, 0x5a, 0x71, 0x64, 0x47, 0x6c, 0x0a, + 0x6c, 0x6e, 0x41, 0x4f, 0x66, 0x56, 0x79, 0x67, 0x70, 0x4c, 0x35, 0x68, 0x41, 0x48, 0x6c, 0x69, 0x66, 0x4e, + 0x62, 0x6f, 0x69, 0x78, 0x36, 0x2f, 0x7a, 0x74, 0x68, 0x7a, 0x6f, 0x36, 0x39, 0x53, 0x4d, 0x77, 0x62, 0x6f, + 0x30, 0x31, 0x34, 0x73, 0x59, 0x42, 0x65, 0x75, 0x4d, 0x63, 0x62, 0x4c, 0x33, 0x32, 0x51, 0x6d, 0x74, 0x41, + 0x4a, 0x67, 0x44, 0x30, 0x52, 0x70, 0x44, 0x53, 0x50, 0x70, 0x6e, 0x34, 0x7a, 0x66, 0x57, 0x36, 0x4d, 0x50, 0x0a, + 0x72, 0x64, 0x6f, 0x4c, 0x70, 0x6f, 0x75, 0x52, 0x64, 0x67, 0x54, 0x52, 0x57, 0x30, 0x44, 0x74, 0x32, 0x52, + 0x50, 0x6b, 0x4b, 0x30, 0x38, 0x66, 0x51, 0x6a, 0x77, 0x32, 0x54, 0x75, 0x7a, 0x61, 0x2f, 0x47, 0x36, 0x48, + 0x49, 0x72, 0x5a, 0x49, 0x45, 0x62, 0x54, 0x32, 0x64, 0x58, 0x48, 0x48, 0x77, 0x4c, 0x37, 0x78, 0x46, 0x58, + 0x32, 0x36, 0x2b, 0x50, 0x61, 0x5a, 0x31, 0x2f, 0x58, 0x39, 0x4a, 0x73, 0x65, 0x46, 0x56, 0x67, 0x41, 0x2b, 0x0a, + 0x37, 0x6d, 0x67, 0x58, 0x63, 0x78, 0x4e, 0x33, 0x32, 0x53, 0x55, 0x77, 0x51, 0x31, 0x2b, 0x6b, 0x31, 0x73, + 0x79, 0x79, 0x4d, 0x62, 0x49, 0x4f, 0x54, 0x78, 0x70, 0x6e, 0x76, 0x77, 0x70, 0x4d, 0x73, 0x49, 0x6c, 0x44, + 0x49, 0x4d, 0x47, 0x4a, 0x39, 0x64, 0x58, 0x33, 0x2b, 0x74, 0x2f, 0x47, 0x4b, 0x31, 0x75, 0x68, 0x61, 0x63, + 0x2b, 0x4e, 0x76, 0x71, 0x6e, 0x71, 0x6d, 0x48, 0x41, 0x47, 0x44, 0x32, 0x45, 0x4a, 0x49, 0x37, 0x77, 0x4d, 0x0a, + 0x68, 0x46, 0x59, 0x41, 0x64, 0x43, 0x43, 0x33, 0x44, 0x63, 0x58, 0x30, 0x34, 0x39, 0x62, 0x6f, 0x62, 0x67, + 0x75, 0x4c, 0x65, 0x44, 0x41, 0x78, 0x4d, 0x71, 0x4f, 0x33, 0x36, 0x68, 0x79, 0x68, 0x62, 0x4a, 0x57, 0x6d, + 0x76, 0x61, 0x48, 0x31, 0x31, 0x32, 0x79, 0x36, 0x31, 0x31, 0x59, 0x6e, 0x78, 0x6f, 0x39, 0x44, 0x58, 0x36, + 0x79, 0x59, 0x66, 0x57, 0x76, 0x36, 0x43, 0x2f, 0x54, 0x55, 0x32, 0x50, 0x72, 0x55, 0x53, 0x36, 0x39, 0x44, 0x0a, + 0x63, 0x59, 0x37, 0x67, 0x41, 0x5a, 0x7a, 0x44, 0x69, 0x49, 0x34, 0x4d, 0x68, 0x46, 0x59, 0x41, 0x4f, 0x6c, + 0x49, 0x77, 0x75, 0x69, 0x6b, 0x7a, 0x45, 0x53, 0x71, 0x6a, 0x6a, 0x36, 0x58, 0x61, 0x4f, 0x4d, 0x76, 0x65, + 0x66, 0x73, 0x35, 0x59, 0x52, 0x4f, 0x30, 0x74, 0x4a, 0x45, 0x46, 0x57, 0x45, 0x58, 0x67, 0x74, 0x54, 0x6f, + 0x32, 0x44, 0x68, 0x64, 0x47, 0x37, 0x31, 0x42, 0x4b, 0x6a, 0x4d, 0x78, 0x31, 0x58, 0x52, 0x75, 0x39, 0x54, 0x0a, + 0x35, 0x33, 0x53, 0x38, 0x61, 0x33, 0x68, 0x43, 0x57, 0x38, 0x4b, 0x49, 0x4a, 0x52, 0x6d, 0x49, 0x42, 0x57, + 0x42, 0x4a, 0x63, 0x74, 0x35, 0x59, 0x6c, 0x79, 0x35, 0x31, 0x48, 0x78, 0x77, 0x64, 0x6c, 0x36, 0x5a, 0x7a, + 0x67, 0x69, 0x36, 0x2b, 0x46, 0x43, 0x6b, 0x54, 0x63, 0x7a, 0x50, 0x35, 0x69, 0x39, 0x48, 0x37, 0x31, 0x4d, + 0x2b, 0x6d, 0x51, 0x2b, 0x73, 0x6f, 0x6a, 0x47, 0x30, 0x49, 0x4e, 0x63, 0x57, 0x4a, 0x69, 0x6f, 0x73, 0x34, 0x0a, + 0x68, 0x51, 0x6b, 0x4d, 0x43, 0x71, 0x45, 0x56, 0x67, 0x49, 0x63, 0x39, 0x32, 0x4e, 0x31, 0x71, 0x53, 0x32, + 0x73, 0x6f, 0x4e, 0x34, 0x78, 0x7a, 0x7a, 0x58, 0x67, 0x37, 0x52, 0x32, 0x38, 0x42, 0x4b, 0x58, 0x77, 0x4a, + 0x7a, 0x73, 0x32, 0x6b, 0x45, 0x74, 0x30, 0x5a, 0x57, 0x35, 0x2b, 0x36, 0x6f, 0x4b, 0x4d, 0x30, 0x6e, 0x56, + 0x70, 0x4c, 0x5a, 0x6d, 0x79, 0x76, 0x55, 0x65, 0x56, 0x4c, 0x61, 0x31, 0x52, 0x52, 0x2b, 0x67, 0x6f, 0x56, 0x0a, + 0x55, 0x34, 0x55, 0x67, 0x67, 0x63, 0x45, 0x67, 0x74, 0x41, 0x4a, 0x67, 0x4e, 0x33, 0x62, 0x49, 0x41, 0x32, + 0x56, 0x39, 0x39, 0x2b, 0x6e, 0x62, 0x69, 0x70, 0x6e, 0x32, 0x4c, 0x57, 0x43, 0x4a, 0x2f, 0x59, 0x79, 0x2b, + 0x32, 0x75, 0x76, 0x58, 0x5a, 0x58, 0x6a, 0x4a, 0x56, 0x77, 0x48, 0x4e, 0x4b, 0x7a, 0x77, 0x2f, 0x45, 0x6d, + 0x2b, 0x4e, 0x76, 0x6b, 0x71, 0x31, 0x61, 0x39, 0x48, 0x34, 0x65, 0x7a, 0x68, 0x5a, 0x4e, 0x58, 0x48, 0x4e, 0x0a, + 0x66, 0x6c, 0x33, 0x2b, 0x53, 0x33, 0x67, 0x48, 0x74, 0x64, 0x35, 0x57, 0x6e, 0x79, 0x49, 0x48, 0x67, 0x39, + 0x41, 0x4b, 0x51, 0x47, 0x31, 0x32, 0x56, 0x68, 0x73, 0x2f, 0x4e, 0x74, 0x7a, 0x59, 0x41, 0x58, 0x72, 0x38, + 0x70, 0x7a, 0x33, 0x32, 0x5a, 0x57, 0x5a, 0x48, 0x70, 0x79, 0x36, 0x46, 0x6a, 0x78, 0x78, 0x6c, 0x35, 0x68, + 0x76, 0x57, 0x6b, 0x43, 0x65, 0x4d, 0x38, 0x58, 0x50, 0x72, 0x30, 0x4f, 0x64, 0x77, 0x45, 0x7a, 0x67, 0x47, 0x0a, + 0x6e, 0x35, 0x67, 0x4a, 0x38, 0x71, 0x6b, 0x4c, 0x4f, 0x34, 0x4f, 0x2b, 0x66, 0x39, 0x53, 0x4e, 0x6f, 0x66, + 0x6b, 0x31, 0x72, 0x4f, 0x41, 0x6e, 0x2b, 0x42, 0x30, 0x36, 0x2b, 0x41, 0x45, 0x47, 0x67, 0x39, 0x41, 0x4b, + 0x67, 0x44, 0x62, 0x62, 0x68, 0x7a, 0x5a, 0x2b, 0x62, 0x44, 0x67, 0x54, 0x49, 0x44, 0x66, 0x36, 0x57, 0x47, + 0x70, 0x71, 0x48, 0x4e, 0x74, 0x6e, 0x4e, 0x39, 0x33, 0x2f, 0x71, 0x74, 0x64, 0x49, 0x35, 0x62, 0x2f, 0x61, 0x0a, + 0x4c, 0x2b, 0x47, 0x43, 0x4a, 0x6a, 0x4f, 0x32, 0x5a, 0x61, 0x72, 0x47, 0x2b, 0x37, 0x6a, 0x31, 0x6c, 0x51, + 0x33, 0x6b, 0x6b, 0x72, 0x46, 0x6e, 0x48, 0x65, 0x50, 0x6c, 0x2f, 0x78, 0x48, 0x4f, 0x34, 0x4b, 0x70, 0x31, + 0x35, 0x59, 0x77, 0x70, 0x34, 0x41, 0x32, 0x38, 0x68, 0x31, 0x4e, 0x6f, 0x6f, 0x61, 0x4c, 0x33, 0x73, 0x54, + 0x45, 0x6d, 0x74, 0x76, 0x4d, 0x74, 0x36, 0x36, 0x48, 0x39, 0x51, 0x52, 0x42, 0x74, 0x37, 0x70, 0x4f, 0x33, 0x0a, + 0x6f, 0x54, 0x58, 0x79, 0x65, 0x30, 0x38, 0x66, 0x53, 0x39, 0x54, 0x42, 0x79, 0x7a, 0x33, 0x6e, 0x52, 0x38, + 0x69, 0x6c, 0x70, 0x34, 0x38, 0x68, 0x36, 0x73, 0x41, 0x58, 0x6e, 0x75, 0x50, 0x50, 0x79, 0x4e, 0x65, 0x65, + 0x76, 0x6b, 0x78, 0x55, 0x6e, 0x68, 0x36, 0x68, 0x32, 0x68, 0x59, 0x4f, 0x34, 0x52, 0x41, 0x71, 0x5a, 0x38, + 0x74, 0x51, 0x30, 0x4b, 0x6e, 0x59, 0x4c, 0x54, 0x54, 0x2b, 0x41, 0x4b, 0x36, 0x61, 0x31, 0x34, 0x37, 0x76, 0x0a, + 0x61, 0x67, 0x75, 0x4d, 0x56, 0x39, 0x42, 0x66, 0x6a, 0x78, 0x31, 0x58, 0x59, 0x66, 0x42, 0x6a, 0x5a, 0x45, + 0x76, 0x47, 0x61, 0x7a, 0x30, 0x35, 0x46, 0x4f, 0x54, 0x7a, 0x47, 0x6b, 0x36, 0x67, 0x35, 0x70, 0x51, 0x4e, + 0x61, 0x64, 0x34, 0x2b, 0x51, 0x6e, 0x73, 0x44, 0x71, 0x4e, 0x6c, 0x53, 0x35, 0x32, 0x31, 0x72, 0x67, 0x71, + 0x78, 0x4e, 0x48, 0x78, 0x75, 0x56, 0x43, 0x58, 0x42, 0x71, 0x39, 0x44, 0x48, 0x55, 0x69, 0x58, 0x46, 0x71, 0x0a, + 0x31, 0x32, 0x43, 0x36, 0x66, 0x31, 0x4e, 0x72, 0x4e, 0x50, 0x76, 0x36, 0x6e, 0x57, 0x4b, 0x37, 0x2f, 0x32, + 0x33, 0x55, 0x63, 0x79, 0x58, 0x42, 0x64, 0x47, 0x48, 0x4d, 0x43, 0x33, 0x54, 0x35, 0x65, 0x77, 0x33, 0x6d, + 0x54, 0x46, 0x62, 0x52, 0x72, 0x4a, 0x59, 0x34, 0x79, 0x65, 0x6a, 0x4c, 0x50, 0x53, 0x5a, 0x4c, 0x78, 0x71, + 0x70, 0x72, 0x44, 0x6c, 0x50, 0x34, 0x41, 0x63, 0x36, 0x67, 0x35, 0x73, 0x74, 0x2f, 0x43, 0x63, 0x50, 0x42, 0x0a, + 0x53, 0x48, 0x39, 0x78, 0x5a, 0x5a, 0x2f, 0x2f, 0x45, 0x6f, 0x72, 0x2b, 0x79, 0x6f, 0x79, 0x50, 0x4b, 0x35, + 0x53, 0x78, 0x31, 0x35, 0x76, 0x35, 0x41, 0x5a, 0x48, 0x31, 0x31, 0x33, 0x38, 0x32, 0x2b, 0x63, 0x73, 0x2f, + 0x6d, 0x36, 0x35, 0x76, 0x30, 0x68, 0x46, 0x76, 0x55, 0x78, 0x38, 0x61, 0x50, 0x7a, 0x4e, 0x2b, 0x70, 0x4e, + 0x37, 0x41, 0x50, 0x6c, 0x39, 0x64, 0x34, 0x39, 0x4d, 0x6c, 0x34, 0x2f, 0x76, 0x38, 0x4c, 0x4c, 0x4d, 0x58, 0x0a, + 0x2b, 0x48, 0x75, 0x45, 0x4c, 0x38, 0x55, 0x4e, 0x45, 0x35, 0x66, 0x35, 0x44, 0x36, 0x6f, 0x76, 0x74, 0x4b, + 0x38, 0x41, 0x71, 0x75, 0x77, 0x54, 0x71, 0x42, 0x2b, 0x53, 0x57, 0x6a, 0x67, 0x45, 0x76, 0x52, 0x4b, 0x4f, + 0x6a, 0x55, 0x63, 0x43, 0x70, 0x46, 0x36, 0x51, 0x53, 0x2b, 0x53, 0x5a, 0x70, 0x77, 0x38, 0x70, 0x36, 0x70, + 0x4d, 0x36, 0x39, 0x78, 0x7a, 0x4f, 0x6b, 0x63, 0x38, 0x38, 0x66, 0x52, 0x50, 0x52, 0x2b, 0x74, 0x4c, 0x63, 0x0a, + 0x42, 0x5a, 0x53, 0x2f, 0x57, 0x6b, 0x71, 0x44, 0x6e, 0x46, 0x5a, 0x6a, 0x66, 0x56, 0x79, 0x6a, 0x36, 0x4b, + 0x76, 0x48, 0x47, 0x4e, 0x41, 0x2b, 0x48, 0x73, 0x4f, 0x73, 0x59, 0x56, 0x63, 0x4d, 0x72, 0x61, 0x39, 0x71, + 0x2b, 0x49, 0x38, 0x6e, 0x64, 0x34, 0x30, 0x4e, 0x30, 0x68, 0x5a, 0x69, 0x41, 0x64, 0x42, 0x47, 0x36, 0x33, + 0x65, 0x41, 0x78, 0x4e, 0x74, 0x78, 0x48, 0x65, 0x61, 0x35, 0x70, 0x34, 0x38, 0x68, 0x54, 0x6e, 0x47, 0x71, 0x0a, + 0x37, 0x37, 0x45, 0x2b, 0x39, 0x4a, 0x31, 0x61, 0x42, 0x33, 0x52, 0x49, 0x44, 0x42, 0x31, 0x48, 0x65, 0x64, + 0x4c, 0x46, 0x7a, 0x73, 0x77, 0x69, 0x74, 0x57, 0x35, 0x64, 0x37, 0x68, 0x4a, 0x4f, 0x34, 0x41, 0x33, 0x55, + 0x32, 0x42, 0x59, 0x31, 0x77, 0x67, 0x46, 0x55, 0x75, 0x79, 0x33, 0x6b, 0x54, 0x61, 0x43, 0x4b, 0x64, 0x70, + 0x74, 0x78, 0x74, 0x2f, 0x56, 0x38, 0x67, 0x38, 0x63, 0x4a, 0x74, 0x51, 0x44, 0x4d, 0x79, 0x4f, 0x53, 0x46, 0x0a, + 0x6c, 0x30, 0x32, 0x48, 0x72, 0x4d, 0x4d, 0x36, 0x4a, 0x68, 0x4b, 0x63, 0x50, 0x30, 0x4b, 0x31, 0x4c, 0x58, + 0x52, 0x51, 0x6a, 0x2b, 0x42, 0x51, 0x68, 0x7a, 0x58, 0x44, 0x6c, 0x79, 0x36, 0x72, 0x48, 0x32, 0x4f, 0x42, + 0x66, 0x67, 0x4a, 0x66, 0x41, 0x2f, 0x6d, 0x7a, 0x61, 0x31, 0x2f, 0x6c, 0x54, 0x7a, 0x45, 0x56, 0x4f, 0x32, + 0x4b, 0x50, 0x4d, 0x78, 0x44, 0x61, 0x6a, 0x34, 0x44, 0x74, 0x56, 0x73, 0x78, 0x62, 0x6f, 0x57, 0x6c, 0x54, 0x0a, + 0x32, 0x6c, 0x6b, 0x6a, 0x6a, 0x39, 0x58, 0x55, 0x4f, 0x4e, 0x61, 0x62, 0x68, 0x6f, 0x38, 0x4d, 0x78, 0x56, + 0x35, 0x59, 0x76, 0x33, 0x38, 0x54, 0x75, 0x63, 0x75, 0x58, 0x59, 0x75, 0x70, 0x54, 0x2b, 0x72, 0x57, 0x51, + 0x6e, 0x30, 0x4e, 0x59, 0x72, 0x65, 0x6e, 0x6f, 0x6d, 0x6e, 0x47, 0x4c, 0x4e, 0x63, 0x66, 0x47, 0x59, 0x54, + 0x76, 0x4d, 0x51, 0x4b, 0x67, 0x46, 0x77, 0x4a, 0x48, 0x7a, 0x53, 0x35, 0x50, 0x33, 0x43, 0x2f, 0x54, 0x4d, 0x0a, + 0x32, 0x49, 0x5a, 0x57, 0x64, 0x53, 0x6e, 0x73, 0x78, 0x56, 0x42, 0x4d, 0x46, 0x59, 0x45, 0x55, 0x76, 0x68, + 0x52, 0x54, 0x4a, 0x6e, 0x59, 0x56, 0x45, 0x6c, 0x31, 0x2b, 0x39, 0x31, 0x4b, 0x6e, 0x5a, 0x70, 0x37, 0x38, + 0x36, 0x47, 0x33, 0x6c, 0x32, 0x74, 0x69, 0x74, 0x71, 0x72, 0x77, 0x4f, 0x55, 0x58, 0x53, 0x73, 0x33, 0x36, + 0x69, 0x50, 0x6b, 0x49, 0x46, 0x51, 0x76, 0x77, 0x49, 0x6f, 0x6c, 0x51, 0x6e, 0x38, 0x42, 0x6c, 0x50, 0x59, 0x0a, + 0x6f, 0x6b, 0x59, 0x34, 0x67, 0x47, 0x72, 0x48, 0x67, 0x75, 0x4c, 0x71, 0x73, 0x6d, 0x59, 0x6d, 0x67, 0x47, + 0x4c, 0x71, 0x38, 0x6c, 0x77, 0x62, 0x2b, 0x7a, 0x49, 0x31, 0x70, 0x31, 0x4f, 0x46, 0x53, 0x36, 0x32, 0x46, + 0x2f, 0x49, 0x78, 0x31, 0x45, 0x62, 0x58, 0x32, 0x63, 0x36, 0x68, 0x57, 0x72, 0x4f, 0x45, 0x43, 0x33, 0x73, + 0x49, 0x53, 0x52, 0x76, 0x77, 0x68, 0x47, 0x51, 0x69, 0x35, 0x41, 0x47, 0x69, 0x4c, 0x63, 0x71, 0x6a, 0x4c, 0x0a, + 0x36, 0x4b, 0x4e, 0x43, 0x4f, 0x59, 0x48, 0x4f, 0x4e, 0x77, 0x34, 0x73, 0x4a, 0x2f, 0x6a, 0x72, 0x4b, 0x67, + 0x49, 0x4b, 0x6f, 0x38, 0x73, 0x30, 0x68, 0x31, 0x2b, 0x68, 0x31, 0x69, 0x4b, 0x39, 0x52, 0x59, 0x6f, 0x67, + 0x48, 0x73, 0x4e, 0x4a, 0x49, 0x39, 0x4d, 0x38, 0x67, 0x77, 0x72, 0x4a, 0x37, 0x4a, 0x6b, 0x31, 0x47, 0x6d, + 0x49, 0x47, 0x54, 0x41, 0x5a, 0x43, 0x4c, 0x77, 0x42, 0x4b, 0x78, 0x77, 0x7a, 0x71, 0x55, 0x39, 0x53, 0x48, 0x0a, + 0x4c, 0x70, 0x32, 0x4b, 0x51, 0x4f, 0x6b, 0x62, 0x42, 0x35, 0x59, 0x54, 0x2f, 0x4e, 0x31, 0x41, 0x58, 0x65, + 0x53, 0x68, 0x6f, 0x48, 0x57, 0x66, 0x77, 0x63, 0x56, 0x51, 0x44, 0x71, 0x4f, 0x66, 0x74, 0x35, 0x32, 0x42, + 0x55, 0x48, 0x38, 0x44, 0x38, 0x48, 0x64, 0x31, 0x68, 0x6a, 0x4c, 0x33, 0x44, 0x63, 0x69, 0x36, 0x6e, 0x50, + 0x71, 0x45, 0x31, 0x67, 0x57, 0x56, 0x2f, 0x46, 0x4a, 0x6b, 0x54, 0x4d, 0x78, 0x68, 0x6c, 0x34, 0x38, 0x61, 0x0a, + 0x75, 0x34, 0x71, 0x4d, 0x4c, 0x71, 0x7a, 0x6b, 0x31, 0x32, 0x4b, 0x4f, 0x67, 0x77, 0x4f, 0x34, 0x65, 0x4b, + 0x32, 0x6a, 0x4f, 0x44, 0x2b, 0x63, 0x44, 0x4d, 0x51, 0x33, 0x67, 0x50, 0x2f, 0x32, 0x57, 0x70, 0x65, 0x39, + 0x2b, 0x45, 0x2f, 0x39, 0x54, 0x5a, 0x71, 0x6a, 0x36, 0x5a, 0x56, 0x38, 0x6e, 0x63, 0x75, 0x56, 0x4d, 0x57, + 0x34, 0x43, 0x39, 0x5a, 0x6f, 0x75, 0x57, 0x61, 0x6a, 0x67, 0x34, 0x55, 0x2b, 0x70, 0x2b, 0x35, 0x38, 0x45, 0x0a, + 0x38, 0x78, 0x53, 0x65, 0x77, 0x68, 0x53, 0x75, 0x69, 0x35, 0x71, 0x42, 0x43, 0x33, 0x67, 0x4a, 0x48, 0x59, + 0x79, 0x49, 0x47, 0x64, 0x67, 0x6f, 0x41, 0x37, 0x45, 0x41, 0x2f, 0x4a, 0x34, 0x75, 0x58, 0x63, 0x4b, 0x72, + 0x33, 0x30, 0x33, 0x50, 0x74, 0x42, 0x4b, 0x4c, 0x4c, 0x74, 0x34, 0x2f, 0x58, 0x73, 0x39, 0x48, 0x35, 0x41, + 0x54, 0x6d, 0x6e, 0x73, 0x32, 0x4b, 0x4b, 0x67, 0x43, 0x56, 0x4e, 0x58, 0x62, 0x6f, 0x47, 0x62, 0x59, 0x4a, 0x0a, + 0x2f, 0x41, 0x54, 0x54, 0x68, 0x6a, 0x51, 0x2f, 0x34, 0x66, 0x68, 0x58, 0x6c, 0x4a, 0x38, 0x48, 0x75, 0x49, + 0x41, 0x52, 0x4d, 0x51, 0x4d, 0x76, 0x7a, 0x6b, 0x41, 0x73, 0x41, 0x4d, 0x39, 0x54, 0x70, 0x77, 0x75, 0x6f, + 0x74, 0x77, 0x47, 0x31, 0x51, 0x36, 0x48, 0x47, 0x30, 0x51, 0x46, 0x55, 0x47, 0x78, 0x45, 0x7a, 0x73, 0x44, + 0x63, 0x5a, 0x69, 0x4c, 0x38, 0x42, 0x50, 0x4e, 0x2b, 0x4b, 0x43, 0x70, 0x4d, 0x2b, 0x72, 0x63, 0x2b, 0x67, 0x0a, + 0x67, 0x36, 0x2f, 0x46, 0x48, 0x41, 0x64, 0x48, 0x4d, 0x46, 0x37, 0x2b, 0x31, 0x32, 0x59, 0x79, 0x7a, 0x68, + 0x38, 0x38, 0x41, 0x2f, 0x45, 0x4e, 0x59, 0x48, 0x56, 0x4b, 0x4d, 0x34, 0x62, 0x6f, 0x75, 0x33, 0x6b, 0x4f, + 0x4a, 0x61, 0x2b, 0x43, 0x43, 0x6b, 0x67, 0x4a, 0x39, 0x59, 0x71, 0x75, 0x4e, 0x6c, 0x35, 0x38, 0x6b, 0x68, + 0x43, 0x78, 0x6e, 0x78, 0x6d, 0x49, 0x42, 0x57, 0x44, 0x7a, 0x66, 0x56, 0x45, 0x52, 0x53, 0x44, 0x71, 0x6d, 0x0a, + 0x36, 0x61, 0x4a, 0x58, 0x48, 0x66, 0x5a, 0x6f, 0x69, 0x68, 0x6e, 0x59, 0x32, 0x77, 0x7a, 0x45, 0x41, 0x72, + 0x43, 0x33, 0x57, 0x78, 0x4d, 0x58, 0x46, 0x6a, 0x4d, 0x77, 0x66, 0x67, 0x62, 0x69, 0x62, 0x77, 0x44, 0x6a, + 0x35, 0x7a, 0x68, 0x47, 0x69, 0x42, 0x6e, 0x59, 0x32, 0x77, 0x7a, 0x45, 0x41, 0x72, 0x43, 0x33, 0x57, 0x78, + 0x4d, 0x58, 0x46, 0x6a, 0x4d, 0x77, 0x66, 0x67, 0x5a, 0x69, 0x41, 0x52, 0x67, 0x2f, 0x78, 0x7a, 0x46, 0x43, 0x0a, + 0x7a, 0x4d, 0x44, 0x65, 0x5a, 0x69, 0x41, 0x57, 0x67, 0x4c, 0x33, 0x64, 0x6d, 0x72, 0x69, 0x77, 0x6d, 0x49, + 0x48, 0x78, 0x4d, 0x78, 0x41, 0x4c, 0x77, 0x50, 0x67, 0x35, 0x6a, 0x68, 0x46, 0x69, 0x42, 0x76, 0x59, 0x32, + 0x41, 0x37, 0x45, 0x41, 0x37, 0x4f, 0x33, 0x57, 0x78, 0x49, 0x58, 0x46, 0x44, 0x49, 0x79, 0x66, 0x67, 0x56, + 0x67, 0x41, 0x78, 0x73, 0x39, 0x78, 0x6a, 0x42, 0x41, 0x7a, 0x73, 0x4c, 0x63, 0x5a, 0x2b, 0x44, 0x2f, 0x67, 0x0a, + 0x6b, 0x56, 0x6d, 0x37, 0x6b, 0x69, 0x4a, 0x4a, 0x36, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, + 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, + 0x34, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 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, 0x64, 0x35, 0x6b, 0x6c, 0x45, 0x51, 0x56, + 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x64, 0x66, 0x5a, 0x42, 0x63, 0x31, 0x58, 0x6e, 0x6d, 0x66, 0x37, 0x64, 0x37, 0x0a, + 0x50, 0x71, 0x55, 0x5a, 0x7a, 0x57, 0x6a, 0x30, 0x4d, 0x66, 0x70, 0x41, 0x51, 0x69, 0x4e, 0x45, 0x4a, 0x41, + 0x47, 0x79, 0x51, 0x4d, 0x45, 0x73, 0x77, 0x6f, 0x41, 0x4d, 0x43, 0x56, 0x35, 0x69, 0x78, 0x53, 0x6e, 0x6a, + 0x73, 0x47, 0x56, 0x58, 0x4a, 0x62, 0x76, 0x72, 0x4c, 0x55, 0x78, 0x43, 0x63, 0x4a, 0x6d, 0x74, 0x70, 0x4c, + 0x4c, 0x6c, 0x53, 0x72, 0x41, 0x68, 0x41, 0x64, 0x74, 0x4a, 0x4f, 0x61, 0x6d, 0x34, 0x6a, 0x41, 0x74, 0x77, 0x0a, + 0x58, 0x48, 0x61, 0x74, 0x64, 0x31, 0x31, 0x4f, 0x78, 0x52, 0x56, 0x32, 0x6c, 0x58, 0x56, 0x46, 0x57, 0x44, + 0x5a, 0x6c, 0x73, 0x41, 0x4f, 0x78, 0x4d, 0x49, 0x73, 0x52, 0x57, 0x42, 0x69, 0x51, 0x73, 0x4e, 0x43, 0x33, + 0x72, 0x4e, 0x46, 0x49, 0x6f, 0x35, 0x6e, 0x52, 0x6a, 0x4f, 0x61, 0x7a, 0x37, 0x38, 0x30, 0x66, 0x70, 0x78, + 0x76, 0x64, 0x61, 0x63, 0x31, 0x6f, 0x7a, 0x72, 0x6c, 0x39, 0x75, 0x2f, 0x74, 0x32, 0x33, 0x2b, 0x64, 0x58, 0x0a, + 0x64, 0x59, 0x76, 0x70, 0x34, 0x66, 0x53, 0x64, 0x6f, 0x2b, 0x37, 0x7a, 0x50, 0x50, 0x63, 0x39, 0x35, 0x37, + 0x7a, 0x6e, 0x48, 0x43, 0x38, 0x49, 0x41, 0x6f, 0x51, 0x51, 0x36, 0x53, 0x52, 0x54, 0x37, 0x51, 0x6f, 0x49, + 0x49, 0x61, 0x71, 0x48, 0x44, 0x45, 0x43, 0x49, 0x46, 0x43, 0x4d, 0x44, 0x45, 0x43, 0x4c, 0x46, 0x79, 0x41, + 0x43, 0x45, 0x53, 0x44, 0x45, 0x79, 0x41, 0x43, 0x46, 0x53, 0x6a, 0x41, 0x78, 0x41, 0x69, 0x42, 0x51, 0x6a, 0x0a, + 0x41, 0x78, 0x41, 0x69, 0x78, 0x63, 0x67, 0x41, 0x68, 0x45, 0x67, 0x78, 0x44, 0x61, 0x58, 0x65, 0x34, 0x49, + 0x6c, 0x58, 0x78, 0x75, 0x4f, 0x6f, 0x68, 0x78, 0x41, 0x69, 0x41, 0x76, 0x64, 0x76, 0x61, 0x53, 0x37, 0x70, + 0x2f, 0x59, 0x6f, 0x41, 0x68, 0x45, 0x67, 0x78, 0x4a, 0x55, 0x63, 0x41, 0x6f, 0x71, 0x62, 0x78, 0x5a, 0x76, + 0x6d, 0x39, 0x38, 0x73, 0x4e, 0x54, 0x67, 0x67, 0x79, 0x67, 0x2f, 0x70, 0x67, 0x48, 0x58, 0x41, 0x56, 0x73, 0x0a, + 0x41, 0x6a, 0x72, 0x79, 0x50, 0x77, 0x4f, 0x73, 0x42, 0x70, 0x61, 0x45, 0x79, 0x71, 0x30, 0x48, 0x35, 0x73, + 0x39, 0x79, 0x6a, 0x78, 0x46, 0x67, 0x58, 0x2b, 0x68, 0x31, 0x48, 0x33, 0x41, 0x6b, 0x2f, 0x2f, 0x4d, 0x62, + 0x77, 0x43, 0x43, 0x77, 0x4e, 0x2f, 0x2f, 0x7a, 0x2b, 0x56, 0x68, 0x71, 0x4c, 0x61, 0x71, 0x43, 0x44, 0x4b, + 0x41, 0x32, 0x38, 0x59, 0x42, 0x31, 0x6f, 0x57, 0x73, 0x54, 0x52, 0x75, 0x67, 0x39, 0x77, 0x49, 0x6f, 0x59, 0x0a, + 0x37, 0x6a, 0x38, 0x66, 0x32, 0x47, 0x4a, 0x5a, 0x39, 0x67, 0x52, 0x77, 0x45, 0x47, 0x4d, 0x47, 0x65, 0x34, + 0x46, 0x66, 0x68, 0x69, 0x35, 0x46, 0x45, 0x67, 0x6c, 0x48, 0x42, 0x6c, 0x41, 0x62, 0x58, 0x41, 0x6c, 0x73, + 0x42, 0x57, 0x34, 0x47, 0x62, 0x67, 0x41, 0x32, 0x56, 0x37, 0x63, 0x36, 0x30, 0x31, 0x69, 0x52, 0x76, 0x39, + 0x34, 0x33, 0x77, 0x2f, 0x39, 0x37, 0x44, 0x58, 0x67, 0x4a, 0x65, 0x41, 0x48, 0x59, 0x44, 0x62, 0x78, 0x64, 0x0a, + 0x77, 0x58, 0x6f, 0x4a, 0x43, 0x32, 0x51, 0x41, 0x79, 0x65, 0x51, 0x47, 0x34, 0x42, 0x61, 0x4d, 0x34, 0x47, + 0x38, 0x47, 0x46, 0x6c, 0x65, 0x33, 0x4f, 0x70, 0x48, 0x5a, 0x6e, 0x4c, 0x2f, 0x75, 0x7a, 0x62, 0x38, 0x2b, + 0x6a, 0x54, 0x47, 0x43, 0x46, 0x34, 0x44, 0x6e, 0x38, 0x7a, 0x2b, 0x4c, 0x4b, 0x69, 0x49, 0x44, 0x53, 0x41, + 0x61, 0x62, 0x67, 0x4f, 0x33, 0x41, 0x48, 0x52, 0x6a, 0x42, 0x4e, 0x31, 0x57, 0x33, 0x4f, 0x6d, 0x56, 0x6a, 0x0a, + 0x4d, 0x66, 0x43, 0x68, 0x2f, 0x41, 0x57, 0x51, 0x77, 0x35, 0x6a, 0x42, 0x4c, 0x6d, 0x41, 0x6e, 0x70, 0x67, + 0x73, 0x68, 0x4b, 0x6f, 0x67, 0x4d, 0x6f, 0x44, 0x70, 0x30, 0x59, 0x63, 0x52, 0x2b, 0x4f, 0x33, 0x41, 0x58, + 0x30, 0x77, 0x66, 0x6e, 0x30, 0x6b, 0x51, 0x57, 0x32, 0x4a, 0x61, 0x2f, 0x2f, 0x67, 0x6f, 0x7a, 0x32, 0x4c, + 0x67, 0x44, 0x65, 0x42, 0x5a, 0x34, 0x42, 0x75, 0x69, 0x76, 0x58, 0x74, 0x58, 0x53, 0x67, 0x51, 0x79, 0x67, 0x0a, + 0x73, 0x6e, 0x77, 0x55, 0x75, 0x44, 0x74, 0x2f, 0x69, 0x59, 0x74, 0x5a, 0x41, 0x76, 0x78, 0x42, 0x2f, 0x67, + 0x4a, 0x34, 0x4b, 0x6e, 0x2f, 0x4a, 0x44, 0x4d, 0x71, 0x45, 0x44, 0x4b, 0x44, 0x38, 0x33, 0x41, 0x6e, 0x63, + 0x67, 0x33, 0x6e, 0x53, 0x5a, 0x36, 0x74, 0x63, 0x6c, 0x31, 0x6f, 0x6a, 0x62, 0x4a, 0x5a, 0x50, 0x41, 0x64, + 0x2f, 0x41, 0x64, 0x42, 0x64, 0x45, 0x54, 0x4d, 0x67, 0x41, 0x79, 0x6b, 0x4d, 0x50, 0x38, 0x48, 0x47, 0x4d, 0x0a, + 0x38, 0x46, 0x64, 0x57, 0x74, 0x79, 0x70, 0x31, 0x51, 0x38, 0x45, 0x4d, 0x6a, 0x6d, 0x4f, 0x4d, 0x34, 0x4a, + 0x75, 0x59, 0x36, 0x55, 0x64, 0x52, 0x41, 0x6c, 0x55, 0x33, 0x67, 0x47, 0x2b, 0x38, 0x31, 0x56, 0x6a, 0x74, + 0x4b, 0x70, 0x54, 0x45, 0x50, 0x52, 0x73, 0x6d, 0x77, 0x79, 0x38, 0x2f, 0x43, 0x4e, 0x79, 0x50, 0x47, 0x64, + 0x41, 0x54, 0x35, 0x57, 0x45, 0x6c, 0x38, 0x46, 0x44, 0x2b, 0x32, 0x67, 0x6b, 0x38, 0x41, 0x54, 0x78, 0x64, 0x0a, + 0x2b, 0x4a, 0x2b, 0x31, 0x31, 0x70, 0x36, 0x4b, 0x32, 0x6b, 0x2f, 0x46, 0x71, 0x62, 0x6f, 0x42, 0x31, 0x43, + 0x49, 0x7a, 0x66, 0x47, 0x6e, 0x33, 0x59, 0x59, 0x53, 0x2f, 0x71, 0x66, 0x4b, 0x31, 0x6d, 0x55, 0x34, 0x75, + 0x67, 0x4c, 0x50, 0x6a, 0x48, 0x6d, 0x66, 0x48, 0x50, 0x53, 0x5a, 0x38, 0x47, 0x42, 0x67, 0x33, 0x32, 0x62, + 0x37, 0x44, 0x6b, 0x78, 0x35, 0x6a, 0x75, 0x51, 0x76, 0x6c, 0x42, 0x69, 0x63, 0x38, 0x4a, 0x76, 0x32, 0x5a, 0x0a, + 0x37, 0x39, 0x47, 0x59, 0x67, 0x59, 0x36, 0x6d, 0x43, 0x7a, 0x6b, 0x38, 0x4c, 0x56, 0x6c, 0x6f, 0x61, 0x7a, + 0x53, 0x76, 0x4f, 0x35, 0x73, 0x44, 0x6d, 0x6a, 0x4b, 0x77, 0x73, 0x44, 0x6c, 0x67, 0x59, 0x58, 0x4e, 0x41, + 0x64, 0x72, 0x5a, 0x6b, 0x34, 0x73, 0x71, 0x77, 0x50, 0x58, 0x2f, 0x74, 0x78, 0x52, 0x6a, 0x42, 0x56, 0x38, + 0x50, 0x66, 0x54, 0x61, 0x32, 0x5a, 0x51, 0x54, 0x57, 0x51, 0x41, 0x54, 0x68, 0x51, 0x4a, 0x50, 0x77, 0x75, 0x0a, + 0x34, 0x4a, 0x4d, 0x59, 0x34, 0x53, 0x2b, 0x72, 0x64, 0x46, 0x32, 0x47, 0x4a, 0x6a, 0x79, 0x47, 0x4a, 0x73, + 0x31, 0x2f, 0x43, 0x34, 0x49, 0x2f, 0x4e, 0x77, 0x6e, 0x6e, 0x70, 0x30, 0x70, 0x58, 0x35, 0x4b, 0x51, 0x50, + 0x70, 0x38, 0x65, 0x4b, 0x37, 0x7a, 0x50, 0x7a, 0x66, 0x65, 0x63, 0x31, 0x42, 0x4c, 0x51, 0x33, 0x58, 0x6a, + 0x43, 0x45, 0x42, 0x55, 0x30, 0x42, 0x43, 0x78, 0x70, 0x68, 0x51, 0x56, 0x4e, 0x46, 0x6b, 0x77, 0x41, 0x33, 0x0a, + 0x41, 0x55, 0x38, 0x43, 0x44, 0x32, 0x4f, 0x4d, 0x34, 0x48, 0x47, 0x67, 0x76, 0x2f, 0x42, 0x39, 0x79, 0x51, + 0x68, 0x6d, 0x52, 0x77, 0x5a, 0x67, 0x53, 0x55, 0x6a, 0x38, 0x6a, 0x63, 0x43, 0x44, 0x6d, 0x4d, 0x5a, 0x57, + 0x45, 0x59, 0x59, 0x6d, 0x50, 0x45, 0x36, 0x4e, 0x65, 0x76, 0x53, 0x4f, 0x65, 0x76, 0x53, 0x4e, 0x65, 0x5a, + 0x79, 0x35, 0x53, 0x4a, 0x7a, 0x56, 0x34, 0x2f, 0x79, 0x55, 0x78, 0x2f, 0x6b, 0x70, 0x36, 0x42, 0x32, 0x39, 0x0a, + 0x75, 0x45, 0x36, 0x4c, 0x57, 0x67, 0x4b, 0x57, 0x74, 0x41, 0x52, 0x30, 0x74, 0x77, 0x59, 0x73, 0x62, 0x51, + 0x30, 0x71, 0x59, 0x51, 0x72, 0x4c, 0x67, 0x45, 0x66, 0x79, 0x31, 0x31, 0x38, 0x43, 0x6e, 0x77, 0x63, 0x6d, + 0x37, 0x39, 0x6b, 0x77, 0x4b, 0x52, 0x4f, 0x59, 0x42, 0x52, 0x6e, 0x41, 0x48, 0x42, 0x51, 0x39, 0x39, 0x66, + 0x38, 0x63, 0x38, 0x38, 0x51, 0x76, 0x36, 0x38, 0x44, 0x65, 0x38, 0x4b, 0x54, 0x48, 0x30, 0x52, 0x47, 0x50, 0x0a, + 0x34, 0x79, 0x4d, 0x65, 0x76, 0x65, 0x63, 0x7a, 0x30, 0x30, 0x4c, 0x33, 0x57, 0x75, 0x4a, 0x4d, 0x33, 0x71, + 0x7a, 0x65, 0x47, 0x6a, 0x43, 0x76, 0x57, 0x37, 0x4b, 0x77, 0x74, 0x4e, 0x58, 0x6e, 0x73, 0x72, 0x61, 0x41, + 0x56, 0x66, 0x4f, 0x44, 0x64, 0x37, 0x73, 0x56, 0x5a, 0x65, 0x4a, 0x68, 0x34, 0x42, 0x4f, 0x59, 0x69, 0x4f, + 0x41, 0x4c, 0x69, 0x67, 0x5a, 0x6d, 0x52, 0x67, 0x59, 0x77, 0x43, 0x30, 0x58, 0x43, 0x66, 0x77, 0x41, 0x6a, 0x0a, + 0x2f, 0x50, 0x58, 0x6c, 0x2b, 0x46, 0x73, 0x42, 0x63, 0x48, 0x7a, 0x45, 0x34, 0x38, 0x52, 0x49, 0x68, 0x73, + 0x50, 0x44, 0x48, 0x6b, 0x4d, 0x54, 0x79, 0x58, 0x6e, 0x43, 0x78, 0x38, 0x6c, 0x59, 0x44, 0x6f, 0x34, 0x4d, + 0x5a, 0x7a, 0x67, 0x79, 0x62, 0x46, 0x34, 0x76, 0x61, 0x41, 0x71, 0x34, 0x76, 0x43, 0x31, 0x67, 0x78, 0x58, + 0x79, 0x66, 0x6c, 0x66, 0x4f, 0x44, 0x57, 0x64, 0x63, 0x6d, 0x6c, 0x38, 0x42, 0x4b, 0x54, 0x42, 0x54, 0x77, 0x0a, + 0x58, 0x7a, 0x42, 0x47, 0x38, 0x4a, 0x69, 0x4d, 0x59, 0x44, 0x6f, 0x79, 0x67, 0x43, 0x49, 0x71, 0x4f, 0x61, + 0x70, 0x2f, 0x62, 0x4d, 0x54, 0x6a, 0x34, 0x4c, 0x6b, 0x4d, 0x68, 0x38, 0x39, 0x6c, 0x47, 0x4b, 0x2f, 0x52, + 0x70, 0x33, 0x77, 0x70, 0x44, 0x45, 0x31, 0x34, 0x37, 0x4f, 0x33, 0x33, 0x32, 0x4e, 0x75, 0x66, 0x6f, 0x54, + 0x6b, 0x4c, 0x6c, 0x37, 0x66, 0x37, 0x39, 0x4c, 0x53, 0x58, 0x78, 0x51, 0x7a, 0x57, 0x41, 0x31, 0x38, 0x47, 0x0a, + 0x50, 0x6b, 0x42, 0x2b, 0x31, 0x6b, 0x42, 0x47, 0x59, 0x4a, 0x41, 0x42, 0x68, 0x41, 0x69, 0x4a, 0x66, 0x77, + 0x32, 0x6d, 0x6e, 0x2f, 0x2b, 0x4a, 0x75, 0x50, 0x2f, 0x47, 0x71, 0x56, 0x47, 0x50, 0x66, 0x59, 0x50, 0x70, + 0x46, 0x66, 0x31, 0x73, 0x6a, 0x4f, 0x64, 0x67, 0x2f, 0x30, 0x43, 0x47, 0x2f, 0x51, 0x4d, 0x58, 0x7a, 0x47, + 0x42, 0x39, 0x68, 0x38, 0x2f, 0x53, 0x31, 0x6c, 0x69, 0x37, 0x43, 0x59, 0x56, 0x5a, 0x67, 0x36, 0x39, 0x6a, 0x0a, + 0x49, 0x6f, 0x4e, 0x44, 0x61, 0x52, 0x38, 0x66, 0x6b, 0x41, 0x46, 0x77, 0x30, 0x56, 0x50, 0x2f, 0x73, 0x35, + 0x68, 0x42, 0x70, 0x4e, 0x67, 0x59, 0x7a, 0x38, 0x48, 0x62, 0x67, 0x78, 0x6e, 0x32, 0x44, 0x57, 0x62, 0x65, + 0x6e, 0x5a, 0x59, 0x54, 0x73, 0x78, 0x4d, 0x32, 0x67, 0x38, 0x37, 0x6d, 0x67, 0x50, 0x55, 0x64, 0x50, 0x6c, + 0x64, 0x32, 0x2b, 0x44, 0x54, 0x48, 0x6c, 0x30, 0x66, 0x35, 0x69, 0x66, 0x7a, 0x31, 0x45, 0x50, 0x42, 0x6f, 0x0a, + 0x6d, 0x71, 0x4f, 0x42, 0x31, 0x4f, 0x38, 0x4a, 0x47, 0x42, 0x4c, 0x2f, 0x65, 0x34, 0x48, 0x76, 0x45, 0x61, + 0x50, 0x34, 0x2b, 0x38, 0x59, 0x38, 0x66, 0x6e, 0x51, 0x69, 0x79, 0x7a, 0x2f, 0x38, 0x73, 0x70, 0x47, 0x66, + 0x6e, 0x73, 0x70, 0x4b, 0x2f, 0x42, 0x45, 0x59, 0x47, 0x50, 0x66, 0x34, 0x36, 0x53, 0x6e, 0x7a, 0x47, 0x66, + 0x37, 0x6f, 0x52, 0x4a, 0x61, 0x2b, 0x65, 0x47, 0x64, 0x41, 0x48, 0x73, 0x46, 0x38, 0x35, 0x2b, 0x2b, 0x46, 0x0a, + 0x36, 0x69, 0x66, 0x6c, 0x56, 0x49, 0x50, 0x55, 0x52, 0x67, 0x42, 0x46, 0x58, 0x2f, 0x61, 0x6a, 0x77, 0x47, + 0x66, 0x69, 0x75, 0x76, 0x65, 0x52, 0x34, 0x51, 0x77, 0x2f, 0x50, 0x35, 0x4f, 0x5a, 0x63, 0x57, 0x70, 0x4d, + 0x52, 0x4d, 0x4d, 0x50, 0x34, 0x4d, 0x42, 0x51, 0x68, 0x67, 0x4e, 0x44, 0x47, 0x62, 0x70, 0x62, 0x41, 0x39, + 0x36, 0x7a, 0x79, 0x47, 0x64, 0x31, 0x32, 0x79, 0x79, 0x5a, 0x54, 0x47, 0x37, 0x63, 0x6d, 0x62, 0x38, 0x2b, 0x0a, + 0x42, 0x33, 0x77, 0x32, 0x62, 0x64, 0x46, 0x41, 0x4b, 0x69, 0x4f, 0x41, 0x6b, 0x50, 0x6a, 0x58, 0x59, 0x35, + 0x61, 0x65, 0x6c, 0x69, 0x7a, 0x2b, 0x41, 0x42, 0x4f, 0x32, 0x50, 0x76, 0x56, 0x4f, 0x41, 0x38, 0x38, 0x63, + 0x79, 0x30, 0x72, 0x38, 0x5a, 0x61, 0x52, 0x33, 0x31, 0x4f, 0x4f, 0x5a, 0x59, 0x31, 0x6d, 0x65, 0x65, 0x71, + 0x65, 0x42, 0x2f, 0x51, 0x4f, 0x5a, 0x75, 0x50, 0x59, 0x64, 0x2b, 0x77, 0x79, 0x6d, 0x4c, 0x61, 0x79, 0x48, 0x0a, + 0x39, 0x45, 0x51, 0x44, 0x71, 0x54, 0x4f, 0x41, 0x30, 0x42, 0x66, 0x37, 0x2b, 0x35, 0x67, 0x74, 0x71, 0x32, + 0x34, 0x72, 0x39, 0x5a, 0x35, 0x76, 0x44, 0x78, 0x72, 0x68, 0x50, 0x33, 0x38, 0x79, 0x79, 0x32, 0x43, 0x64, + 0x54, 0x75, 0x45, 0x6c, 0x6b, 0x63, 0x45, 0x4a, 0x6a, 0x2b, 0x64, 0x50, 0x47, 0x69, 0x4e, 0x34, 0x65, 0x7a, + 0x43, 0x57, 0x70, 0x6e, 0x77, 0x62, 0x70, 0x6b, 0x33, 0x38, 0x50, 0x71, 0x54, 0x44, 0x42, 0x46, 0x4c, 0x54, 0x0a, + 0x42, 0x53, 0x6a, 0x36, 0x4d, 0x70, 0x2f, 0x45, 0x35, 0x4f, 0x2b, 0x58, 0x78, 0x44, 0x74, 0x44, 0x47, 0x66, + 0x61, 0x63, 0x30, 0x63, 0x42, 0x65, 0x74, 0x52, 0x6d, 0x61, 0x38, 0x50, 0x6a, 0x58, 0x58, 0x32, 0x58, 0x35, + 0x65, 0x58, 0x2b, 0x47, 0x36, 0x78, 0x62, 0x35, 0x72, 0x46, 0x31, 0x51, 0x55, 0x74, 0x65, 0x67, 0x47, 0x66, + 0x67, 0x57, 0x5a, 0x6f, 0x2f, 0x44, 0x50, 0x36, 0x72, 0x33, 0x4c, 0x6b, 0x45, 0x71, 0x49, 0x6f, 0x43, 0x51, 0x0a, + 0x2b, 0x44, 0x64, 0x6a, 0x48, 0x4c, 0x34, 0x6b, 0x38, 0x66, 0x65, 0x4e, 0x65, 0x58, 0x7a, 0x33, 0x55, 0x41, + 0x50, 0x50, 0x6e, 0x64, 0x44, 0x41, 0x58, 0x70, 0x49, 0x59, 0x47, 0x50, 0x64, 0x34, 0x37, 0x6b, 0x53, 0x57, + 0x37, 0x78, 0x35, 0x71, 0x69, 0x47, 0x4f, 0x77, 0x38, 0x44, 0x35, 0x4d, 0x57, 0x39, 0x6b, 0x4d, 0x39, 0x52, + 0x73, 0x4e, 0x31, 0x48, 0x55, 0x45, 0x55, 0x50, 0x53, 0x6c, 0x2f, 0x56, 0x66, 0x67, 0x66, 0x7a, 0x4c, 0x37, 0x0a, + 0x59, 0x52, 0x68, 0x7a, 0x4d, 0x6a, 0x7a, 0x70, 0x38, 0x58, 0x4b, 0x66, 0x47, 0x59, 0x67, 0x53, 0x79, 0x61, + 0x56, 0x67, 0x30, 0x46, 0x63, 0x73, 0x38, 0x4c, 0x6c, 0x2b, 0x69, 0x56, 0x39, 0x4b, 0x79, 0x76, 0x46, 0x37, + 0x67, 0x44, 0x33, 0x41, 0x66, 0x77, 0x50, 0x2b, 0x56, 0x7a, 0x31, 0x47, 0x41, 0x33, 0x58, 0x62, 0x6b, 0x6b, + 0x50, 0x69, 0x7a, 0x77, 0x4a, 0x66, 0x77, 0x32, 0x77, 0x67, 0x45, 0x55, 0x6e, 0x38, 0x66, 0x67, 0x43, 0x76, 0x0a, + 0x6e, 0x6a, 0x48, 0x39, 0x66, 0x49, 0x6d, 0x2f, 0x64, 0x6a, 0x67, 0x77, 0x5a, 0x4c, 0x36, 0x7a, 0x56, 0x38, + 0x39, 0x6b, 0x38, 0x4b, 0x4f, 0x50, 0x46, 0x48, 0x71, 0x59, 0x74, 0x76, 0x4d, 0x31, 0x38, 0x6a, 0x73, 0x36, + 0x31, 0x56, 0x4d, 0x30, 0x55, 0x4a, 0x65, 0x74, 0x4f, 0x66, 0x51, 0x46, 0x58, 0x59, 0x73, 0x4a, 0x34, 0x2b, + 0x36, 0x64, 0x76, 0x66, 0x53, 0x6c, 0x36, 0x52, 0x76, 0x7a, 0x32, 0x48, 0x47, 0x6f, 0x67, 0x5a, 0x2f, 0x31, 0x0a, + 0x5a, 0x63, 0x6e, 0x70, 0x6d, 0x49, 0x75, 0x61, 0x49, 0x78, 0x66, 0x41, 0x7a, 0x2f, 0x71, 0x79, 0x37, 0x43, + 0x69, 0x39, 0x57, 0x33, 0x41, 0x76, 0x70, 0x69, 0x31, 0x64, 0x43, 0x2f, 0x56, 0x6a, 0x41, 0x6e, 0x56, 0x6e, + 0x41, 0x4b, 0x45, 0x76, 0x35, 0x73, 0x4f, 0x59, 0x38, 0x4f, 0x33, 0x71, 0x4b, 0x50, 0x65, 0x5a, 0x39, 0x4f, + 0x48, 0x46, 0x58, 0x74, 0x4f, 0x66, 0x56, 0x44, 0x2b, 0x2f, 0x39, 0x68, 0x6b, 0x59, 0x4e, 0x39, 0x32, 0x43, 0x0a, + 0x46, 0x33, 0x75, 0x7a, 0x73, 0x32, 0x36, 0x45, 0x59, 0x73, 0x48, 0x56, 0x6d, 0x44, 0x62, 0x31, 0x59, 0x61, + 0x67, 0x50, 0x45, 0x36, 0x67, 0x72, 0x41, 0x77, 0x68, 0x39, 0x49, 0x51, 0x39, 0x67, 0x74, 0x70, 0x65, 0x4f, + 0x52, 0x4f, 0x2b, 0x6f, 0x78, 0x34, 0x36, 0x44, 0x44, 0x66, 0x7a, 0x69, 0x62, 0x46, 0x31, 0x39, 0x50, 0x41, + 0x4c, 0x34, 0x78, 0x64, 0x6b, 0x4d, 0x4f, 0x77, 0x34, 0x32, 0x6c, 0x4a, 0x71, 0x6e, 0x73, 0x51, 0x50, 0x54, 0x0a, + 0x78, 0x6d, 0x72, 0x65, 0x42, 0x4f, 0x70, 0x69, 0x45, 0x4c, 0x44, 0x6f, 0x53, 0x33, 0x67, 0x4d, 0x2b, 0x46, + 0x54, 0x55, 0x65, 0x37, 0x31, 0x32, 0x4a, 0x73, 0x50, 0x50, 0x2b, 0x72, 0x49, 0x36, 0x31, 0x4b, 0x36, 0x4f, + 0x4f, 0x54, 0x66, 0x70, 0x73, 0x66, 0x4e, 0x77, 0x41, 0x37, 0x2b, 0x2b, 0x4a, 0x4d, 0x66, 0x6d, 0x52, 0x5a, + 0x48, 0x44, 0x67, 0x53, 0x39, 0x6a, 0x7a, 0x6d, 0x56, 0x38, 0x6f, 0x4a, 0x59, 0x48, 0x42, 0x32, 0x76, 0x2b, 0x0a, + 0x45, 0x52, 0x63, 0x53, 0x2f, 0x79, 0x72, 0x67, 0x58, 0x34, 0x67, 0x6f, 0x2f, 0x72, 0x45, 0x63, 0x66, 0x50, + 0x39, 0x6f, 0x41, 0x79, 0x39, 0x4c, 0x2f, 0x4b, 0x6b, 0x67, 0x41, 0x46, 0x37, 0x75, 0x79, 0x2f, 0x4c, 0x39, + 0x6f, 0x77, 0x32, 0x6c, 0x62, 0x4c, 0x6a, 0x79, 0x4b, 0x55, 0x79, 0x62, 0x57, 0x77, 0x57, 0x31, 0x47, 0x51, + 0x33, 0x55, 0x74, 0x41, 0x45, 0x55, 0x4c, 0x64, 0x2f, 0x39, 0x4e, 0x68, 0x48, 0x58, 0x37, 0x52, 0x64, 0x43, 0x0a, + 0x2f, 0x6d, 0x4d, 0x6a, 0x36, 0x75, 0x75, 0x6e, 0x6a, 0x57, 0x4d, 0x6a, 0x58, 0x71, 0x6c, 0x64, 0x67, 0x75, + 0x33, 0x41, 0x50, 0x32, 0x4c, 0x61, 0x59, 0x4d, 0x32, 0x5a, 0x51, 0x4d, 0x30, 0x61, 0x51, 0x4f, 0x69, 0x44, + 0x76, 0x67, 0x4c, 0x34, 0x4a, 0x38, 0x78, 0x68, 0x6d, 0x73, 0x37, 0x73, 0x4f, 0x5a, 0x31, 0x68, 0x35, 0x2b, + 0x47, 0x47, 0x57, 0x44, 0x62, 0x54, 0x46, 0x4c, 0x58, 0x4a, 0x2b, 0x53, 0x6e, 0x54, 0x4a, 0x64, 0x68, 0x7a, 0x0a, + 0x4f, 0x72, 0x49, 0x63, 0x62, 0x73, 0x4b, 0x30, 0x77, 0x53, 0x75, 0x67, 0x74, 0x6b, 0x79, 0x67, 0x4a, 0x67, + 0x32, 0x67, 0x53, 0x50, 0x7a, 0x2f, 0x41, 0x6c, 0x7a, 0x76, 0x65, 0x6f, 0x2b, 0x78, 0x48, 0x4f, 0x77, 0x36, + 0x32, 0x73, 0x41, 0x72, 0x70, 0x78, 0x58, 0x79, 0x43, 0x39, 0x4d, 0x6c, 0x65, 0x4f, 0x56, 0x30, 0x6c, 0x6c, + 0x33, 0x52, 0x75, 0x77, 0x54, 0x58, 0x59, 0x39, 0x70, 0x69, 0x54, 0x5a, 0x6c, 0x41, 0x7a, 0x52, 0x6c, 0x41, 0x0a, + 0x6b, 0x66, 0x68, 0x2f, 0x41, 0x47, 0x78, 0x77, 0x76, 0x55, 0x66, 0x66, 0x6d, 0x4d, 0x66, 0x2f, 0x50, 0x64, + 0x6a, 0x49, 0x63, 0x59, 0x58, 0x38, 0x6f, 0x6f, 0x6a, 0x6a, 0x49, 0x36, 0x5a, 0x74, 0x52, 0x4d, 0x77, 0x5a, + 0x32, 0x49, 0x42, 0x70, 0x6b, 0x7a, 0x56, 0x6a, 0x41, 0x6a, 0x56, 0x6c, 0x41, 0x45, 0x56, 0x39, 0x2f, 0x76, + 0x38, 0x48, 0x72, 0x48, 0x57, 0x39, 0x78, 0x38, 0x46, 0x7a, 0x4a, 0x75, 0x51, 0x66, 0x6e, 0x59, 0x71, 0x78, 0x0a, + 0x59, 0x71, 0x4b, 0x75, 0x47, 0x4a, 0x32, 0x43, 0x6e, 0x59, 0x63, 0x62, 0x4f, 0x48, 0x67, 0x75, 0x6b, 0x6a, + 0x7a, 0x57, 0x59, 0x74, 0x72, 0x6d, 0x47, 0x6b, 0x69, 0x2b, 0x43, 0x64, 0x53, 0x4d, 0x41, 0x52, 0x53, 0x4a, + 0x2f, 0x35, 0x2b, 0x49, 0x6b, 0x4f, 0x44, 0x7a, 0x32, 0x70, 0x6b, 0x4d, 0x7a, 0x78, 0x35, 0x58, 0x52, 0x70, + 0x2b, 0x59, 0x6d, 0x31, 0x77, 0x41, 0x7a, 0x78, 0x37, 0x50, 0x38, 0x74, 0x71, 0x5a, 0x53, 0x42, 0x4b, 0x35, 0x0a, + 0x47, 0x74, 0x4e, 0x47, 0x31, 0x30, 0x43, 0x79, 0x54, 0x61, 0x42, 0x6d, 0x44, 0x43, 0x44, 0x50, 0x4b, 0x75, + 0x42, 0x2f, 0x34, 0x39, 0x6a, 0x6e, 0x44, 0x34, 0x44, 0x64, 0x76, 0x56, 0x6c, 0x65, 0x37, 0x74, 0x50, 0x68, + 0x76, 0x4d, 0x4b, 0x4e, 0x6c, 0x2f, 0x75, 0x79, 0x37, 0x4f, 0x36, 0x4e, 0x4e, 0x45, 0x35, 0x30, 0x50, 0x61, + 0x61, 0x74, 0x72, 0x6f, 0x71, 0x37, 0x54, 0x6e, 0x46, 0x53, 0x45, 0x77, 0x59, 0x51, 0x63, 0x74, 0x41, 0x6e, 0x0a, + 0x63, 0x52, 0x7a, 0x74, 0x39, 0x77, 0x50, 0x34, 0x30, 0x59, 0x6b, 0x73, 0x62, 0x79, 0x69, 0x72, 0x54, 0x30, + 0x54, 0x6b, 0x6a, 0x62, 0x4d, 0x5a, 0x6e, 0x6a, 0x75, 0x65, 0x6a, 0x62, 0x4b, 0x67, 0x36, 0x42, 0x5a, 0x4d, + 0x6d, 0x30, 0x31, 0x73, 0x46, 0x4a, 0x42, 0x34, 0x56, 0x59, 0x51, 0x2b, 0x75, 0x4d, 0x64, 0x77, 0x6e, 0x4f, + 0x66, 0x50, 0x42, 0x66, 0x44, 0x44, 0x34, 0x31, 0x6e, 0x65, 0x30, 0x51, 0x6f, 0x2b, 0x55, 0x53, 0x49, 0x48, 0x0a, + 0x7a, 0x32, 0x58, 0x34, 0x59, 0x62, 0x54, 0x75, 0x34, 0x33, 0x5a, 0x4d, 0x32, 0x30, 0x32, 0x6b, 0x43, 0x53, + 0x52, 0x61, 0x47, 0x61, 0x45, 0x50, 0x37, 0x44, 0x34, 0x63, 0x4d, 0x2f, 0x78, 0x79, 0x41, 0x66, 0x7a, 0x67, + 0x61, 0x41, 0x4e, 0x48, 0x68, 0x68, 0x50, 0x39, 0x54, 0x78, 0x51, 0x31, 0x78, 0x4a, 0x48, 0x68, 0x44, 0x44, + 0x38, 0x34, 0x32, 0x68, 0x44, 0x46, 0x42, 0x44, 0x35, 0x46, 0x66, 0x68, 0x4f, 0x61, 0x70, 0x4a, 0x6c, 0x41, 0x0a, + 0x59, 0x74, 0x56, 0x52, 0x74, 0x4b, 0x72, 0x76, 0x53, 0x5a, 0x66, 0x33, 0x35, 0x67, 0x4c, 0x34, 0x33, 0x70, + 0x45, 0x47, 0x54, 0x70, 0x7a, 0x58, 0x4e, 0x4a, 0x2b, 0x49, 0x6c, 0x78, 0x50, 0x6e, 0x50, 0x62, 0x35, 0x33, + 0x4a, 0x4a, 0x49, 0x4a, 0x50, 0x45, 0x6b, 0x43, 0x56, 0x78, 0x45, 0x6d, 0x30, 0x67, 0x42, 0x43, 0x48, 0x39, + 0x41, 0x57, 0x48, 0x46, 0x66, 0x31, 0x2b, 0x51, 0x45, 0x38, 0x63, 0x36, 0x7a, 0x6b, 0x31, 0x56, 0x35, 0x43, 0x0a, + 0x7a, 0x49, 0x72, 0x5a, 0x6c, 0x62, 0x67, 0x68, 0x79, 0x70, 0x6a, 0x41, 0x44, 0x6b, 0x79, 0x62, 0x54, 0x6f, + 0x77, 0x4a, 0x4a, 0x4e, 0x49, 0x41, 0x38, 0x71, 0x7a, 0x42, 0x54, 0x4b, 0x56, 0x59, 0x34, 0x2b, 0x66, 0x37, + 0x2f, 0x45, 0x72, 0x77, 0x45, 0x65, 0x58, 0x6d, 0x2b, 0x49, 0x6a, 0x48, 0x44, 0x36, 0x4d, 0x4e, 0x44, 0x4c, + 0x34, 0x37, 0x50, 0x5a, 0x67, 0x45, 0x45, 0x6d, 0x63, 0x41, 0x52, 0x53, 0x50, 0x2b, 0x31, 0x6f, 0x6b, 0x2b, 0x0a, + 0x41, 0x66, 0x44, 0x6a, 0x58, 0x32, 0x58, 0x56, 0x35, 0x78, 0x63, 0x56, 0x34, 0x38, 0x68, 0x77, 0x68, 0x68, + 0x2f, 0x2f, 0x79, 0x6e, 0x6d, 0x4b, 0x63, 0x43, 0x30, 0x4a, 0x6d, 0x68, 0x6c, 0x49, 0x6c, 0x46, 0x70, 0x43, + 0x48, 0x38, 0x68, 0x6e, 0x4d, 0x61, 0x65, 0x31, 0x57, 0x4c, 0x50, 0x37, 0x70, 0x45, 0x62, 0x37, 0x52, 0x65, + 0x56, 0x35, 0x5a, 0x79, 0x6a, 0x44, 0x37, 0x70, 0x50, 0x4f, 0x2b, 0x53, 0x56, 0x33, 0x59, 0x74, 0x70, 0x34, 0x0a, + 0x31, 0x55, 0x6d, 0x4d, 0x59, 0x6b, 0x4c, 0x69, 0x76, 0x77, 0x33, 0x48, 0x38, 0x2f, 0x6c, 0x65, 0x4f, 0x35, + 0x50, 0x68, 0x7a, 0x59, 0x48, 0x45, 0x2f, 0x46, 0x4e, 0x45, 0x79, 0x6e, 0x68, 0x7a, 0x49, 0x42, 0x4d, 0x6c, + 0x59, 0x2f, 0x41, 0x52, 0x59, 0x6a, 0x69, 0x55, 0x70, 0x6c, 0x53, 0x53, 0x70, 0x70, 0x6f, 0x31, 0x6d, 0x48, + 0x58, 0x39, 0x31, 0x68, 0x77, 0x5a, 0x4e, 0x6a, 0x76, 0x34, 0x43, 0x46, 0x46, 0x4e, 0x58, 0x75, 0x36, 0x4c, 0x0a, + 0x31, 0x50, 0x33, 0x38, 0x4e, 0x6c, 0x55, 0x65, 0x44, 0x30, 0x69, 0x45, 0x41, 0x52, 0x54, 0x31, 0x2b, 0x35, + 0x66, 0x62, 0x76, 0x71, 0x39, 0x76, 0x7a, 0x4f, 0x50, 0x5a, 0x34, 0x31, 0x72, 0x4f, 0x4b, 0x35, 0x4c, 0x42, + 0x73, 0x38, 0x65, 0x64, 0x54, 0x79, 0x39, 0x65, 0x6a, 0x75, 0x4d, 0x55, 0x64, 0x39, 0x78, 0x55, 0x33, 0x51, + 0x43, 0x69, 0x39, 0x76, 0x74, 0x48, 0x70, 0x38, 0x78, 0x30, 0x6e, 0x78, 0x62, 0x32, 0x69, 0x4b, 0x53, 0x51, 0x0a, + 0x79, 0x30, 0x39, 0x42, 0x4f, 0x36, 0x34, 0x30, 0x72, 0x65, 0x70, 0x34, 0x51, 0x4e, 0x55, 0x4e, 0x49, 0x4d, + 0x38, 0x31, 0x4f, 0x50, 0x54, 0x37, 0x7a, 0x58, 0x53, 0x66, 0x6c, 0x76, 0x53, 0x4b, 0x35, 0x44, 0x45, 0x36, + 0x5a, 0x64, 0x71, 0x6d, 0x34, 0x2f, 0x54, 0x67, 0x49, 0x78, 0x67, 0x4e, 0x56, 0x4a, 0x79, 0x6b, 0x47, 0x4d, + 0x44, 0x6a, 0x4c, 0x6f, 0x56, 0x66, 0x4f, 0x71, 0x58, 0x6a, 0x74, 0x30, 0x56, 0x79, 0x36, 0x52, 0x33, 0x31, 0x0a, + 0x2b, 0x4f, 0x6b, 0x70, 0x35, 0x33, 0x45, 0x70, 0x4a, 0x77, 0x33, 0x45, 0x52, 0x52, 0x49, 0x4d, 0x34, 0x41, + 0x76, 0x41, 0x72, 0x62, 0x61, 0x46, 0x33, 0x78, 0x37, 0x4d, 0x61, 0x4c, 0x39, 0x2b, 0x6b, 0x58, 0x6a, 0x65, + 0x4f, 0x4a, 0x74, 0x78, 0x50, 0x62, 0x4c, 0x38, 0x56, 0x6f, 0x77, 0x57, 0x4b, 0x6b, 0x71, 0x31, 0x6c, 0x58, + 0x51, 0x6a, 0x38, 0x47, 0x65, 0x32, 0x68, 0x51, 0x63, 0x6e, 0x50, 0x48, 0x62, 0x33, 0x61, 0x73, 0x52, 0x66, 0x0a, + 0x31, 0x41, 0x61, 0x37, 0x65, 0x37, 0x4d, 0x4d, 0x54, 0x6a, 0x68, 0x46, 0x71, 0x6e, 0x2b, 0x47, 0x30, 0x55, + 0x54, 0x46, 0x71, 0x4c, 0x59, 0x42, 0x50, 0x47, 0x78, 0x62, 0x73, 0x4c, 0x43, 0x75, 0x76, 0x34, 0x52, 0x6a, + 0x6e, 0x59, 0x53, 0x6f, 0x4b, 0x4a, 0x4f, 0x2b, 0x61, 0x62, 0x4f, 0x4f, 0x34, 0x77, 0x48, 0x57, 0x6d, 0x6f, + 0x69, 0x44, 0x61, 0x68, 0x71, 0x41, 0x30, 0x36, 0x6a, 0x2f, 0x4b, 0x36, 0x65, 0x7a, 0x6e, 0x43, 0x37, 0x39, 0x0a, + 0x7a, 0x48, 0x63, 0x68, 0x4b, 0x73, 0x72, 0x70, 0x4d, 0x59, 0x39, 0x58, 0x54, 0x6a, 0x74, 0x46, 0x72, 0x52, + 0x57, 0x64, 0x46, 0x61, 0x69, 0x57, 0x41, 0x61, 0x7a, 0x43, 0x59, 0x64, 0x54, 0x2f, 0x78, 0x48, 0x6d, 0x50, + 0x6e, 0x30, 0x66, 0x62, 0x6d, 0x30, 0x32, 0x49, 0x71, 0x76, 0x50, 0x7a, 0x4d, 0x78, 0x6e, 0x58, 0x70, 0x65, + 0x6d, 0x50, 0x55, 0x4b, 0x47, 0x74, 0x78, 0x4b, 0x71, 0x6c, 0x71, 0x67, 0x64, 0x74, 0x43, 0x30, 0x37, 0x36, 0x0a, + 0x38, 0x4c, 0x7a, 0x37, 0x67, 0x67, 0x73, 0x68, 0x45, 0x6b, 0x4f, 0x41, 0x61, 0x63, 0x4f, 0x4f, 0x33, 0x56, + 0x64, 0x72, 0x6a, 0x5a, 0x52, 0x43, 0x4e, 0x51, 0x7a, 0x67, 0x67, 0x38, 0x41, 0x66, 0x32, 0x68, 0x5a, 0x2b, + 0x75, 0x53, 0x2f, 0x4c, 0x38, 0x4b, 0x52, 0x43, 0x66, 0x31, 0x48, 0x62, 0x44, 0x45, 0x39, 0x36, 0x72, 0x70, + 0x76, 0x53, 0x2f, 0x69, 0x46, 0x47, 0x4b, 0x32, 0x57, 0x6c, 0x47, 0x67, 0x5a, 0x77, 0x76, 0x32, 0x33, 0x42, 0x0a, + 0x55, 0x36, 0x4d, 0x65, 0x62, 0x32, 0x72, 0x4b, 0x54, 0x39, 0x51, 0x4a, 0x62, 0x35, 0x37, 0x4e, 0x63, 0x4d, + 0x6f, 0x74, 0x66, 0x38, 0x56, 0x61, 0x4b, 0x31, 0x47, 0x70, 0x74, 0x4c, 0x72, 0x2b, 0x46, 0x4d, 0x75, 0x4e, + 0x50, 0x66, 0x30, 0x41, 0x6e, 0x6a, 0x2b, 0x70, 0x30, 0x46, 0x2f, 0x55, 0x44, 0x77, 0x47, 0x6d, 0x54, 0x54, + 0x76, 0x4d, 0x43, 0x6d, 0x77, 0x48, 0x2f, 0x72, 0x68, 0x73, 0x46, 0x61, 0x4c, 0x79, 0x42, 0x6d, 0x44, 0x74, 0x0a, + 0x61, 0x48, 0x76, 0x37, 0x4d, 0x77, 0x79, 0x4d, 0x4b, 0x2f, 0x51, 0x58, 0x39, 0x63, 0x58, 0x41, 0x75, 0x4d, + 0x66, 0x65, 0x66, 0x69, 0x66, 0x5a, 0x6c, 0x54, 0x55, 0x4b, 0x71, 0x4b, 0x51, 0x42, 0x2f, 0x44, 0x6e, 0x51, + 0x59, 0x31, 0x50, 0x77, 0x2f, 0x4a, 0x54, 0x48, 0x61, 0x32, 0x65, 0x55, 0x38, 0x43, 0x50, 0x71, 0x6b, 0x39, + 0x66, 0x4f, 0x5a, 0x46, 0x31, 0x4f, 0x6f, 0x31, 0x36, 0x48, 0x30, 0x55, 0x35, 0x5a, 0x71, 0x4a, 0x51, 0x42, 0x0a, + 0x64, 0x41, 0x47, 0x66, 0x74, 0x79, 0x33, 0x38, 0x30, 0x71, 0x6d, 0x4d, 0x45, 0x6e, 0x35, 0x45, 0x33, 0x54, + 0x4c, 0x70, 0x6d, 0x7a, 0x62, 0x75, 0x77, 0x4f, 0x63, 0x78, 0x47, 0x6f, 0x71, 0x64, 0x53, 0x68, 0x6e, 0x41, + 0x41, 0x37, 0x59, 0x46, 0x65, 0x30, 0x63, 0x39, 0x44, 0x6d, 0x68, 0x72, 0x4c, 0x31, 0x48, 0x6e, 0x48, 0x42, + 0x6a, 0x4b, 0x75, 0x43, 0x35, 0x6f, 0x73, 0x39, 0x61, 0x51, 0x43, 0x35, 0x56, 0x51, 0x57, 0x68, 0x63, 0x4f, 0x0a, + 0x36, 0x59, 0x33, 0x4b, 0x39, 0x52, 0x64, 0x70, 0x34, 0x55, 0x57, 0x33, 0x74, 0x76, 0x34, 0x77, 0x5a, 0x59, + 0x67, 0x43, 0x4b, 0x6d, 0x45, 0x41, 0x39, 0x39, 0x6b, 0x57, 0x66, 0x47, 0x63, 0x6f, 0x77, 0x78, 0x6d, 0x6c, + 0x2b, 0x34, 0x71, 0x55, 0x63, 0x48, 0x72, 0x4d, 0x63, 0x7a, 0x32, 0x43, 0x33, 0x46, 0x70, 0x4c, 0x74, 0x6c, + 0x54, 0x43, 0x41, 0x4b, 0x78, 0x47, 0x4d, 0x51, 0x4e, 0x67, 0x6a, 0x39, 0x4a, 0x39, 0x52, 0x63, 0x70, 0x34, 0x0a, + 0x35, 0x58, 0x54, 0x47, 0x5a, 0x61, 0x6f, 0x37, 0x39, 0x68, 0x6d, 0x42, 0x63, 0x69, 0x76, 0x75, 0x58, 0x6d, + 0x43, 0x6c, 0x54, 0x63, 0x45, 0x44, 0x67, 0x35, 0x72, 0x32, 0x45, 0x2b, 0x6c, 0x6a, 0x59, 0x4e, 0x7a, 0x6a, + 0x67, 0x50, 0x32, 0x2b, 0x41, 0x53, 0x73, 0x78, 0x6d, 0x6f, 0x71, 0x4e, 0x63, 0x68, 0x75, 0x41, 0x6e, 0x76, + 0x35, 0x43, 0x7a, 0x4d, 0x47, 0x65, 0x4d, 0x39, 0x57, 0x4c, 0x41, 0x73, 0x71, 0x70, 0x75, 0x67, 0x38, 0x43, 0x0a, + 0x31, 0x39, 0x6f, 0x55, 0x66, 0x48, 0x73, 0x67, 0x77, 0x35, 0x44, 0x62, 0x78, 0x67, 0x6c, 0x43, 0x31, 0x41, + 0x31, 0x44, 0x45, 0x78, 0x35, 0x76, 0x32, 0x35, 0x39, 0x72, 0x63, 0x53, 0x30, 0x78, 0x72, 0x68, 0x45, 0x6f, + 0x70, 0x77, 0x48, 0x59, 0x5a, 0x2f, 0x30, 0x70, 0x33, 0x31, 0x2b, 0x6b, 0x48, 0x45, 0x63, 0x4e, 0x78, 0x42, + 0x59, 0x46, 0x6c, 0x45, 0x74, 0x35, 0x50, 0x56, 0x6a, 0x6d, 0x2f, 0x42, 0x38, 0x5a, 0x56, 0x74, 0x39, 0x66, 0x0a, + 0x69, 0x49, 0x46, 0x78, 0x7a, 0x2b, 0x56, 0x67, 0x6b, 0x65, 0x31, 0x59, 0x5a, 0x74, 0x58, 0x4f, 0x52, 0x62, + 0x6b, 0x4d, 0x34, 0x44, 0x2f, 0x62, 0x46, 0x6e, 0x54, 0x4d, 0x69, 0x78, 0x61, 0x69, 0x62, 0x6e, 0x48, 0x55, + 0x67, 0x72, 0x58, 0x47, 0x4c, 0x6b, 0x57, 0x35, 0x31, 0x48, 0x65, 0x50, 0x54, 0x61, 0x48, 0x54, 0x59, 0x78, + 0x34, 0x6e, 0x33, 0x58, 0x5a, 0x4b, 0x45, 0x61, 0x4a, 0x75, 0x4f, 0x58, 0x6e, 0x65, 0x63, 0x7a, 0x6c, 0x5a, 0x0a, + 0x36, 0x42, 0x36, 0x41, 0x4a, 0x31, 0x34, 0x5a, 0x4c, 0x2b, 0x6c, 0x76, 0x6c, 0x73, 0x4d, 0x41, 0x37, 0x67, + 0x42, 0x57, 0x32, 0x78, 0x52, 0x38, 0x58, 0x55, 0x39, 0x2f, 0x49, 0x61, 0x62, 0x78, 0x43, 0x33, 0x74, 0x4e, + 0x72, 0x4d, 0x62, 0x78, 0x42, 0x4f, 0x32, 0x5a, 0x4b, 0x49, 0x63, 0x43, 0x72, 0x5a, 0x37, 0x2b, 0x34, 0x7a, + 0x6b, 0x34, 0x35, 0x4a, 0x59, 0x46, 0x4a, 0x55, 0x54, 0x64, 0x63, 0x2b, 0x68, 0x63, 0x68, 0x76, 0x47, 0x63, 0x0a, + 0x64, 0x66, 0x47, 0x50, 0x51, 0x32, 0x6c, 0x52, 0x51, 0x4e, 0x77, 0x4b, 0x37, 0x41, 0x49, 0x2b, 0x61, 0x6c, + 0x50, 0x77, 0x6c, 0x30, 0x4d, 0x5a, 0x6e, 0x65, 0x73, 0x6e, 0x52, 0x42, 0x47, 0x35, 0x77, 0x47, 0x6a, 0x44, + 0x6b, 0x6f, 0x39, 0x53, 0x34, 0x76, 0x71, 0x41, 0x75, 0x41, 0x33, 0x67, 0x44, 0x74, 0x75, 0x43, 0x2b, 0x2b, + 0x7a, 0x6e, 0x50, 0x59, 0x56, 0x49, 0x46, 0x59, 0x37, 0x61, 0x73, 0x4e, 0x62, 0x63, 0x54, 0x4d, 0x53, 0x74, 0x0a, + 0x77, 0x72, 0x74, 0x74, 0x43, 0x76, 0x57, 0x4e, 0x65, 0x5a, 0x7a, 0x56, 0x31, 0x4a, 0x38, 0x51, 0x4d, 0x33, + 0x4a, 0x32, 0x33, 0x48, 0x50, 0x5a, 0x4f, 0x2f, 0x42, 0x75, 0x69, 0x4e, 0x34, 0x4e, 0x69, 0x4e, 0x4d, 0x41, + 0x6c, 0x6d, 0x42, 0x70, 0x41, 0x50, 0x76, 0x31, 0x39, 0x42, 0x66, 0x69, 0x6b, 0x6a, 0x69, 0x63, 0x4b, 0x33, + 0x67, 0x33, 0x52, 0x6e, 0x75, 0x52, 0x69, 0x46, 0x4f, 0x4a, 0x56, 0x71, 0x46, 0x49, 0x41, 0x4b, 0x35, 0x4c, 0x0a, + 0x49, 0x49, 0x56, 0x49, 0x48, 0x51, 0x66, 0x50, 0x4f, 0x61, 0x30, 0x50, 0x69, 0x4e, 0x77, 0x4e, 0x71, 0x4c, + 0x67, 0x42, 0x48, 0x42, 0x2f, 0x78, 0x58, 0x45, 0x59, 0x35, 0x68, 0x55, 0x67, 0x6c, 0x34, 0x7a, 0x6d, 0x6a, + 0x46, 0x55, 0x73, 0x53, 0x59, 0x51, 0x43, 0x33, 0x32, 0x78, 0x54, 0x53, 0x30, 0x31, 0x38, 0x49, 0x4f, 0x78, + 0x79, 0x30, 0x63, 0x6a, 0x74, 0x45, 0x47, 0x77, 0x65, 0x49, 0x53, 0x34, 0x32, 0x62, 0x73, 0x45, 0x6a, 0x2b, 0x0a, + 0x38, 0x51, 0x4d, 0x34, 0x4c, 0x41, 0x4d, 0x51, 0x77, 0x6f, 0x72, 0x44, 0x35, 0x7a, 0x4b, 0x32, 0x5a, 0x77, + 0x69, 0x73, 0x78, 0x6d, 0x6a, 0x51, 0x6d, 0x62, 0x6a, 0x55, 0x61, 0x4c, 0x58, 0x77, 0x52, 0x2b, 0x47, 0x2f, + 0x45, 0x50, 0x59, 0x34, 0x64, 0x67, 0x4f, 0x73, 0x4e, 0x46, 0x68, 0x4d, 0x53, 0x51, 0x59, 0x51, 0x43, 0x6a, + 0x6d, 0x73, 0x55, 0x68, 0x4b, 0x50, 0x6a, 0x2b, 0x6a, 0x70, 0x4c, 0x34, 0x51, 0x4c, 0x44, 0x70, 0x71, 0x35, 0x0a, + 0x45, 0x39, 0x79, 0x37, 0x41, 0x58, 0x45, 0x6f, 0x73, 0x67, 0x76, 0x59, 0x5a, 0x6c, 0x50, 0x51, 0x38, 0x59, + 0x68, 0x6b, 0x49, 0x56, 0x4b, 0x50, 0x67, 0x32, 0x61, 0x32, 0x45, 0x53, 0x45, 0x72, 0x4d, 0x41, 0x34, 0x44, + 0x75, 0x4e, 0x6d, 0x6d, 0x30, 0x50, 0x43, 0x6b, 0x6b, 0x6e, 0x2b, 0x45, 0x63, 0x4f, 0x58, 0x73, 0x75, 0x4f, + 0x64, 0x79, 0x4f, 0x72, 0x61, 0x56, 0x46, 0x73, 0x4e, 0x55, 0x7a, 0x41, 0x43, 0x4f, 0x32, 0x76, 0x64, 0x6c, 0x0a, + 0x68, 0x42, 0x41, 0x68, 0x48, 0x4c, 0x52, 0x54, 0x4f, 0x51, 0x4d, 0x49, 0x39, 0x54, 0x56, 0x75, 0x73, 0x53, + 0x6c, 0x2f, 0x62, 0x46, 0x67, 0x47, 0x49, 0x45, 0x51, 0x55, 0x48, 0x4c, 0x52, 0x7a, 0x43, 0x37, 0x69, 0x4e, + 0x41, 0x35, 0x51, 0x61, 0x41, 0x54, 0x51, 0x41, 0x4e, 0x38, 0x35, 0x56, 0x4b, 0x41, 0x42, 0x36, 0x52, 0x7a, + 0x55, 0x41, 0x4b, 0x45, 0x51, 0x55, 0x65, 0x6b, 0x65, 0x74, 0x73, 0x77, 0x4a, 0x76, 0x78, 0x47, 0x6a, 0x53, 0x0a, + 0x6d, 0x6c, 0x4a, 0x56, 0x65, 0x5a, 0x56, 0x4e, 0x6f, 0x59, 0x46, 0x78, 0x54, 0x66, 0x38, 0x4a, 0x45, 0x5a, + 0x58, 0x78, 0x48, 0x43, 0x37, 0x37, 0x5a, 0x6c, 0x70, 0x70, 0x73, 0x6b, 0x43, 0x70, 0x42, 0x72, 0x44, 0x56, + 0x70, 0x70, 0x44, 0x6a, 0x49, 0x59, 0x68, 0x43, 0x69, 0x43, 0x49, 0x63, 0x4e, 0x47, 0x53, 0x6c, 0x79, 0x51, + 0x49, 0x56, 0x4d, 0x51, 0x43, 0x48, 0x70, 0x59, 0x31, 0x43, 0x69, 0x42, 0x6c, 0x77, 0x30, 0x46, 0x44, 0x35, 0x0a, + 0x44, 0x53, 0x41, 0x30, 0x79, 0x48, 0x43, 0x44, 0x54, 0x58, 0x6d, 0x48, 0x6a, 0x51, 0x36, 0x46, 0x45, 0x44, + 0x50, 0x67, 0x6f, 0x4b, 0x45, 0x62, 0x77, 0x48, 0x34, 0x67, 0x73, 0x4a, 0x51, 0x49, 0x6f, 0x42, 0x6e, 0x59, + 0x4f, 0x46, 0x63, 0x68, 0x50, 0x34, 0x42, 0x42, 0x7a, 0x66, 0x38, 0x4c, 0x55, 0x52, 0x4b, 0x44, 0x34, 0x35, + 0x37, 0x74, 0x75, 0x6f, 0x43, 0x4e, 0x47, 0x47, 0x31, 0x61, 0x55, 0x59, 0x6f, 0x42, 0x57, 0x41, 0x30, 0x32, 0x0a, + 0x6e, 0x42, 0x33, 0x33, 0x58, 0x4e, 0x59, 0x31, 0x43, 0x79, 0x46, 0x6d, 0x49, 0x41, 0x43, 0x58, 0x52, 0x44, + 0x72, 0x72, 0x67, 0x63, 0x42, 0x53, 0x44, 0x4d, 0x44, 0x71, 0x33, 0x4c, 0x39, 0x2b, 0x50, 0x66, 0x32, 0x46, + 0x69, 0x41, 0x55, 0x48, 0x4c, 0x56, 0x6c, 0x70, 0x45, 0x30, 0x6f, 0x7a, 0x41, 0x4b, 0x76, 0x6c, 0x68, 0x7a, + 0x49, 0x41, 0x49, 0x65, 0x4c, 0x42, 0x51, 0x55, 0x76, 0x57, 0x53, 0x34, 0x50, 0x4c, 0x33, 0x67, 0x58, 0x51, 0x0a, + 0x75, 0x58, 0x39, 0x43, 0x78, 0x45, 0x4d, 0x35, 0x63, 0x67, 0x47, 0x63, 0x44, 0x53, 0x41, 0x30, 0x75, 0x72, + 0x6a, 0x65, 0x70, 0x76, 0x7a, 0x67, 0x68, 0x4f, 0x74, 0x66, 0x45, 0x45, 0x4c, 0x4d, 0x68, 0x49, 0x4f, 0x57, + 0x31, 0x6f, 0x50, 0x64, 0x54, 0x45, 0x44, 0x55, 0x43, 0x4b, 0x41, 0x42, 0x57, 0x44, 0x4e, 0x58, 0x6f, 0x51, + 0x41, 0x59, 0x6d, 0x56, 0x49, 0x45, 0x49, 0x45, 0x51, 0x63, 0x6a, 0x45, 0x78, 0x5a, 0x44, 0x36, 0x69, 0x76, 0x0a, + 0x77, 0x54, 0x49, 0x6c, 0x4f, 0x4b, 0x6f, 0x42, 0x72, 0x4c, 0x51, 0x70, 0x4e, 0x44, 0x4a, 0x70, 0x50, 0x58, + 0x55, 0x68, 0x68, 0x4a, 0x67, 0x44, 0x50, 0x7a, 0x43, 0x61, 0x73, 0x73, 0x52, 0x4b, 0x6f, 0x31, 0x45, 0x4e, + 0x77, 0x4f, 0x70, 0x73, 0x38, 0x75, 0x48, 0x4a, 0x69, 0x48, 0x63, 0x58, 0x51, 0x73, 0x79, 0x49, 0x67, 0x36, + 0x61, 0x73, 0x4e, 0x46, 0x70, 0x57, 0x41, 0x7a, 0x68, 0x6e, 0x37, 0x31, 0x5a, 0x43, 0x43, 0x41, 0x73, 0x63, 0x0a, + 0x4e, 0x46, 0x56, 0x57, 0x41, 0x37, 0x41, 0x36, 0x2f, 0x6c, 0x73, 0x52, 0x67, 0x42, 0x44, 0x78, 0x34, 0x71, + 0x41, 0x70, 0x4b, 0x34, 0x31, 0x47, 0x4e, 0x51, 0x43, 0x72, 0x76, 0x63, 0x66, 0x47, 0x63, 0x34, 0x6f, 0x41, + 0x68, 0x49, 0x67, 0x54, 0x42, 0x30, 0x31, 0x5a, 0x61, 0x62, 0x53, 0x73, 0x67, 0x34, 0x44, 0x6e, 0x70, 0x79, + 0x4c, 0x65, 0x58, 0x51, 0x67, 0x78, 0x49, 0x77, 0x36, 0x61, 0x4b, 0x75, 0x73, 0x67, 0x59, 0x49, 0x64, 0x4e, 0x0a, + 0x6f, 0x51, 0x6c, 0x66, 0x45, 0x59, 0x41, 0x51, 0x63, 0x65, 0x4b, 0x67, 0x4b, 0x53, 0x75, 0x4e, 0x6c, 0x72, + 0x6b, 0x4c, 0x45, 0x50, 0x48, 0x75, 0x51, 0x6f, 0x67, 0x5a, 0x63, 0x64, 0x42, 0x55, 0x57, 0x62, 0x73, 0x41, + 0x6c, 0x68, 0x46, 0x41, 0x78, 0x4c, 0x73, 0x4c, 0x49, 0x57, 0x62, 0x45, 0x51, 0x56, 0x4e, 0x6c, 0x6a, 0x51, + 0x42, 0x61, 0x62, 0x51, 0x70, 0x4e, 0x79, 0x51, 0x43, 0x45, 0x69, 0x42, 0x55, 0x48, 0x54, 0x56, 0x6c, 0x70, 0x0a, + 0x4e, 0x4b, 0x6f, 0x42, 0x74, 0x4e, 0x6b, 0x55, 0x6d, 0x74, 0x49, 0x59, 0x67, 0x42, 0x43, 0x78, 0x34, 0x71, + 0x41, 0x70, 0x4b, 0x34, 0x30, 0x36, 0x47, 0x55, 0x42, 0x6f, 0x63, 0x55, 0x47, 0x54, 0x54, 0x66, 0x6d, 0x63, + 0x30, 0x6f, 0x43, 0x46, 0x69, 0x42, 0x55, 0x48, 0x53, 0x57, 0x56, 0x68, 0x37, 0x67, 0x56, 0x42, 0x55, 0x53, + 0x49, 0x41, 0x44, 0x32, 0x69, 0x78, 0x4b, 0x53, 0x67, 0x44, 0x45, 0x43, 0x4a, 0x65, 0x4a, 0x75, 0x32, 0x37, 0x0a, + 0x41, 0x50, 0x4d, 0x78, 0x57, 0x72, 0x30, 0x6b, 0x4f, 0x71, 0x31, 0x44, 0x69, 0x42, 0x51, 0x6a, 0x41, 0x78, + 0x41, 0x69, 0x78, 0x63, 0x67, 0x41, 0x68, 0x4b, 0x67, 0x68, 0x47, 0x75, 0x30, 0x56, 0x4f, 0x34, 0x4c, 0x46, + 0x6b, 0x45, 0x45, 0x55, 0x41, 0x77, 0x69, 0x41, 0x4d, 0x5a, 0x75, 0x43, 0x57, 0x55, 0x30, 0x43, 0x43, 0x42, + 0x45, 0x72, 0x44, 0x70, 0x4c, 0x4b, 0x41, 0x64, 0x79, 0x2f, 0x35, 0x64, 0x49, 0x37, 0x68, 0x44, 0x73, 0x5a, 0x0a, + 0x51, 0x4f, 0x68, 0x6d, 0x56, 0x70, 0x73, 0x54, 0x79, 0x51, 0x43, 0x45, 0x69, 0x4a, 0x65, 0x4d, 0x76, 0x61, + 0x61, 0x73, 0x4e, 0x42, 0x71, 0x31, 0x43, 0x7a, 0x42, 0x73, 0x55, 0x36, 0x67, 0x68, 0x6f, 0x32, 0x6b, 0x41, + 0x49, 0x65, 0x4c, 0x45, 0x51, 0x56, 0x4f, 0x6a, 0x4e, 0x6f, 0x57, 0x69, 0x47, 0x6f, 0x44, 0x56, 0x7a, 0x52, + 0x73, 0x30, 0x77, 0x69, 0x42, 0x45, 0x72, 0x43, 0x51, 0x6c, 0x41, 0x68, 0x69, 0x30, 0x4b, 0x64, 0x51, 0x6b, 0x0a, + 0x41, 0x78, 0x41, 0x69, 0x56, 0x68, 0x77, 0x30, 0x5a, 0x61, 0x58, 0x52, 0x71, 0x42, 0x4c, 0x74, 0x74, 0x79, + 0x6e, 0x55, 0x6e, 0x49, 0x31, 0x34, 0x64, 0x79, 0x48, 0x45, 0x6a, 0x44, 0x68, 0x6f, 0x79, 0x6b, 0x71, 0x6a, + 0x5a, 0x59, 0x34, 0x41, 0x4e, 0x41, 0x59, 0x67, 0x52, 0x4a, 0x77, 0x34, 0x61, 0x4b, 0x71, 0x73, 0x45, 0x63, + 0x42, 0x78, 0x6d, 0x30, 0x4c, 0x7a, 0x72, 0x48, 0x59, 0x6d, 0x46, 0x30, 0x4c, 0x59, 0x30, 0x6d, 0x71, 0x76, 0x0a, + 0x71, 0x5a, 0x4d, 0x32, 0x68, 0x63, 0x72, 0x63, 0x42, 0x56, 0x41, 0x45, 0x49, 0x45, 0x53, 0x63, 0x74, 0x4e, + 0x68, 0x72, 0x71, 0x73, 0x2b, 0x6d, 0x55, 0x46, 0x51, 0x44, 0x4f, 0x47, 0x4a, 0x54, 0x71, 0x4b, 0x30, 0x78, + 0x34, 0x74, 0x32, 0x46, 0x45, 0x44, 0x50, 0x69, 0x6f, 0x43, 0x6b, 0x72, 0x6a, 0x55, 0x59, 0x31, 0x67, 0x49, + 0x4d, 0x32, 0x68, 0x64, 0x6f, 0x62, 0x46, 0x51, 0x45, 0x49, 0x45, 0x53, 0x63, 0x4f, 0x6d, 0x72, 0x4c, 0x53, 0x0a, + 0x61, 0x46, 0x6b, 0x6a, 0x67, 0x50, 0x6d, 0x4b, 0x41, 0x49, 0x53, 0x49, 0x46, 0x51, 0x64, 0x4e, 0x6c, 0x54, + 0x55, 0x43, 0x73, 0x4f, 0x77, 0x43, 0x42, 0x43, 0x36, 0x35, 0x79, 0x30, 0x4b, 0x49, 0x53, 0x35, 0x44, 0x78, + 0x6a, 0x4b, 0x59, 0x73, 0x4b, 0x61, 0x73, 0x42, 0x54, 0x41, 0x47, 0x48, 0x35, 0x69, 0x72, 0x6b, 0x34, 0x56, + 0x52, 0x68, 0x49, 0x63, 0x51, 0x6c, 0x6d, 0x4e, 0x39, 0x67, 0x2f, 0x55, 0x41, 0x39, 0x68, 0x4e, 0x48, 0x6f, 0x0a, + 0x6e, 0x44, 0x67, 0x62, 0x51, 0x47, 0x68, 0x42, 0x30, 0x44, 0x36, 0x62, 0x38, 0x68, 0x31, 0x57, 0x6d, 0x34, + 0x63, 0x4a, 0x49, 0x65, 0x62, 0x43, 0x51, 0x55, 0x76, 0x37, 0x59, 0x4f, 0x36, 0x56, 0x67, 0x46, 0x44, 0x61, + 0x66, 0x67, 0x42, 0x76, 0x32, 0x42, 0x54, 0x71, 0x62, 0x46, 0x59, 0x45, 0x49, 0x45, 0x51, 0x63, 0x4f, 0x47, + 0x6a, 0x4a, 0x53, 0x70, 0x74, 0x51, 0x6d, 0x67, 0x48, 0x73, 0x74, 0x53, 0x6e, 0x55, 0x4a, 0x51, 0x4d, 0x51, 0x0a, + 0x49, 0x68, 0x59, 0x63, 0x74, 0x47, 0x53, 0x6c, 0x54, 0x61, 0x69, 0x41, 0x41, 0x53, 0x79, 0x55, 0x41, 0x51, + 0x67, 0x52, 0x43, 0x77, 0x35, 0x61, 0x71, 0x6f, 0x67, 0x42, 0x57, 0x49, 0x55, 0x5a, 0x43, 0x35, 0x73, 0x31, + 0x45, 0x79, 0x42, 0x45, 0x71, 0x58, 0x67, 0x6b, 0x4c, 0x77, 0x49, 0x34, 0x44, 0x37, 0x77, 0x35, 0x56, 0x36, + 0x47, 0x73, 0x42, 0x78, 0x32, 0x4b, 0x41, 0x6f, 0x51, 0x6f, 0x69, 0x59, 0x37, 0x6d, 0x77, 0x48, 0x59, 0x76, 0x0a, + 0x67, 0x44, 0x65, 0x42, 0x53, 0x78, 0x38, 0x47, 0x45, 0x43, 0x4b, 0x53, 0x41, 0x59, 0x52, 0x47, 0x46, 0x31, + 0x2b, 0x79, 0x4b, 0x62, 0x2b, 0x6b, 0x52, 0x51, 0x59, 0x67, 0x52, 0x43, 0x6b, 0x34, 0x61, 0x4f, 0x67, 0x6c, + 0x73, 0x4a, 0x73, 0x42, 0x67, 0x4e, 0x4a, 0x33, 0x42, 0x64, 0x35, 0x74, 0x55, 0x32, 0x68, 0x70, 0x71, 0x77, + 0x78, 0x41, 0x69, 0x46, 0x4a, 0x77, 0x30, 0x4a, 0x43, 0x56, 0x4a, 0x67, 0x74, 0x55, 0x78, 0x41, 0x43, 0x36, 0x0a, + 0x5a, 0x51, 0x42, 0x43, 0x6c, 0x49, 0x53, 0x44, 0x68, 0x69, 0x70, 0x71, 0x41, 0x4e, 0x61, 0x35, 0x41, 0x4e, + 0x6f, 0x64, 0x53, 0x49, 0x68, 0x6f, 0x4e, 0x47, 0x66, 0x4c, 0x6b, 0x77, 0x4d, 0x41, 0x70, 0x52, 0x76, 0x41, + 0x46, 0x50, 0x44, 0x69, 0x58, 0x49, 0x55, 0x38, 0x6f, 0x4c, 0x74, 0x56, 0x5a, 0x34, 0x55, 0x4c, 0x45, 0x59, + 0x58, 0x75, 0x56, 0x74, 0x39, 0x32, 0x4a, 0x75, 0x31, 0x46, 0x4c, 0x46, 0x4f, 0x41, 0x43, 0x30, 0x51, 0x32, 0x0a, + 0x67, 0x4e, 0x41, 0x67, 0x77, 0x2f, 0x4d, 0x32, 0x35, 0x53, 0x39, 0x72, 0x55, 0x7a, 0x64, 0x41, 0x69, 0x43, + 0x67, 0x34, 0x61, 0x4f, 0x64, 0x35, 0x73, 0x42, 0x38, 0x41, 0x68, 0x48, 0x69, 0x4f, 0x42, 0x6e, 0x76, 0x42, + 0x70, 0x74, 0x43, 0x71, 0x2b, 0x54, 0x49, 0x41, 0x49, 0x61, 0x4c, 0x67, 0x6f, 0x42, 0x30, 0x72, 0x4c, 0x59, + 0x61, 0x70, 0x6d, 0x41, 0x47, 0x30, 0x4e, 0x51, 0x62, 0x4b, 0x43, 0x68, 0x54, 0x43, 0x6b, 0x59, 0x58, 0x4e, 0x0a, + 0x67, 0x63, 0x75, 0x4b, 0x32, 0x71, 0x6f, 0x59, 0x51, 0x44, 0x2f, 0x77, 0x59, 0x35, 0x75, 0x43, 0x79, 0x7a, + 0x51, 0x62, 0x49, 0x49, 0x51, 0x54, 0x44, 0x70, 0x72, 0x35, 0x4d, 0x5a, 0x5a, 0x37, 0x64, 0x59, 0x59, 0x70, + 0x79, 0x51, 0x42, 0x43, 0x66, 0x59, 0x31, 0x64, 0x4e, 0x75, 0x56, 0x58, 0x74, 0x57, 0x6b, 0x67, 0x55, 0x41, + 0x67, 0x58, 0x48, 0x44, 0x53, 0x7a, 0x43, 0x39, 0x7a, 0x36, 0x2f, 0x78, 0x44, 0x66, 0x38, 0x65, 0x41, 0x37, 0x0a, + 0x62, 0x51, 0x71, 0x74, 0x6e, 0x4b, 0x2f, 0x70, 0x51, 0x43, 0x46, 0x73, 0x61, 0x63, 0x34, 0x61, 0x7a, 0x56, + 0x68, 0x69, 0x70, 0x63, 0x46, 0x69, 0x34, 0x6a, 0x4b, 0x41, 0x76, 0x56, 0x68, 0x73, 0x51, 0x5a, 0x54, 0x78, + 0x59, 0x4c, 0x57, 0x69, 0x41, 0x43, 0x47, 0x73, 0x57, 0x4e, 0x33, 0x6d, 0x32, 0x2b, 0x62, 0x2f, 0x48, 0x38, + 0x46, 0x68, 0x41, 0x56, 0x43, 0x59, 0x4f, 0x45, 0x2f, 0x76, 0x73, 0x78, 0x71, 0x41, 0x36, 0x47, 0x6d, 0x58, 0x0a, + 0x41, 0x51, 0x68, 0x68, 0x67, 0x34, 0x4e, 0x57, 0x58, 0x67, 0x44, 0x33, 0x38, 0x42, 0x2f, 0x69, 0x4e, 0x51, + 0x43, 0x72, 0x45, 0x4f, 0x53, 0x79, 0x4e, 0x6e, 0x55, 0x44, 0x68, 0x4a, 0x69, 0x4c, 0x35, 0x71, 0x7a, 0x54, + 0x2f, 0x48, 0x2b, 0x6b, 0x38, 0x42, 0x2f, 0x69, 0x4e, 0x59, 0x42, 0x6e, 0x62, 0x41, 0x70, 0x35, 0x4b, 0x41, + 0x6f, 0x51, 0x59, 0x69, 0x35, 0x36, 0x32, 0x71, 0x32, 0x7a, 0x2f, 0x38, 0x42, 0x53, 0x65, 0x7a, 0x4d, 0x52, 0x0a, + 0x70, 0x77, 0x48, 0x30, 0x41, 0x54, 0x74, 0x73, 0x43, 0x71, 0x37, 0x72, 0x6b, 0x41, 0x45, 0x49, 0x63, 0x53, + 0x6b, 0x63, 0x4e, 0x4c, 0x49, 0x44, 0x79, 0x32, 0x50, 0x41, 0x5a, 0x69, 0x4a, 0x4f, 0x41, 0x77, 0x42, 0x34, + 0x79, 0x71, 0x5a, 0x51, 0x64, 0x32, 0x74, 0x41, 0x52, 0x35, 0x4e, 0x79, 0x41, 0x6f, 0x53, 0x59, 0x69, 0x59, + 0x36, 0x6d, 0x77, 0x47, 0x58, 0x31, 0x33, 0x31, 0x4d, 0x51, 0x72, 0x66, 0x38, 0x50, 0x38, 0x52, 0x75, 0x41, 0x0a, + 0x56, 0x54, 0x34, 0x41, 0x77, 0x4d, 0x61, 0x46, 0x69, 0x67, 0x4b, 0x45, 0x6d, 0x49, 0x6b, 0x4e, 0x6e, 0x55, + 0x37, 0x61, 0x73, 0x4e, 0x62, 0x63, 0x54, 0x4d, 0x52, 0x74, 0x41, 0x50, 0x33, 0x41, 0x64, 0x32, 0x77, 0x4b, + 0x72, 0x6c, 0x76, 0x67, 0x6b, 0x39, 0x56, 0x6d, 0x67, 0x55, 0x4a, 0x4d, 0x49, 0x2b, 0x76, 0x42, 0x6c, 0x66, + 0x62, 0x68, 0x2f, 0x33, 0x65, 0x49, 0x6b, 0x50, 0x30, 0x58, 0x4a, 0x6d, 0x34, 0x44, 0x41, 0x50, 0x69, 0x57, 0x0a, + 0x54, 0x61, 0x48, 0x6d, 0x4c, 0x4b, 0x7a, 0x52, 0x59, 0x4b, 0x41, 0x51, 0x30, 0x31, 0x6a, 0x54, 0x37, 0x72, + 0x76, 0x4d, 0x6b, 0x6e, 0x30, 0x4c, 0x6f, 0x6f, 0x66, 0x2f, 0x55, 0x42, 0x34, 0x44, 0x32, 0x41, 0x6d, 0x63, + 0x74, 0x43, 0x6c, 0x34, 0x64, 0x5a, 0x63, 0x4d, 0x51, 0x49, 0x67, 0x77, 0x56, 0x39, 0x6c, 0x33, 0x6a, 0x55, + 0x39, 0x53, 0x77, 0x76, 0x52, 0x66, 0x67, 0x58, 0x49, 0x59, 0x41, 0x4d, 0x43, 0x54, 0x4e, 0x6f, 0x57, 0x57, 0x0a, + 0x74, 0x41, 0x51, 0x73, 0x6d, 0x36, 0x66, 0x42, 0x51, 0x43, 0x45, 0x41, 0x6c, 0x73, 0x30, 0x4c, 0x58, 0x50, + 0x62, 0x2b, 0x2b, 0x78, 0x71, 0x55, 0x39, 0x76, 0x53, 0x48, 0x38, 0x68, 0x6d, 0x41, 0x56, 0x54, 0x63, 0x41, + 0x59, 0x4a, 0x4f, 0x69, 0x41, 0x43, 0x45, 0x41, 0x5a, 0x79, 0x31, 0x38, 0x4d, 0x34, 0x36, 0x2f, 0x57, 0x53, + 0x34, 0x44, 0x4f, 0x49, 0x68, 0x6c, 0x65, 0x4c, 0x4b, 0x71, 0x7a, 0x64, 0x66, 0x35, 0x67, 0x53, 0x4c, 0x31, 0x0a, + 0x64, 0x44, 0x51, 0x46, 0x4c, 0x69, 0x76, 0x2f, 0x64, 0x6d, 0x49, 0x30, 0x56, 0x6a, 0x4c, 0x6c, 0x4d, 0x67, + 0x43, 0x41, 0x4a, 0x32, 0x77, 0x4b, 0x65, 0x63, 0x41, 0x6d, 0x54, 0x51, 0x6d, 0x4b, 0x6c, 0x50, 0x4f, 0x65, + 0x4c, 0x71, 0x66, 0x4d, 0x50, 0x79, 0x74, 0x74, 0x32, 0x56, 0x42, 0x4f, 0x41, 0x33, 0x67, 0x61, 0x65, 0x4e, + 0x57, 0x6d, 0x34, 0x4a, 0x57, 0x64, 0x50, 0x75, 0x33, 0x32, 0x75, 0x35, 0x34, 0x49, 0x55, 0x56, 0x65, 0x30, 0x0a, + 0x4e, 0x77, 0x5a, 0x63, 0x61, 0x54, 0x2f, 0x33, 0x2f, 0x79, 0x70, 0x47, 0x57, 0x37, 0x46, 0x51, 0x54, 0x67, + 0x4d, 0x41, 0x68, 0x79, 0x6a, 0x67, 0x75, 0x73, 0x57, 0x4b, 0x41, 0x6b, 0x51, 0x36, 0x75, 0x57, 0x35, 0x78, + 0x64, 0x5a, 0x37, 0x2b, 0x55, 0x48, 0x34, 0x44, 0x2b, 0x44, 0x2b, 0x32, 0x42, 0x64, 0x64, 0x31, 0x2b, 0x45, + 0x6f, 0x50, 0x46, 0x71, 0x6d, 0x6a, 0x6f, 0x79, 0x6c, 0x77, 0x58, 0x52, 0x74, 0x6a, 0x72, 0x53, 0x6b, 0x62, 0x0a, + 0x79, 0x6d, 0x30, 0x41, 0x2f, 0x63, 0x43, 0x44, 0x4e, 0x67, 0x55, 0x39, 0x59, 0x49, 0x75, 0x69, 0x41, 0x4a, + 0x45, 0x79, 0x74, 0x72, 0x67, 0x39, 0x2f, 0x52, 0x2b, 0x69, 0x78, 0x4d, 0x79, 0x2f, 0x59, 0x73, 0x70, 0x74, + 0x41, 0x41, 0x42, 0x66, 0x74, 0x53, 0x33, 0x59, 0x73, 0x38, 0x42, 0x6e, 0x6b, 0x51, 0x34, 0x53, 0x46, 0x53, + 0x6c, 0x68, 0x55, 0x55, 0x74, 0x41, 0x7a, 0x77, 0x4b, 0x6e, 0x68, 0x39, 0x37, 0x6a, 0x63, 0x64, 0x65, 0x68, 0x0a, + 0x45, 0x67, 0x62, 0x51, 0x44, 0x33, 0x7a, 0x4f, 0x70, 0x71, 0x41, 0x48, 0x62, 0x4f, 0x33, 0x4f, 0x6c, 0x62, + 0x63, 0x32, 0x51, 0x69, 0x53, 0x45, 0x72, 0x64, 0x30, 0x35, 0x6c, 0x36, 0x66, 0x2f, 0x35, 0x34, 0x6a, 0x35, + 0x36, 0x51, 0x2b, 0x56, 0x4d, 0x51, 0x43, 0x41, 0x4c, 0x39, 0x6b, 0x57, 0x37, 0x47, 0x34, 0x4e, 0x75, 0x4d, + 0x4c, 0x4e, 0x46, 0x59, 0x57, 0x6f, 0x4f, 0x61, 0x35, 0x59, 0x34, 0x4c, 0x73, 0x65, 0x6d, 0x6d, 0x75, 0x74, 0x0a, + 0x49, 0x52, 0x63, 0x71, 0x5a, 0x51, 0x44, 0x39, 0x6d, 0x50, 0x36, 0x4c, 0x46, 0x54, 0x63, 0x73, 0x39, 0x57, + 0x6d, 0x73, 0x56, 0x4d, 0x32, 0x45, 0x71, 0x44, 0x43, 0x4e, 0x47, 0x64, 0x50, 0x47, 0x48, 0x59, 0x69, 0x39, + 0x37, 0x31, 0x2b, 0x67, 0x6b, 0x6a, 0x4b, 0x7a, 0x37, 0x72, 0x2f, 0x4d, 0x61, 0x77, 0x69, 0x34, 0x52, 0x69, + 0x6e, 0x43, 0x6f, 0x6b, 0x37, 0x5a, 0x31, 0x4a, 0x56, 0x6a, 0x58, 0x6f, 0x50, 0x54, 0x30, 0x7a, 0x2f, 0x32, 0x0a, + 0x76, 0x6e, 0x2b, 0x42, 0x53, 0x68, 0x71, 0x41, 0x39, 0x59, 0x77, 0x41, 0x77, 0x4c, 0x57, 0x4c, 0x63, 0x70, + 0x6f, 0x57, 0x46, 0x48, 0x56, 0x48, 0x5a, 0x33, 0x50, 0x41, 0x35, 0x6b, 0x56, 0x4f, 0x44, 0x37, 0x63, 0x48, + 0x4b, 0x64, 0x50, 0x54, 0x48, 0x79, 0x70, 0x72, 0x41, 0x41, 0x42, 0x66, 0x77, 0x48, 0x4b, 0x4e, 0x51, 0x4d, + 0x61, 0x44, 0x57, 0x35, 0x59, 0x37, 0x44, 0x5a, 0x49, 0x49, 0x6b, 0x57, 0x67, 0x38, 0x34, 0x4f, 0x5a, 0x6c, 0x0a, + 0x4f, 0x64, 0x75, 0x39, 0x2f, 0x73, 0x46, 0x6f, 0x35, 0x51, 0x74, 0x6c, 0x71, 0x78, 0x43, 0x56, 0x4e, 0x77, + 0x42, 0x77, 0x79, 0x47, 0x54, 0x71, 0x62, 0x67, 0x31, 0x63, 0x74, 0x30, 0x63, 0x53, 0x49, 0x72, 0x46, 0x73, + 0x58, 0x4f, 0x67, 0x38, 0x38, 0x42, 0x64, 0x72, 0x31, 0x74, 0x39, 0x4d, 0x56, 0x4d, 0x4d, 0x41, 0x6e, 0x67, + 0x62, 0x2b, 0x33, 0x72, 0x62, 0x77, 0x65, 0x35, 0x63, 0x36, 0x39, 0x35, 0x65, 0x45, 0x53, 0x42, 0x7a, 0x7a, 0x0a, + 0x47, 0x67, 0x4b, 0x75, 0x58, 0x2b, 0x49, 0x30, 0x78, 0x66, 0x33, 0x33, 0x78, 0x4a, 0x6a, 0x7a, 0x50, 0x78, + 0x76, 0x56, 0x47, 0x6d, 0x76, 0x2f, 0x4f, 0x39, 0x75, 0x43, 0x6a, 0x52, 0x6e, 0x59, 0x74, 0x6b, 0x4a, 0x64, + 0x41, 0x56, 0x47, 0x37, 0x65, 0x4a, 0x67, 0x32, 0x37, 0x44, 0x69, 0x7a, 0x39, 0x54, 0x66, 0x6c, 0x71, 0x63, + 0x31, 0x30, 0x71, 0x6d, 0x55, 0x41, 0x2b, 0x33, 0x47, 0x59, 0x46, 0x6c, 0x77, 0x78, 0x54, 0x37, 0x4d, 0x43, 0x0a, + 0x6f, 0x6e, 0x61, 0x35, 0x70, 0x73, 0x74, 0x6e, 0x68, 0x64, 0x76, 0x4f, 0x56, 0x77, 0x38, 0x42, 0x42, 0x38, + 0x70, 0x55, 0x6e, 0x57, 0x6c, 0x55, 0x63, 0x37, 0x62, 0x39, 0x55, 0x65, 0x44, 0x37, 0x74, 0x6f, 0x57, 0x76, + 0x58, 0x35, 0x4a, 0x54, 0x6d, 0x72, 0x43, 0x6f, 0x4f, 0x52, 0x61, 0x31, 0x4f, 0x49, 0x66, 0x2b, 0x75, 0x7a, + 0x44, 0x61, 0x71, 0x41, 0x6a, 0x56, 0x54, 0x72, 0x65, 0x78, 0x2f, 0x6f, 0x64, 0x6d, 0x50, 0x4c, 0x68, 0x74, 0x0a, + 0x52, 0x55, 0x35, 0x62, 0x69, 0x59, 0x75, 0x61, 0x49, 0x5a, 0x74, 0x76, 0x73, 0x77, 0x36, 0x6a, 0x2f, 0x67, + 0x42, 0x2f, 0x57, 0x61, 0x62, 0x71, 0x7a, 0x45, 0x69, 0x31, 0x44, 0x65, 0x44, 0x66, 0x67, 0x43, 0x2f, 0x61, + 0x46, 0x75, 0x35, 0x6f, 0x43, 0x6e, 0x6a, 0x66, 0x4d, 0x71, 0x30, 0x56, 0x45, 0x4c, 0x58, 0x42, 0x2b, 0x35, + 0x59, 0x35, 0x35, 0x37, 0x4a, 0x38, 0x45, 0x58, 0x69, 0x78, 0x54, 0x4e, 0x57, 0x5a, 0x6b, 0x57, 0x6f, 0x62, 0x0a, + 0x41, 0x4d, 0x43, 0x6e, 0x4d, 0x55, 0x5a, 0x67, 0x78, 0x5a, 0x55, 0x64, 0x50, 0x68, 0x73, 0x31, 0x4e, 0x53, + 0x67, 0x53, 0x7a, 0x73, 0x5a, 0x4f, 0x33, 0x2b, 0x57, 0x41, 0x44, 0x7a, 0x41, 0x61, 0x2b, 0x48, 0x53, 0x5a, + 0x71, 0x6a, 0x4d, 0x72, 0x53, 0x54, 0x41, 0x41, 0x67, 0x45, 0x2b, 0x36, 0x46, 0x4c, 0x36, 0x78, 0x4f, 0x2b, + 0x65, 0x79, 0x66, 0x62, 0x49, 0x51, 0x46, 0x57, 0x56, 0x70, 0x61, 0x38, 0x43, 0x4e, 0x37, 0x71, 0x74, 0x61, 0x0a, + 0x6e, 0x54, 0x51, 0x51, 0x46, 0x30, 0x6b, 0x78, 0x67, 0x4e, 0x64, 0x77, 0x6d, 0x42, 0x58, 0x49, 0x65, 0x50, + 0x41, 0x62, 0x4b, 0x33, 0x4f, 0x30, 0x32, 0x4a, 0x2b, 0x67, 0x49, 0x6b, 0x52, 0x46, 0x61, 0x4d, 0x6d, 0x61, + 0x74, 0x75, 0x6e, 0x59, 0x37, 0x33, 0x38, 0x49, 0x6f, 0x34, 0x47, 0x4b, 0x55, 0x33, 0x55, 0x44, 0x2b, 0x4d, + 0x5a, 0x62, 0x6a, 0x59, 0x55, 0x66, 0x48, 0x38, 0x58, 0x68, 0x6f, 0x4d, 0x4e, 0x35, 0x44, 0x51, 0x45, 0x66, 0x0a, + 0x57, 0x44, 0x57, 0x6c, 0x51, 0x55, 0x47, 0x52, 0x47, 0x4c, 0x49, 0x65, 0x66, 0x47, 0x44, 0x56, 0x6c, 0x47, + 0x76, 0x69, 0x57, 0x6b, 0x56, 0x48, 0x2f, 0x59, 0x75, 0x70, 0x75, 0x67, 0x48, 0x41, 0x4e, 0x42, 0x50, 0x34, + 0x49, 0x2b, 0x43, 0x55, 0x37, 0x66, 0x75, 0x57, 0x74, 0x41, 0x54, 0x63, 0x75, 0x6c, 0x79, 0x44, 0x67, 0x69, + 0x49, 0x5a, 0x33, 0x4c, 0x6f, 0x38, 0x78, 0x78, 0x4b, 0x33, 0x71, 0x65, 0x70, 0x54, 0x6d, 0x44, 0x5a, 0x66, 0x0a, + 0x4e, 0x52, 0x4a, 0x68, 0x41, 0x43, 0x45, 0x4f, 0x41, 0x52, 0x39, 0x7a, 0x65, 0x63, 0x50, 0x61, 0x42, 0x62, + 0x37, 0x72, 0x50, 0x4b, 0x73, 0x51, 0x73, 0x58, 0x50, 0x39, 0x6b, 0x68, 0x78, 0x72, 0x33, 0x54, 0x65, 0x79, + 0x2b, 0x52, 0x69, 0x6d, 0x7a, 0x56, 0x65, 0x4e, 0x78, 0x42, 0x68, 0x41, 0x4b, 0x41, 0x70, 0x34, 0x44, 0x6f, + 0x66, 0x78, 0x41, 0x49, 0x44, 0x4e, 0x69, 0x7a, 0x51, 0x7a, 0x49, 0x4b, 0x72, 0x48, 0x78, 0x6b, 0x37, 0x66, 0x0a, + 0x64, 0x59, 0x6b, 0x76, 0x6d, 0x44, 0x62, 0x2b, 0x58, 0x42, 0x6d, 0x71, 0x34, 0x30, 0x52, 0x69, 0x44, 0x41, + 0x43, 0x69, 0x6a, 0x77, 0x63, 0x41, 0x62, 0x46, 0x32, 0x57, 0x6f, 0x30, 0x66, 0x48, 0x6a, 0x59, 0x73, 0x4b, + 0x30, 0x39, 0x50, 0x75, 0x73, 0x39, 0x55, 0x39, 0x4e, 0x36, 0x57, 0x71, 0x2f, 0x66, 0x34, 0x77, 0x69, 0x54, + 0x49, 0x41, 0x75, 0x47, 0x67, 0x38, 0x34, 0x4c, 0x44, 0x74, 0x2b, 0x7a, 0x7a, 0x67, 0x2f, 0x53, 0x74, 0x79, 0x0a, + 0x72, 0x47, 0x72, 0x54, 0x39, 0x4b, 0x43, 0x6f, 0x44, 0x4b, 0x76, 0x61, 0x41, 0x74, 0x37, 0x76, 0x76, 0x6c, + 0x44, 0x74, 0x4d, 0x50, 0x6c, 0x2b, 0x66, 0x36, 0x69, 0x74, 0x56, 0x34, 0x33, 0x45, 0x47, 0x55, 0x43, 0x49, + 0x51, 0x38, 0x42, 0x2f, 0x63, 0x6e, 0x6d, 0x44, 0x6d, 0x52, 0x36, 0x63, 0x63, 0x6c, 0x31, 0x34, 0x49, 0x59, + 0x51, 0x7a, 0x4b, 0x2b, 0x59, 0x46, 0x2f, 0x4d, 0x62, 0x4b, 0x4b, 0x64, 0x66, 0x70, 0x50, 0x6a, 0x42, 0x74, 0x0a, + 0x2b, 0x6c, 0x44, 0x73, 0x46, 0x59, 0x70, 0x49, 0x49, 0x67, 0x30, 0x67, 0x35, 0x49, 0x7a, 0x2f, 0x48, 0x37, + 0x6a, 0x4c, 0x35, 0x62, 0x32, 0x46, 0x71, 0x52, 0x67, 0x6c, 0x43, 0x6f, 0x6c, 0x79, 0x73, 0x62, 0x51, 0x31, + 0x38, 0x68, 0x54, 0x30, 0x58, 0x5a, 0x67, 0x32, 0x6e, 0x59, 0x69, 0x6e, 0x50, 0x79, 0x54, 0x55, 0x41, 0x47, + 0x44, 0x61, 0x42, 0x2f, 0x54, 0x50, 0x77, 0x4a, 0x2b, 0x34, 0x76, 0x44, 0x66, 0x72, 0x77, 0x5a, 0x32, 0x72, 0x0a, + 0x46, 0x41, 0x6d, 0x49, 0x2b, 0x46, 0x6b, 0x78, 0x4c, 0x2b, 0x44, 0x4f, 0x61, 0x4f, 0x4c, 0x2f, 0x45, 0x30, + 0x78, 0x62, 0x54, 0x6f, 0x7a, 0x34, 0x49, 0x63, 0x45, 0x47, 0x41, 0x4e, 0x4d, 0x2b, 0x71, 0x43, 0x38, 0x42, + 0x58, 0x33, 0x46, 0x35, 0x62, 0x32, 0x50, 0x47, 0x52, 0x41, 0x49, 0x61, 0x45, 0x78, 0x42, 0x78, 0x73, 0x61, + 0x72, 0x4e, 0x50, 0x50, 0x6b, 0x6a, 0x62, 0x46, 0x6e, 0x2f, 0x46, 0x66, 0x4c, 0x37, 0x2b, 0x69, 0x64, 0x4a, 0x0a, + 0x2f, 0x4a, 0x42, 0x77, 0x41, 0x34, 0x42, 0x70, 0x48, 0x39, 0x67, 0x44, 0x57, 0x47, 0x34, 0x6f, 0x57, 0x69, + 0x44, 0x72, 0x77, 0x57, 0x2b, 0x75, 0x6e, 0x4e, 0x4c, 0x73, 0x67, 0x43, 0x69, 0x5a, 0x6e, 0x6e, 0x61, 0x66, + 0x33, 0x31, 0x77, 0x5a, 0x36, 0x63, 0x6d, 0x2f, 0x45, 0x39, 0x4e, 0x32, 0x45, 0x79, 0x64, 0x2b, 0x71, 0x41, + 0x45, 0x44, 0x67, 0x49, 0x74, 0x6d, 0x42, 0x6e, 0x37, 0x69, 0x38, 0x74, 0x36, 0x4d, 0x42, 0x37, 0x65, 0x74, 0x0a, + 0x7a, 0x48, 0x48, 0x56, 0x51, 0x70, 0x6d, 0x41, 0x69, 0x4d, 0x5a, 0x56, 0x43, 0x33, 0x31, 0x75, 0x63, 0x38, + 0x2f, 0x76, 0x42, 0x39, 0x4e, 0x57, 0x45, 0x7a, 0x50, 0x69, 0x50, 0x78, 0x4d, 0x31, 0x59, 0x51, 0x41, 0x68, + 0x6a, 0x67, 0x4b, 0x2f, 0x42, 0x2b, 0x78, 0x78, 0x65, 0x56, 0x50, 0x68, 0x7a, 0x45, 0x46, 0x6c, 0x44, 0x41, + 0x70, 0x58, 0x72, 0x6c, 0x2b, 0x53, 0x63, 0x7a, 0x33, 0x44, 0x72, 0x38, 0x41, 0x65, 0x54, 0x46, 0x73, 0x39, 0x0a, + 0x47, 0x6e, 0x65, 0x64, 0x34, 0x71, 0x52, 0x6d, 0x44, 0x43, 0x44, 0x6b, 0x6f, 0x49, 0x63, 0x77, 0x55, 0x79, + 0x6c, 0x76, 0x75, 0x64, 0x35, 0x6a, 0x38, 0x79, 0x4b, 0x66, 0x32, 0x31, 0x64, 0x71, 0x56, 0x79, 0x45, 0x78, + 0x4e, 0x31, 0x6b, 0x50, 0x62, 0x6c, 0x2b, 0x5a, 0x69, 0x35, 0x4c, 0x68, 0x42, 0x36, 0x5a, 0x74, 0x76, 0x6a, + 0x76, 0x64, 0x6c, 0x39, 0x53, 0x6e, 0x50, 0x39, 0x53, 0x51, 0x41, 0x63, 0x43, 0x30, 0x44, 0x2f, 0x49, 0x41, 0x0a, + 0x38, 0x4e, 0x73, 0x34, 0x4a, 0x41, 0x6f, 0x56, 0x36, 0x47, 0x6e, 0x33, 0x32, 0x58, 0x37, 0x35, 0x46, 0x4b, + 0x30, 0x4e, 0x63, 0x64, 0x5a, 0x4d, 0x31, 0x42, 0x4f, 0x74, 0x44, 0x62, 0x44, 0x39, 0x38, 0x73, 0x68, 0x6a, + 0x52, 0x34, 0x63, 0x78, 0x62, 0x66, 0x4d, 0x41, 0x4a, 0x46, 0x76, 0x38, 0x55, 0x47, 0x4d, 0x47, 0x41, 0x42, + 0x65, 0x5a, 0x77, 0x41, 0x65, 0x49, 0x45, 0x41, 0x6b, 0x73, 0x61, 0x51, 0x6e, 0x34, 0x38, 0x42, 0x72, 0x6c, 0x0a, + 0x43, 0x6f, 0x69, 0x4c, 0x57, 0x64, 0x70, 0x71, 0x32, 0x6f, 0x62, 0x6a, 0x71, 0x72, 0x34, 0x43, 0x62, 0x32, + 0x48, 0x61, 0x5a, 0x45, 0x32, 0x49, 0x48, 0x32, 0x72, 0x51, 0x41, 0x47, 0x44, 0x61, 0x42, 0x37, 0x73, 0x66, + 0x34, 0x37, 0x5a, 0x4f, 0x59, 0x77, 0x4a, 0x67, 0x39, 0x68, 0x50, 0x59, 0x76, 0x6e, 0x70, 0x4b, 0x69, 0x34, + 0x6a, 0x45, 0x75, 0x32, 0x7a, 0x73, 0x39, 0x4e, 0x6d, 0x2b, 0x32, 0x6e, 0x6b, 0x39, 0x66, 0x34, 0x45, 0x39, 0x0a, + 0x6d, 0x4c, 0x61, 0x34, 0x48, 0x32, 0x70, 0x44, 0x2f, 0x46, 0x43, 0x6a, 0x42, 0x67, 0x41, 0x58, 0x52, 0x51, + 0x49, 0x66, 0x77, 0x58, 0x46, 0x32, 0x41, 0x4d, 0x77, 0x4d, 0x77, 0x55, 0x33, 0x4c, 0x63, 0x6d, 0x78, 0x62, + 0x72, 0x6e, 0x47, 0x42, 0x4e, 0x4a, 0x50, 0x31, 0x59, 0x4e, 0x76, 0x79, 0x48, 0x44, 0x65, 0x35, 0x6e, 0x64, + 0x73, 0x58, 0x35, 0x69, 0x65, 0x59, 0x4e, 0x6c, 0x67, 0x7a, 0x54, 0x2f, 0x34, 0x43, 0x4e, 0x57, 0x73, 0x41, 0x0a, + 0x63, 0x4e, 0x48, 0x41, 0x34, 0x4d, 0x64, 0x77, 0x7a, 0x42, 0x4d, 0x6f, 0x73, 0x4b, 0x37, 0x44, 0x35, 0x36, + 0x36, 0x65, 0x4b, 0x52, 0x62, 0x72, 0x33, 0x49, 0x48, 0x55, 0x73, 0x61, 0x67, 0x6c, 0x34, 0x4b, 0x36, 0x65, + 0x4b, 0x64, 0x61, 0x35, 0x62, 0x65, 0x41, 0x5a, 0x5a, 0x69, 0x65, 0x68, 0x64, 0x66, 0x32, 0x31, 0x4a, 0x48, + 0x36, 0x6f, 0x63, 0x51, 0x4f, 0x41, 0x61, 0x52, 0x2f, 0x34, 0x55, 0x55, 0x77, 0x49, 0x35, 0x70, 0x51, 0x78, 0x0a, + 0x57, 0x4b, 0x43, 0x6a, 0x4b, 0x65, 0x42, 0x44, 0x6c, 0x30, 0x39, 0x46, 0x48, 0x66, 0x55, 0x56, 0x4e, 0x63, + 0x6a, 0x6d, 0x52, 0x54, 0x36, 0x2f, 0x63, 0x2f, 0x6c, 0x55, 0x4b, 0x63, 0x66, 0x51, 0x66, 0x77, 0x58, 0x54, + 0x35, 0x6f, 0x35, 0x43, 0x37, 0x59, 0x6b, 0x66, 0x6f, 0x43, 0x37, 0x47, 0x77, 0x67, 0x73, 0x66, 0x2f, 0x44, + 0x30, 0x62, 0x4a, 0x73, 0x46, 0x6b, 0x58, 0x66, 0x30, 0x53, 0x2b, 0x4c, 0x4c, 0x72, 0x66, 0x54, 0x4b, 0x65, 0x0a, + 0x6d, 0x66, 0x65, 0x39, 0x62, 0x4c, 0x37, 0x50, 0x63, 0x79, 0x65, 0x79, 0x6e, 0x4a, 0x39, 0x53, 0x76, 0x36, + 0x41, 0x65, 0x6d, 0x64, 0x63, 0x51, 0x73, 0x47, 0x31, 0x46, 0x72, 0x74, 0x53, 0x31, 0x49, 0x76, 0x38, 0x64, + 0x65, 0x41, 0x78, 0x71, 0x55, 0x2f, 0x67, 0x46, 0x61, 0x6a, 0x34, 0x43, 0x43, 0x42, 0x50, 0x36, 0x49, 0x68, + 0x37, 0x44, 0x63, 0x52, 0x56, 0x68, 0x6d, 0x47, 0x58, 0x7a, 0x41, 0x75, 0x35, 0x65, 0x4f, 0x36, 0x58, 0x73, 0x0a, + 0x77, 0x54, 0x72, 0x6b, 0x71, 0x6f, 0x55, 0x2b, 0x64, 0x36, 0x38, 0x74, 0x65, 0x61, 0x48, 0x59, 0x58, 0x64, + 0x53, 0x42, 0x2b, 0x4b, 0x48, 0x4f, 0x44, 0x41, 0x41, 0x75, 0x57, 0x6b, 0x56, 0x34, 0x41, 0x78, 0x46, 0x79, + 0x42, 0x63, 0x41, 0x73, 0x4a, 0x74, 0x72, 0x61, 0x6e, 0x65, 0x4e, 0x44, 0x70, 0x59, 0x57, 0x49, 0x49, 0x69, + 0x45, 0x55, 0x75, 0x6e, 0x68, 0x62, 0x75, 0x35, 0x31, 0x50, 0x36, 0x51, 0x31, 0x7a, 0x47, 0x4e, 0x4f, 0x6d, 0x0a, + 0x45, 0x72, 0x65, 0x71, 0x4c, 0x79, 0x70, 0x31, 0x5a, 0x77, 0x42, 0x77, 0x30, 0x58, 0x34, 0x43, 0x37, 0x38, + 0x64, 0x78, 0x65, 0x37, 0x45, 0x77, 0x53, 0x31, 0x73, 0x44, 0x50, 0x74, 0x49, 0x7a, 0x78, 0x58, 0x57, 0x4c, + 0x66, 0x63, 0x30, 0x55, 0x31, 0x43, 0x42, 0x5a, 0x44, 0x36, 0x35, 0x62, 0x37, 0x50, 0x4f, 0x52, 0x6e, 0x70, + 0x4c, 0x7a, 0x50, 0x6e, 0x5a, 0x68, 0x32, 0x6c, 0x4b, 0x69, 0x31, 0x76, 0x4f, 0x58, 0x53, 0x6c, 0x30, 0x61, 0x0a, + 0x41, 0x46, 0x77, 0x30, 0x51, 0x2f, 0x42, 0x62, 0x4f, 0x47, 0x34, 0x30, 0x47, 0x69, 0x62, 0x6a, 0x77, 0x5a, + 0x62, 0x46, 0x4f, 0x65, 0x35, 0x65, 0x4f, 0x38, 0x55, 0x56, 0x37, 0x6a, 0x75, 0x2f, 0x69, 0x69, 0x70, 0x78, + 0x78, 0x51, 0x49, 0x54, 0x37, 0x6d, 0x39, 0x5a, 0x48, 0x48, 0x6c, 0x36, 0x72, 0x38, 0x42, 0x44, 0x6d, 0x44, + 0x5a, 0x30, 0x43, 0x4f, 0x70, 0x48, 0x2f, 0x46, 0x41, 0x6e, 0x67, 0x34, 0x43, 0x7a, 0x55, 0x54, 0x51, 0x34, 0x0a, + 0x2b, 0x43, 0x6a, 0x77, 0x41, 0x76, 0x42, 0x74, 0x59, 0x48, 0x6d, 0x55, 0x2b, 0x37, 0x55, 0x31, 0x6d, 0x6a, + 0x33, 0x67, 0x72, 0x6c, 0x72, 0x6f, 0x38, 0x35, 0x50, 0x65, 0x4c, 0x47, 0x66, 0x47, 0x46, 0x42, 0x49, 0x6b, + 0x6b, 0x55, 0x55, 0x74, 0x41, 0x54, 0x66, 0x46, 0x63, 0x33, 0x7a, 0x63, 0x4b, 0x63, 0x77, 0x55, 0x33, 0x33, + 0x4e, 0x51, 0x58, 0x38, 0x49, 0x76, 0x55, 0x4c, 0x63, 0x52, 0x51, 0x4a, 0x69, 0x69, 0x4c, 0x63, 0x64, 0x76, 0x0a, + 0x6f, 0x6f, 0x51, 0x75, 0x41, 0x56, 0x78, 0x49, 0x46, 0x39, 0x32, 0x32, 0x33, 0x50, 0x6e, 0x30, 0x56, 0x31, + 0x46, 0x47, 0x4f, 0x70, 0x6f, 0x43, 0x74, 0x69, 0x33, 0x50, 0x78, 0x5a, 0x58, 0x6d, 0x76, 0x51, 0x76, 0x34, + 0x44, 0x39, 0x53, 0x78, 0x2b, 0x43, 0x45, 0x6c, 0x42, 0x67, 0x44, 0x78, 0x64, 0x67, 0x6b, 0x4b, 0x72, 0x4f, + 0x76, 0x77, 0x2b, 0x64, 0x32, 0x31, 0x55, 0x39, 0x79, 0x36, 0x50, 0x45, 0x64, 0x37, 0x6f, 0x34, 0x79, 0x67, 0x0a, + 0x57, 0x72, 0x51, 0x33, 0x6d, 0x68, 0x4f, 0x69, 0x66, 0x6e, 0x64, 0x74, 0x53, 0x51, 0x6b, 0x39, 0x59, 0x65, + 0x6f, 0x32, 0x35, 0x43, 0x2b, 0x6d, 0x72, 0x72, 0x73, 0x41, 0x78, 0x63, 0x7a, 0x51, 0x4a, 0x66, 0x68, 0x6e, + 0x34, 0x45, 0x6e, 0x67, 0x66, 0x56, 0x48, 0x76, 0x36, 0x57, 0x47, 0x4f, 0x4c, 0x46, 0x2f, 0x58, 0x34, 0x62, + 0x4e, 0x76, 0x49, 0x4d, 0x50, 0x72, 0x2f, 0x52, 0x6b, 0x47, 0x4a, 0x39, 0x51, 0x31, 0x71, 0x41, 0x51, 0x64, 0x0a, + 0x54, 0x51, 0x48, 0x58, 0x64, 0x50, 0x6d, 0x73, 0x37, 0x2f, 0x53, 0x6a, 0x72, 0x4e, 0x65, 0x66, 0x69, 0x58, + 0x2f, 0x44, 0x62, 0x4f, 0x43, 0x78, 0x46, 0x2b, 0x70, 0x62, 0x2b, 0x41, 0x56, 0x53, 0x45, 0x77, 0x47, 0x45, + 0x43, 0x58, 0x32, 0x78, 0x65, 0x34, 0x47, 0x62, 0x67, 0x53, 0x2b, 0x57, 0x65, 0x6b, 0x38, 0x50, 0x32, 0x4e, + 0x42, 0x70, 0x42, 0x70, 0x33, 0x75, 0x75, 0x43, 0x78, 0x48, 0x74, 0x31, 0x59, 0x61, 0x6c, 0x6f, 0x33, 0x75, 0x0a, + 0x31, 0x6f, 0x41, 0x37, 0x4c, 0x6a, 0x4f, 0x44, 0x73, 0x68, 0x76, 0x69, 0x45, 0x2f, 0x38, 0x58, 0x4d, 0x57, + 0x30, 0x68, 0x4e, 0x65, 0x4b, 0x48, 0x6c, 0x45, 0x55, 0x41, 0x59, 0x59, 0x71, 0x69, 0x67, 0x55, 0x38, 0x44, + 0x4f, 0x34, 0x43, 0x2f, 0x41, 0x50, 0x35, 0x6a, 0x71, 0x66, 0x64, 0x65, 0x33, 0x65, 0x61, 0x7a, 0x75, 0x73, + 0x32, 0x6e, 0x62, 0x38, 0x7a, 0x6a, 0x39, 0x66, 0x34, 0x4d, 0x68, 0x38, 0x35, 0x6c, 0x38, 0x4f, 0x55, 0x48, 0x0a, + 0x4a, 0x5a, 0x48, 0x78, 0x7a, 0x46, 0x34, 0x4f, 0x56, 0x33, 0x66, 0x35, 0x55, 0x5a, 0x66, 0x71, 0x7a, 0x73, + 0x62, 0x33, 0x4d, 0x64, 0x2f, 0x37, 0x69, 0x35, 0x41, 0x65, 0x34, 0x52, 0x64, 0x49, 0x72, 0x51, 0x45, 0x55, + 0x2b, 0x4d, 0x5a, 0x62, 0x6a, 0x51, 0x55, 0x54, 0x65, 0x42, 0x47, 0x34, 0x45, 0x2f, 0x67, 0x73, 0x38, 0x45, + 0x67, 0x63, 0x39, 0x31, 0x37, 0x53, 0x45, 0x6e, 0x44, 0x62, 0x69, 0x68, 0x7a, 0x6a, 0x75, 0x52, 0x78, 0x76, 0x0a, + 0x44, 0x32, 0x5a, 0x34, 0x61, 0x30, 0x44, 0x64, 0x41, 0x31, 0x63, 0x36, 0x6d, 0x67, 0x49, 0x32, 0x64, 0x50, + 0x70, 0x63, 0x32, 0x65, 0x48, 0x54, 0x6e, 0x49, 0x33, 0x39, 0x39, 0x67, 0x38, 0x52, 0x4f, 0x71, 0x49, 0x72, + 0x62, 0x65, 0x49, 0x48, 0x47, 0x51, 0x41, 0x77, 0x34, 0x39, 0x6a, 0x41, 0x64, 0x34, 0x44, 0x2f, 0x41, 0x58, + 0x77, 0x69, 0x6a, 0x76, 0x73, 0x33, 0x5a, 0x2b, 0x47, 0x61, 0x4c, 0x70, 0x39, 0x72, 0x75, 0x6e, 0x78, 0x36, 0x0a, + 0x52, 0x7a, 0x33, 0x32, 0x44, 0x32, 0x59, 0x34, 0x66, 0x43, 0x37, 0x44, 0x75, 0x4c, 0x59, 0x6f, 0x6e, 0x4a, + 0x48, 0x6d, 0x4c, 0x46, 0x7a, 0x65, 0x37, 0x76, 0x4e, 0x72, 0x48, 0x58, 0x36, 0x35, 0x75, 0x6c, 0x4a, 0x66, + 0x42, 0x2f, 0x36, 0x47, 0x47, 0x6c, 0x75, 0x37, 0x58, 0x77, 0x35, 0x6b, 0x41, 0x43, 0x46, 0x43, 0x30, 0x63, + 0x42, 0x2b, 0x34, 0x46, 0x35, 0x4d, 0x74, 0x2b, 0x42, 0x2b, 0x59, 0x48, 0x74, 0x63, 0x66, 0x36, 0x4f, 0x37, 0x0a, + 0x4e, 0x61, 0x43, 0x37, 0x4e, 0x63, 0x66, 0x4e, 0x79, 0x33, 0x49, 0x63, 0x47, 0x2f, 0x5a, 0x34, 0x35, 0x31, + 0x79, 0x47, 0x49, 0x2b, 0x63, 0x79, 0x54, 0x4b, 0x51, 0x38, 0x76, 0x36, 0x67, 0x70, 0x41, 0x36, 0x76, 0x62, + 0x66, 0x64, 0x61, 0x32, 0x2b, 0x31, 0x7a, 0x57, 0x46, 0x73, 0x54, 0x56, 0x72, 0x79, 0x39, 0x6d, 0x4a, 0x2f, + 0x41, 0x45, 0x38, 0x48, 0x54, 0x68, 0x46, 0x32, 0x6b, 0x57, 0x50, 0x38, 0x67, 0x41, 0x4c, 0x71, 0x49, 0x6f, 0x0a, + 0x47, 0x6e, 0x67, 0x36, 0x66, 0x2f, 0x30, 0x70, 0x78, 0x67, 0x68, 0x36, 0x34, 0x76, 0x6f, 0x37, 0x48, 0x75, + 0x61, 0x67, 0x69, 0x56, 0x56, 0x74, 0x4f, 0x66, 0x78, 0x6c, 0x4f, 0x59, 0x36, 0x50, 0x65, 0x42, 0x77, 0x66, + 0x79, 0x58, 0x42, 0x30, 0x78, 0x47, 0x4d, 0x6f, 0x4a, 0x64, 0x32, 0x45, 0x39, 0x73, 0x61, 0x41, 0x31, 0x57, + 0x30, 0x42, 0x4b, 0x2b, 0x66, 0x37, 0x72, 0x4a, 0x77, 0x66, 0x6c, 0x4a, 0x71, 0x74, 0x64, 0x79, 0x6b, 0x4f, 0x0a, + 0x59, 0x6f, 0x54, 0x2f, 0x74, 0x34, 0x56, 0x66, 0x70, 0x46, 0x33, 0x34, 0x42, 0x57, 0x51, 0x41, 0x73, 0x31, + 0x42, 0x6b, 0x42, 0x48, 0x38, 0x4c, 0x2f, 0x42, 0x33, 0x77, 0x49, 0x44, 0x47, 0x4e, 0x44, 0x34, 0x54, 0x4a, + 0x65, 0x42, 0x66, 0x4d, 0x34, 0x45, 0x5a, 0x67, 0x65, 0x4e, 0x4c, 0x6a, 0x36, 0x49, 0x6a, 0x48, 0x73, 0x57, + 0x47, 0x50, 0x55, 0x36, 0x4d, 0x5a, 0x78, 0x75, 0x71, 0x6b, 0x71, 0x39, 0x43, 0x53, 0x68, 0x61, 0x57, 0x74, 0x0a, + 0x50, 0x69, 0x76, 0x6d, 0x47, 0x2b, 0x46, 0x58, 0x4b, 0x48, 0x66, 0x69, 0x49, 0x65, 0x44, 0x7a, 0x67, 0x41, + 0x38, 0x53, 0x66, 0x6a, 0x45, 0x79, 0x67, 0x44, 0x6b, 0x49, 0x64, 0x51, 0x74, 0x38, 0x7a, 0x50, 0x6a, 0x41, + 0x34, 0x38, 0x41, 0x66, 0x41, 0x35, 0x38, 0x70, 0x31, 0x39, 0x39, 0x73, 0x61, 0x77, 0x7a, 0x59, 0x32, 0x42, + 0x6d, 0x77, 0x73, 0x52, 0x4d, 0x67, 0x78, 0x39, 0x43, 0x45, 0x52, 0x2b, 0x2b, 0x6f, 0x78, 0x36, 0x2f, 0x4f, 0x0a, + 0x65, 0x35, 0x77, 0x65, 0x38, 0x7a, 0x67, 0x37, 0x58, 0x68, 0x73, 0x52, 0x77, 0x73, 0x4c, 0x6d, 0x67, 0x4d, + 0x55, 0x74, 0x41, 0x63, 0x76, 0x6e, 0x42, 0x58, 0x53, 0x33, 0x42, 0x69, 0x79, 0x6f, 0x62, 0x4e, 0x62, 0x6b, + 0x35, 0x7a, 0x44, 0x48, 0x63, 0x66, 0x55, 0x58, 0x66, 0x69, 0x48, 0x78, 0x58, 0x34, 0x77, 0x4d, 0x77, 0x49, + 0x4b, 0x69, 0x61, 0x4b, 0x41, 0x66, 0x4d, 0x31, 0x50, 0x77, 0x4a, 0x65, 0x43, 0x54, 0x6d, 0x4b, 0x37, 0x42, 0x0a, + 0x73, 0x6e, 0x4c, 0x2b, 0x2f, 0x51, 0x56, 0x4e, 0x52, 0x6a, 0x78, 0x58, 0x64, 0x6c, 0x7a, 0x34, 0x33, 0x63, + 0x43, 0x34, 0x78, 0x37, 0x6c, 0x4a, 0x47, 0x4a, 0x72, 0x30, 0x47, 0x42, 0x6a, 0x33, 0x36, 0x42, 0x38, 0x33, + 0x58, 0x59, 0x64, 0x4b, 0x52, 0x77, 0x73, 0x74, 0x57, 0x56, 0x4f, 0x2f, 0x72, 0x75, 0x61, 0x41, 0x7a, 0x75, + 0x61, 0x41, 0x42, 0x59, 0x30, 0x42, 0x37, 0x59, 0x33, 0x51, 0x32, 0x56, 0x79, 0x56, 0x65, 0x63, 0x2b, 0x54, 0x0a, + 0x6d, 0x46, 0x44, 0x2f, 0x63, 0x53, 0x52, 0x38, 0x4b, 0x32, 0x51, 0x41, 0x44, 0x73, 0x78, 0x67, 0x42, 0x49, + 0x2f, 0x6d, 0x72, 0x2f, 0x73, 0x77, 0x52, 0x72, 0x43, 0x70, 0x55, 0x6e, 0x58, 0x70, 0x62, 0x41, 0x37, 0x6f, + 0x62, 0x41, 0x61, 0x59, 0x4c, 0x72, 0x51, 0x4a, 0x48, 0x34, 0x59, 0x6d, 0x50, 0x50, 0x72, 0x48, 0x50, 0x45, + 0x5a, 0x7a, 0x70, 0x6a, 0x73, 0x42, 0x35, 0x6e, 0x65, 0x46, 0x67, 0x63, 0x5a, 0x4a, 0x6e, 0x31, 0x6d, 0x6e, 0x0a, + 0x49, 0x78, 0x63, 0x32, 0x42, 0x39, 0x4f, 0x57, 0x50, 0x52, 0x65, 0x2f, 0x37, 0x6d, 0x6f, 0x4a, 0x79, 0x4f, + 0x62, 0x2f, 0x75, 0x36, 0x41, 0x70, 0x6f, 0x43, 0x6b, 0x5a, 0x71, 0x57, 0x52, 0x37, 0x4d, 0x63, 0x4c, 0x2f, + 0x61, 0x76, 0x69, 0x58, 0x45, 0x76, 0x37, 0x63, 0x79, 0x41, 0x41, 0x69, 0x45, 0x47, 0x35, 0x59, 0x65, 0x54, + 0x50, 0x34, 0x61, 0x76, 0x37, 0x36, 0x45, 0x4d, 0x59, 0x49, 0x37, 0x71, 0x78, 0x4b, 0x78, 0x54, 0x43, 0x6a, 0x0a, + 0x36, 0x59, 0x74, 0x62, 0x67, 0x72, 0x52, 0x73, 0x63, 0x4b, 0x70, 0x52, 0x2f, 0x52, 0x4c, 0x78, 0x67, 0x71, + 0x43, 0x30, 0x68, 0x76, 0x4c, 0x45, 0x4b, 0x2b, 0x4d, 0x78, 0x56, 0x61, 0x57, 0x75, 0x36, 0x41, 0x45, 0x2b, + 0x44, 0x76, 0x77, 0x42, 0x5a, 0x65, 0x34, 0x65, 0x70, 0x4a, 0x43, 0x54, 0x77, 0x4e, 0x65, 0x41, 0x62, 0x32, + 0x4a, 0x47, 0x39, 0x31, 0x50, 0x4e, 0x2f, 0x56, 0x75, 0x61, 0x53, 0x33, 0x70, 0x2f, 0x4d, 0x67, 0x4b, 0x34, 0x0a, + 0x2b, 0x75, 0x4d, 0x67, 0x38, 0x44, 0x42, 0x6d, 0x33, 0x34, 0x48, 0x66, 0x42, 0x70, 0x36, 0x71, 0x62, 0x6e, + 0x58, 0x71, 0x67, 0x71, 0x63, 0x77, 0x6e, 0x2b, 0x56, 0x79, 0x7a, 0x47, 0x65, 0x62, 0x65, 0x76, 0x48, 0x48, + 0x67, 0x62, 0x6f, 0x41, 0x35, 0x57, 0x64, 0x6e, 0x2f, 0x75, 0x72, 0x43, 0x64, 0x41, 0x30, 0x2b, 0x43, 0x76, + 0x78, 0x4f, 0x56, 0x57, 0x74, 0x55, 0x4f, 0x33, 0x77, 0x58, 0x6b, 0x35, 0x57, 0x35, 0x69, 0x39, 0x43, 0x67, 0x0a, + 0x6e, 0x6f, 0x67, 0x50, 0x47, 0x55, 0x44, 0x6c, 0x36, 0x41, 0x66, 0x2b, 0x49, 0x58, 0x38, 0x74, 0x41, 0x65, + 0x37, 0x49, 0x58, 0x39, 0x76, 0x7a, 0x72, 0x34, 0x58, 0x35, 0x6a, 0x4c, 0x34, 0x4c, 0x50, 0x4a, 0x4f, 0x2f, + 0x2b, 0x71, 0x70, 0x62, 0x6e, 0x66, 0x70, 0x48, 0x42, 0x6c, 0x41, 0x64, 0x2b, 0x72, 0x68, 0x67, 0x42, 0x6d, + 0x42, 0x6d, 0x44, 0x37, 0x5a, 0x6a, 0x49, 0x6f, 0x53, 0x62, 0x67, 0x66, 0x69, 0x58, 0x76, 0x53, 0x53, 0x54, 0x0a, + 0x48, 0x47, 0x61, 0x62, 0x74, 0x6d, 0x63, 0x78, 0x77, 0x6e, 0x2b, 0x31, 0x75, 0x74, 0x56, 0x4a, 0x48, 0x7a, + 0x4b, 0x41, 0x5a, 0x4c, 0x41, 0x33, 0x66, 0x2f, 0x31, 0x31, 0x2f, 0x76, 0x56, 0x57, 0x34, 0x42, 0x61, 0x4d, + 0x47, 0x57, 0x77, 0x46, 0x46, 0x6c, 0x65, 0x70, 0x58, 0x6e, 0x46, 0x7a, 0x47, 0x74, 0x69, 0x4e, 0x45, 0x66, + 0x33, 0x7a, 0x2b, 0x5a, 0x39, 0x46, 0x46, 0x5a, 0x45, 0x42, 0x4a, 0x4a, 0x50, 0x64, 0x2b, 0x61, 0x75, 0x77, 0x0a, + 0x55, 0x63, 0x6c, 0x36, 0x4c, 0x68, 0x6a, 0x43, 0x72, 0x77, 0x50, 0x58, 0x56, 0x4b, 0x6c, 0x65, 0x72, 0x72, + 0x77, 0x4f, 0x2f, 0x49, 0x77, 0x4c, 0x67, 0x74, 0x39, 0x58, 0x33, 0x65, 0x71, 0x49, 0x59, 0x6d, 0x51, 0x41, + 0x74, 0x63, 0x47, 0x2b, 0x2f, 0x50, 0x58, 0x31, 0x2f, 0x47, 0x73, 0x50, 0x75, 0x41, 0x6f, 0x7a, 0x33, 0x62, + 0x67, 0x75, 0x2f, 0x2f, 0x4f, 0x6d, 0x2f, 0x4d, 0x2b, 0x56, 0x6a, 0x68, 0x5a, 0x4f, 0x59, 0x34, 0x35, 0x69, 0x0a, + 0x32, 0x77, 0x75, 0x38, 0x6b, 0x66, 0x2f, 0x35, 0x59, 0x50, 0x37, 0x6e, 0x56, 0x43, 0x51, 0x6a, 0x31, 0x44, + 0x49, 0x79, 0x67, 0x4e, 0x6f, 0x6b, 0x41, 0x48, 0x36, 0x52, 0x76, 0x34, 0x72, 0x70, 0x78, 0x42, 0x6a, 0x42, + 0x74, 0x5a, 0x6a, 0x42, 0x78, 0x63, 0x49, 0x4b, 0x78, 0x6e, 0x56, 0x41, 0x49, 0x5a, 0x6d, 0x34, 0x44, 0x66, + 0x69, 0x31, 0x57, 0x65, 0x37, 0x39, 0x4f, 0x6a, 0x41, 0x52, 0x65, 0x72, 0x32, 0x33, 0x36, 0x50, 0x57, 0x72, 0x0a, + 0x2b, 0x64, 0x65, 0x76, 0x59, 0x73, 0x51, 0x2b, 0x34, 0x46, 0x35, 0x39, 0x6b, 0x52, 0x52, 0x6b, 0x41, 0x50, + 0x58, 0x48, 0x41, 0x50, 0x42, 0x79, 0x2f, 0x72, 0x6f, 0x55, 0x73, 0x36, 0x30, 0x6f, 0x30, 0x6c, 0x4d, 0x37, + 0x52, 0x63, 0x67, 0x41, 0x30, 0x6f, 0x75, 0x45, 0x4c, 0x70, 0x51, 0x4a, 0x4b, 0x45, 0x53, 0x61, 0x4b, 0x58, + 0x6b, 0x74, 0x67, 0x42, 0x43, 0x69, 0x64, 0x6c, 0x45, 0x45, 0x49, 0x45, 0x53, 0x4b, 0x6b, 0x51, 0x45, 0x49, 0x0a, + 0x6b, 0x57, 0x4a, 0x6b, 0x41, 0x45, 0x4b, 0x6b, 0x47, 0x42, 0x6d, 0x41, 0x45, 0x43, 0x6c, 0x47, 0x42, 0x69, + 0x42, 0x45, 0x69, 0x70, 0x45, 0x42, 0x43, 0x4a, 0x46, 0x69, 0x2f, 0x68, 0x30, 0x37, 0x77, 0x4f, 0x37, 0x35, + 0x36, 0x2f, 0x2b, 0x71, 0x74, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, + 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x31, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, + 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 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, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x43, 0x41, 0x59, 0x41, + 0x41, 0x41, 0x42, 0x7a, 0x65, 0x6e, 0x72, 0x30, 0x41, 0x41, 0x41, 0x42, 0x53, 0x45, 0x6c, 0x45, 0x51, 0x56, + 0x52, 0x59, 0x68, 0x65, 0x32, 0x57, 0x30, 0x57, 0x33, 0x43, 0x4d, 0x42, 0x43, 0x47, 0x76, 0x31, 0x53, 0x38, 0x0a, + 0x4e, 0x79, 0x4e, 0x55, 0x36, 0x67, 0x4b, 0x77, 0x51, 0x64, 0x6d, 0x6b, 0x33, 0x53, 0x42, 0x4d, 0x41, 0x45, + 0x78, 0x41, 0x6d, 0x51, 0x42, 0x31, 0x41, 0x74, 0x6f, 0x4a, 0x6d, 0x6b, 0x35, 0x51, 0x47, 0x41, 0x43, 0x4a, + 0x45, 0x63, 0x49, 0x45, 0x36, 0x59, 0x4d, 0x64, 0x39, 0x62, 0x42, 0x51, 0x66, 0x4f, 0x65, 0x6b, 0x53, 0x68, + 0x2f, 0x79, 0x50, 0x7a, 0x6d, 0x4f, 0x37, 0x66, 0x2f, 0x2f, 0x7a, 0x33, 0x65, 0x32, 0x73, 0x37, 0x71, 0x75, 0x0a, + 0x47, 0x52, 0x4a, 0x33, 0x67, 0x37, 0x4b, 0x50, 0x41, 0x6b, 0x59, 0x42, 0x2f, 0x30, 0x48, 0x41, 0x70, 0x4b, + 0x2b, 0x46, 0x54, 0x70, 0x66, 0x72, 0x37, 0x38, 0x64, 0x37, 0x33, 0x62, 0x7a, 0x4f, 0x45, 0x54, 0x68, 0x64, + 0x72, 0x73, 0x68, 0x58, 0x77, 0x4e, 0x51, 0x79, 0x58, 0x78, 0x57, 0x42, 0x30, 0x42, 0x30, 0x34, 0x68, 0x36, + 0x49, 0x2f, 0x42, 0x7a, 0x62, 0x41, 0x4d, 0x31, 0x44, 0x32, 0x4c, 0x73, 0x42, 0x6a, 0x41, 0x78, 0x77, 0x39, 0x0a, + 0x77, 0x54, 0x6b, 0x67, 0x2f, 0x38, 0x54, 0x6f, 0x50, 0x45, 0x56, 0x41, 0x44, 0x75, 0x78, 0x38, 0x2b, 0x2b, + 0x43, 0x46, 0x66, 0x50, 0x6d, 0x2b, 0x50, 0x49, 0x55, 0x63, 0x49, 0x4e, 0x50, 0x63, 0x42, 0x64, 0x37, 0x74, + 0x46, 0x50, 0x68, 0x57, 0x72, 0x44, 0x6b, 0x48, 0x79, 0x72, 0x39, 0x49, 0x77, 0x73, 0x5a, 0x31, 0x44, 0x44, + 0x6e, 0x63, 0x7a, 0x70, 0x74, 0x6b, 0x41, 0x63, 0x4c, 0x4e, 0x6d, 0x32, 0x4c, 0x34, 0x44, 0x69, 0x67, 0x61, 0x0a, + 0x45, 0x54, 0x45, 0x68, 0x71, 0x69, 0x31, 0x6f, 0x46, 0x76, 0x50, 0x51, 0x33, 0x74, 0x38, 0x6c, 0x73, 0x4d, + 0x42, 0x46, 0x44, 0x72, 0x68, 0x39, 0x4e, 0x71, 0x67, 0x69, 0x49, 0x4d, 0x67, 0x4c, 0x4a, 0x54, 0x6e, 0x41, + 0x45, 0x79, 0x35, 0x6e, 0x56, 0x72, 0x51, 0x6b, 0x71, 0x53, 0x55, 0x48, 0x48, 0x6f, 0x43, 0x6c, 0x59, 0x54, + 0x77, 0x34, 0x39, 0x31, 0x58, 0x62, 0x67, 0x47, 0x67, 0x5a, 0x43, 0x76, 0x66, 0x61, 0x63, 0x6a, 0x73, 0x44, 0x0a, + 0x37, 0x38, 0x44, 0x57, 0x74, 0x31, 0x75, 0x68, 0x50, 0x51, 0x63, 0x4b, 0x58, 0x45, 0x68, 0x6a, 0x4f, 0x41, + 0x41, 0x7a, 0x32, 0x52, 0x45, 0x72, 0x52, 0x38, 0x74, 0x42, 0x74, 0x42, 0x59, 0x6b, 0x46, 0x62, 0x38, 0x48, + 0x6b, 0x34, 0x7a, 0x4b, 0x68, 0x34, 0x59, 0x30, 0x52, 0x63, 0x42, 0x72, 0x79, 0x37, 0x2b, 0x39, 0x61, 0x4a, + 0x64, 0x36, 0x61, 0x67, 0x64, 0x31, 0x47, 0x59, 0x59, 0x49, 0x62, 0x73, 0x41, 0x6d, 0x4f, 0x54, 0x4f, 0x77, 0x0a, + 0x52, 0x53, 0x42, 0x5a, 0x51, 0x43, 0x42, 0x69, 0x6a, 0x39, 0x75, 0x4b, 0x75, 0x59, 0x55, 0x63, 0x4f, 0x72, + 0x34, 0x48, 0x42, 0x4e, 0x6b, 0x4c, 0x4c, 0x75, 0x76, 0x4e, 0x36, 0x4f, 0x74, 0x4a, 0x56, 0x75, 0x46, 0x4b, + 0x7a, 0x34, 0x78, 0x4f, 0x57, 0x39, 0x41, 0x48, 0x42, 0x6e, 0x2b, 0x55, 0x6a, 0x67, 0x4a, 0x47, 0x41, 0x54, + 0x2f, 0x6d, 0x2f, 0x46, 0x57, 0x39, 0x51, 0x77, 0x43, 0x69, 0x33, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x0a, + 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x73, + 0x70, 0x65, 0x65, 0x64, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x28, 0x29, 0x20, 0x2a, 0x20, 0x36, 0x30, 0x30, 0x2c, 0x0a,0x0a, + 0x09, 0x09, 0x09, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x69, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x76, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x69, 0x20, 0x2a, 0x20, 0x34, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x28, 0x29, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x7d, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x6e, 0x75, + 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x64, 0x74, 0x2c, 0x20, 0x73, 0x29, 0x0a, + 0x09, 0x09, 0x73, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x74, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x31, 0x20, + 0x2a, 0x20, 0x73, 0x2e, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x2a, 0x20, 0x64, 0x74, 0x0a,0x0a, + 0x09, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x2e, 0x74, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x73, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x78, 0x30, 0x20, 0x2b, + 0x20, 0x73, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x73, 0x2e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x72, 0x30, 0x20, 0x2b, + 0x20, 0x73, 0x2e, 0x72, 0x76, 0x20, 0x2a, 0x20, 0x73, 0x2e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x0a,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, 0x2a, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2a, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x32, 0x35, 0x35, + 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2a, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x73, 0x74, 0x61, 0x72, 0x31, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x72, 0x2c, + 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x79, 0x2c, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x31, 0x36, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x64, 0x74, + 0x2c, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x29, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x64, 0x74, 0x2c, + 0x20, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x29, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x7d, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x28, 0x6e, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x6e, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x2c, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x28, 0x6d, 0x61, 0x74, + 0x68, 0x2e, 0x70, 0x69, 0x20, 0x2a, 0x20, 0x32, 0x20, 0x2f, 0x20, 0x6e, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x29, + 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x64, 0x74, 0x2c, 0x20, 0x6b, 0x29, 0x0a, + 0x09, 0x09, 0x6b, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x6b, 0x2e, 0x74, 0x20, 0x2b, 0x20, 0x64, 0x74, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x6b, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, + 0x2e, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, + 0x2e, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x6b, 0x2e, 0x70, 0x20, 0x2b, 0x20, + 0x6b, 0x2e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x32, 0x32, 0x35, 0x20, 0x2b, 0x20, + 0x32, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x6b, 0x2e, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x6b, 0x2e, 0x74, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x61, + 0x2c, 0x20, 0x2e, 0x37, 0x35, 0x2c, 0x20, 0x2e, 0x37, 0x35, 0x2c, 0x20, 0x36, 0x34, 0x2c, 0x20, 0x68, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x28, 0x64, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, + 0x2b, 0x20, 0x64, 0x74, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, 0x3e, 0x20, 0x33, 0x36, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x67, 0x6f, + 0x2e, 0x72, 0x20, 0x2d, 0x20, 0x33, 0x36, 0x30, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, + 0x79, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x28, 0x64, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x74, 0x2e, 0x74, 0x20, 0x2b, 0x20, 0x64, 0x74, 0x0a, + 0x09, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x33, 0x30, 0x30, 0x20, 0x2b, + 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x74, + 0x29, 0x2a, 0x33, 0x30, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x62, 0x36, 0x34, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 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, 0x62, 0x36, 0x34, 0x2c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x77, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 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, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x78, 0x20, 0x3d, 0x20, 0x34, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x79, 0x20, 0x3d, 0x20, 0x33, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, + 0x34, 0x2c, 0x20, 0x22, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x7d, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x78, 0x20, 0x3d, 0x20, 0x34, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x79, 0x20, 0x3d, 0x20, 0x33, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x77, 0x20, 0x3d, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x68, 0x20, 0x3d, 0x20, 0x36, 0x34, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2c, + 0x20, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x7d, 0x0a,0x0a, + 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, + 0x38, 0x2c, 0x20, 0x31, 0x38, 0x2c, 0x20, 0x31, 0x38, 0x29, 0x0a, + 0x09, 0x09, 0x73, 0x74, 0x61, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x73, 0x74, 0x61, 0x72, 0x31, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, + 0x34, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x72, 0x31, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x2c, 0x20, 0x22, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x09, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, + 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x28, 0x31, 0x30, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x41, 0x64, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x20, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x73, 0x2e, 0x0a, + 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x28, 0x31, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, + 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x28, 0x37, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x29, + 0x29, 0x0a, + 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x28, 0x35, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x73, 0x65, 0x65, 0x64, 0x28, + 0x6f, 0x73, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a,0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x28, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x2c, 0x20, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x74, 0x2e, 0x78, 0x2c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x79, 0x2c, 0x20, 0x30, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x77, 0x2c, 0x20, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x69, 0x6d, 0x67, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, + 0x78, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x79, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x2c, + 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x77, 0x2f, 0x32, 0x2c, 0x20, 0x6c, + 0x6f, 0x67, 0x6f, 0x2e, 0x68, 0x2f, 0x32, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x28, 0x64, 0x74, 0x2c, 0x20, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x64, 0x74, + 0x2c, 0x20, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x28, 0x64, 0x74, + 0x29, 0x0a, + 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x28, 0x64, 0x74, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x4f, 0x56, 0x45, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 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, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x65, 0x6e, 0x64, 0x0a,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,0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x0a,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, 0x6d, 0x73, 0x67, 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,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,0x0a, + 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x6d, 0x73, 0x67, + 0x2c, 0x20, 0x32, 0x29, 0x0a,0x0a, + 0x09, 0x69, 0x66, 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, 0x6f, 0x72, 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, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2e, 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, 0x6e, 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, + 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x66, 0x6f, 0x6e, 0x74, 0x29, 0x0a,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,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,0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, 0x6c, 0x65, + 0x61, 0x72, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,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,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,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,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,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,0x0a, + 0x09, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x0a, + 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x65, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x77, 0x61, 0x69, 0x74, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x70, 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, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x65, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, + 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x41, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x61, + 0x6d, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, + 0x64, 0x2e, 0x22, 0x29, 0x0a,0x0a, + 0x09, 0x69, 0x66, 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, 0x6f, 0x72, 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, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2e, 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, 0x6e, 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, + 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x66, 0x6f, 0x6e, 0x74, 0x29, 0x0a,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,0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, 0x6c, 0x65, + 0x61, 0x72, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,0x0a, + 0x09, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x41, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6f, 0x63, 0x63, + 0x75, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20, 0x25, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x2e, 0x5c, 0x6e, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x20, 0x25, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x25, 0x73, 0x2e, 0x22, 0x2c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x75, 0x72, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x20, + 0x61, 0x74, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x2e, 0x75, 0x72, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a,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,0x0a, + 0x09, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x0a, + 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x65, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x77, 0x61, 0x69, 0x74, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x70, 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, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a,0x0a,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,0x0a, + 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, + 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, 0x65, 0x6e, 0x64, 0x0a, + 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, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x65, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x29, 0x0a, + 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, 0x65, 0x6e, 0x64, 0x0a, + 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, 0x72, 0x75, 0x6e, 0x2c, 0x20, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x65, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x29, 0x0a, + 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, 0x65, 0x6e, 0x64, 0x0a, +}; // [boot.lua] } // love \ No newline at end of file diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index 5be1e87c4..611513a14 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -24,6006 +24,5013 @@ namespace love // [graphics.lua] const unsigned char graphics_lua[] = { - 0x64,0x6F,0x20,0x6C,0x6F,0x63,0x61,0x6C,0x20,0x76,0x65,0x72,0x61,0x5F,0x74, - 0x74,0x66,0x5F,0x62,0x36,0x34,0x20,0x3D,0x20,0x5B,0x5B,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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, - 0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20,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,0x20, - 0x5D,0x5D,0x20,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,0x20,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, - 0x20,0x73,0x69,0x7A,0x65,0x20,0x3D,0x20,0x66,0x6F,0x6E,0x74,0x20,0x66,0x6F, - 0x6E,0x74,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,0x76,0x65,0x72,0x61,0x5F,0x74,0x74,0x66,0x5F,0x62,0x36,0x34, - 0x2C,0x20,0x22,0x56,0x65,0x72,0x61,0x2E,0x74,0x74,0x66,0x22,0x2C,0x20,0x22, - 0x62,0x61,0x73,0x65,0x36,0x34,0x22,0x29,0x20,0x65,0x6E,0x64,0x20,0x72,0x65, - 0x74,0x75,0x72,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, - 0x69,0x63,0x73,0x2E,0x6E,0x65,0x77,0x46,0x6F,0x6E,0x74,0x31,0x28,0x66,0x6F, - 0x6E,0x74,0x2C,0x20,0x73,0x69,0x7A,0x65,0x20,0x6F,0x72,0x20,0x31,0x32,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, - 0x69,0x63,0x73,0x2E,0x73,0x65,0x74,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,0x20,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,0x20,0x73,0x69,0x7A,0x65,0x20,0x3D,0x20,0x66,0x6F,0x6E,0x74,0x20, - 0x66,0x6F,0x6E,0x74,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,0x76,0x65,0x72,0x61,0x5F,0x74,0x74,0x66,0x5F,0x62, - 0x36,0x34,0x2C,0x20,0x22,0x56,0x65,0x72,0x61,0x2E,0x74,0x74,0x66,0x22,0x2C, - 0x20,0x22,0x62,0x61,0x73,0x65,0x36,0x34,0x22,0x29,0x20,0x65,0x6E,0x64,0x20, - 0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61, - 0x70,0x68,0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x46,0x6F,0x6E,0x74,0x31,0x28, - 0x66,0x6F,0x6E,0x74,0x2C,0x20,0x73,0x69,0x7A,0x65,0x20,0x6F,0x72,0x20,0x31, - 0x32,0x29,0x20,0x65,0x6E,0x64,0x20,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,0x20,0x69, - 0x66,0x20,0x6E,0x6F,0x74,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70, - 0x68,0x69,0x63,0x73,0x2E,0x67,0x65,0x74,0x46,0x6F,0x6E,0x74,0x28,0x29,0x20, - 0x74,0x68,0x65,0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, - 0x69,0x63,0x73,0x2E,0x73,0x65,0x74,0x46,0x6F,0x6E,0x74,0x28,0x31,0x32,0x29, - 0x20,0x65,0x6E,0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68, - 0x69,0x63,0x73,0x2E,0x70,0x72,0x69,0x6E,0x74,0x31,0x28,0x2E,0x2E,0x2E,0x29, - 0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E, - 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,0x31,0x20,0x65, - 0x6E,0x64,0x20,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,0x20,0x69,0x66,0x20,0x6E, - 0x6F,0x74,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63, - 0x73,0x2E,0x67,0x65,0x74,0x46,0x6F,0x6E,0x74,0x28,0x29,0x20,0x74,0x68,0x65, - 0x6E,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, - 0x2E,0x73,0x65,0x74,0x46,0x6F,0x6E,0x74,0x28,0x31,0x32,0x29,0x20,0x65,0x6E, - 0x64,0x20,0x6C,0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, - 0x2E,0x70,0x72,0x69,0x6E,0x74,0x66,0x31,0x28,0x2E,0x2E,0x2E,0x29,0x20,0x6C, - 0x6F,0x76,0x65,0x2E,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x2E,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,0x31,0x20,0x65, - 0x6E,0x64,0x20,0x65,0x6E,0x64, -}; -// [/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, 0x31, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a,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,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,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,0x0a, + 0x64, 0x6f, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x5f, 0x62, 0x36, + 0x34, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 0x5d, 0x5d, 0x0a,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, 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, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x5f, 0x62, 0x36, 0x34, 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, 0x09, 0x65, 0x6e, 0x64, 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, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x28, 0x66, 0x6f, 0x6e, 0x74, + 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x32, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, + 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, 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, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x5f, 0x62, 0x36, 0x34, 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, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x28, 0x66, 0x6f, 0x6e, 0x74, + 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x32, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 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, 0x73, + 0x65, 0x74, 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, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x31, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 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, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, + 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x31, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 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, 0x73, + 0x65, 0x74, 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, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x66, 0x31, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 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, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, + 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x31, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x65, 0x6e, 0x64, 0x0a, +}; // [graphics.lua] } // love \ No newline at end of file From 160c17c180bc6889db0a0cf40f419507dec649ea Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 22 Jun 2011 14:54:29 +0200 Subject: [PATCH 069/384] Drop old require syntax (no more .lua extension) --- src/modules/filesystem/physfs/wrap_Filesystem.cpp | 9 ++------- src/scripts/boot.lua | 4 ++-- src/scripts/boot.lua.h | 5 ++--- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index 105ca93fe..d8a6932f2 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -244,15 +244,10 @@ namespace physfs const char * filename = lua_tostring(L, -1); std::string tmp(filename); + tmp += ".lua"; int size = tmp.size(); - if(size <= 4 || strcmp(filename + (size-4), ".lua") != 0) - { - tmp.append(".lua"); - size = tmp.size(); - } - for(int i=0;i Date: Thu, 23 Jun 2011 11:19:12 +0200 Subject: [PATCH 070/384] Update msvc2010 build files (issue #242) --- platform/msvc2010/love.vcxproj | 12 ++++++--- platform/msvc2010/love.vcxproj.filters | 36 +++++++++++++++++--------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 23caa898d..ea80c1433 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -12,6 +12,7 @@ + @@ -197,8 +198,9 @@ - - + + + @@ -206,6 +208,7 @@ + @@ -317,8 +320,9 @@ - - + + + diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index 9ee8dc221..11045051d 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -496,12 +496,6 @@ modules\sound\lullaby - - modules\thread\sdl - - - modules\thread\sdl - modules\timer\sdl @@ -583,6 +577,18 @@ modules\graphics\opengl + + modules\thread + + + modules\thread + + + modules\thread\sdl + + + common + @@ -858,12 +864,6 @@ modules\thread - - modules\thread\sdl - - - modules\thread\sdl - modules\timer\sdl @@ -942,6 +942,18 @@ utf8\utf8 + + modules\thread + + + modules\thread + + + modules\thread\sdl + + + common + From d9c5892f0a9b5338fd40858540e868d2fe5cd6bf Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 23 Jun 2011 15:17:37 +0200 Subject: [PATCH 071/384] Made autoconf aware of llvm-lua and rename --enable-luajit to the more correct --with-luajit --- configure.in | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/configure.in b/configure.in index e88aa3f95..4231aaf78 100644 --- a/configure.in +++ b/configure.in @@ -13,14 +13,17 @@ AC_SEARCH_LIBS([SDL_Init], [SDL], [], AC_MSG_ERROR([Can't LÖVE without SDL])) AC_SEARCH_LIBS([glLoadIdentity], [GL], [], AC_MSG_ERROR([Can't LÖVE without OpenGL])) #AC_SEARCH_LIBS([gluOrtho2D], [GLU], [], AC_MSG_ERROR([Can't LÖVE without OpenGL Utility Library])) AC_SEARCH_LIBS([alSourcePlay], [openal], [], AC_MSG_ERROR([Can't LÖVE without OpenAL])) -AC_ARG_ENABLE([luajit], - [ --enable-luajit Use LuaJIT instead of lua], - AC_SEARCH_LIBS( - [lua_pcall], - [luajit luajit-5.1], - AC_SUBST([INCLUDE_LUA], [-I/usr/include/luajit-2.0]), - AC_MSG_ERROR([Can't LÖVE without LuaJIT]) - ), +lua=lua +AC_ARG_WITH([luajit], + [AS_HELP_STRING([--with-luajit], [Use LuaJIT instead of lua and llvm-lua])], + [lua=luajit], + []) +AC_ARG_WITH([llvm-lua], + [AS_HELP_STRING([--with-llvm-lua], [Use llvm-lua instead of lua and LuaJIT])], + [lua=llvm-lua], + []) + +AS_IF([test "$lua" == "lua"], AC_SEARCH_LIBS( [lua_pcall], [lua lua5.1], @@ -29,7 +32,24 @@ AC_ARG_ENABLE([luajit], fi, AC_MSG_ERROR([Can't LÖVE without Lua]) ) -) + ) +AS_IF([test "$lua" == "luajit"], + AC_SEARCH_LIBS( + [lua_pcall], + [luajit luajit-5.1], + AC_SUBST([INCLUDE_LUA], [-I/usr/include/luajit-2.0]), + AC_MSG_ERROR([Can't LÖVE without LuaJIT]) + ) + ) +AS_IF([test "$lua" == "llvm-lua"], + AC_SEARCH_LIBS( + [lua_pcall], + [llvm-lua], + [], + AC_MSG_ERROR([Can't LÖVE without llvm-lua]) + ) + ) + AC_SEARCH_LIBS([ilInit], [IL], [], AC_MSG_ERROR([Can't LÖVE without DevIL])) AC_SEARCH_LIBS([mng_initialize], [mng], [], AC_MSG_ERROR([DevIL needs MNG])) AC_SEARCH_LIBS([TIFFOpen], [tiff], [], AC_MSG_ERROR([DevIL needs TIFF])) From a012a4408e44d61560ebbbd2bb2879c2a077f005 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 23 Jun 2011 17:08:26 +0200 Subject: [PATCH 072/384] New no-game screen (credits go to rude), updated version number and codename --- extra/resources/b64.lua | 12 + extra/resources/heart.png | Bin 0 -> 1537 bytes extra/resources/knoll1.png | Bin 3416 -> 0 bytes extra/resources/love.png | Bin 3097 -> 0 bytes extra/resources/pig.png | Bin 0 -> 7144 bytes extra/resources/planet.png | Bin 7711 -> 0 bytes extra/resources/star1.png | Bin 385 -> 0 bytes src/common/version.h | 10 +- src/scripts/boot.lua | 661 ++++------- src/scripts/boot.lua.h | 2234 +++++++++++++++--------------------- 10 files changed, 1152 insertions(+), 1765 deletions(-) create mode 100644 extra/resources/b64.lua create mode 100644 extra/resources/heart.png delete mode 100644 extra/resources/knoll1.png delete mode 100644 extra/resources/love.png create mode 100644 extra/resources/pig.png delete mode 100644 extra/resources/planet.png delete mode 100644 extra/resources/star1.png diff --git a/extra/resources/b64.lua b/extra/resources/b64.lua new file mode 100644 index 000000000..891a0efca --- /dev/null +++ b/extra/resources/b64.lua @@ -0,0 +1,12 @@ +function b64(name) + local i = io.popen("base64 " .. name) + local encoded = i:read("*a") + i:close() + + local output = ("local %s =\n%q"):format(name:gsub("%.", "_"), encoded) + return output +end + +for i, v in ipairs(arg) do + print(b64(v)) +end diff --git a/extra/resources/heart.png b/extra/resources/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..91c3c423359389e8d6453693712f701b985f8431 GIT binary patch literal 1537 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{LATTyP(UIa|kXST5kGcYifd%8G= zRNQ(qt2ehPK;XFiF~*1mp6&-YxukC}&U(ahjdP7~hwzPM%qxUXu%$NNDq%F+@coi; zt)jx7e&;E>pFDLH+3|bt|GoZuAAi*NmBW0oIGKT`fzg10?Er%W19JkDbHQDD)}1Gn zaWB8lUmnU4+9A&$aA|k{%Y(-pE7Ewb%ABe_d3|OL`;_tu|FE+9yLIj9n-qgs82s1* z)-GgGwV%$Xci>=%ae@4*UZySQo_tn!eei@~!_}pW>(1tKT9{wvsEcR(GUsW4QYh~d zh7C`@^EQR6YRjJCYzkNG@$*{Iou4pq_P(?aOwGTX3PQJSRo;(c3Pug)Uik`OZU*?>;LVRx-1{59CzmkUs8Qqs+?V ztNQGO=gn8%4Ig3+&qYhF(ptJhhE*ux}2(RvHRP#?Mw|?9#(7#3ork= zCaq*~|6hrXso7SZCV5f)Nx2;w-#RYs-s0<%w~4J`r9iC2p+#BYGi+G7y#4R$8X3LZ zK9fmZHDyJMbN9jL%Py%$ax1h1-c@UHo;}lRevVKh z%XjRYMHO~+mBh}jM7ujbIm{OOHLMcWnV3yz_3I0 mvAw4uT1q&;P?fo#iHBkFlckpQ6&RX$DEM@RhTp>Gbf^t z2}P47?1AJPldLgG^Sok4MQN_kWvUCG{F)h5m@ru*96iLH4PWn{IIds(-LQAUzJ8I{9~?XZp1(RkLisT)~86e<~~0>MtlK~MB13G&_OW0SKZ zo2#kXmSLE-YQanTola7b*EE#+qAludd!@f$i@SOC)pj7vAcvOpiY9T?7v)@Xg}Z1d!`I(T9@*6J9!v7<33$5-ov4@zb+DNZ zOFiK|K^bS5jDjju1tj>y__FwKS__$Qxo1{dUrW#vyR2UI2zr6YEuJ2s7JTtRBih6G zqhW;RPyJe(f^j{zoK)Z|qv~TX4-DA~6<@99!uGzoRE{|8zADSkYS^68{XB=S7duP) z{$)1E!Zq?WB_#dMjW?xX;iRlpG3e@@jLY+}8mXN@m47yr++LG2ke%VpdT{d({R1g|-hR)@b$jE$ySMZHjQnMpkY@|$ zpJsek-gr53i^w|z_wPQI`#M2>$p6Lu#bG!+i?pqB4|*5VWE#!4ZS(33dC2bRZgjhX zr+RL^K)`}>vXOowG|}$<)$)>*Hu$WN52m0?Z$>jsL^Zacy$}{3PwBBA zcKD!R@*)11b%~M`3@U8{HI{#qOs6aN=?4KvI_w%#(_2!)6rZfo_*7AsY{PnoHv|Py`+I1w;zH)Qqxq$nGHi={kkxDT*lC@2d{_C* zhx=4~Opk(p8?*#c1t1& zk+|Pr!jG$MoXa%FFSO!xJfuaK@E%K*oC_i~k-JmH6jB_~5wyNu;>_ysQr9=}4&_eASLdNOtPo&=o-7-DzD^n%4 zE^T!N<8s!q-b3S6xH*A@Rw|V*19g01$o~L*%wBi*i_BWw9|We>9%vI<{k}fSF+%7F zC;YMH6iQBRMeD5&TxgMzH~@1I9?XS1-f0%rqrY^rRByPK5bk^U-1ac5@B*=8m4o@u zZY}cu;LDRa3(-u~x!4!(i;|3(hl;-|QK@LY0Dw?M64ShcO00Tm|LNXr3a74Blipof z&jFUiA+w{-6U1{?Q$R8^UB6bIRl=npO8zdIb`+3atKI(MVbUKkGx{X67k zVRmM-6UEO3b@uuTQ>1}4c2NKxJYo2Ps?9SDjpE(!Ld}BQ+-pC*t}};^?H9ZIJ5{G= zXOfbMX0Ucsd?Qb|yvWs>re{9dqWKy$N#=lbj$WfJv@Q=ULxewKhPv~VV5PKx!)>7BL zZY=t!OOAwXz6!n#SuRz>$@;pY!ECe#xO}(vBY(4irz!*|9+z>x5GD|4FFST%0m8+p z31*EpWc5wwL@gS29JUyr5MG4%bfd*<&wAVu{Mbi8+#;|M>LOnSNcHffml!B^g*^4aS0uQ=A1RfQ#Bjobg8luRh4*Rdx6gt%4Ob%7t zzAl-V50H2n4S~a}b@s_-A}BbCHtJ#*++<291{G&t|5?~6!z&_!D{B_U&eqE4R)ND! z11d3n{X0l{_0{IE)ou;m2%Aad_C3t#gykg68dxXn$x_b?CejTr8X)|YNB7~2$`jqj ze(c6JOfS_Dmk`S_Fptzhv9?#bi`h@#g1%H@WVSO6+~mnMgk5zsnvJ>@atT`o2TpU7 zd?e^!JS98RFC&8nX>sm9vvDdFrP50~2koP#_xd*!kb&bqYkuXy_0##oJ*}M*NLvT& zLe~QPdqc&vX$rsU@dh6Kn2^(_x4gH*C_T$n3M17Us(v3vQ$iU=16tt{715$G{}eOo zM+dax;|Q+roxHKcvgQ=p{tuUm+B6pLrgH1pF#4ohZq7HzO*yf6OBeHCg-d#urW>~_ z+Ga&{{Sp}yEuaho?0wgmQMd2M5<^HnjUnp7u`SU%$VC&O`MW=v;4lW2d!XXwm8231 zJ+9GGw*rC)aVcON!GqTQC*4;tpma`Z5t`-RMw6(qi`M5)r0>ej)k{Dh@ijL)_?jJw z^kxwAuk=SIML{UGG1Ybav+t`@s$7MD_0*F$O5@1YA3OHH(OS$|L|Wbz6L0SEfO4V5 zRyuKyO-2mm?T>a4R({YCEF1-wIxU0KEcB;c@w-ghX?X&X;w2m_OfWB`1afX$DOMFG?q+rZf*MaTG9%w~vtFfotcr|P1b58MMRLp??fsxti zNKVQ5)eJ_=6D7_md;$@E1_uH7nz!9Y0$&*OevoY04CDH~wdu0pm8);Cc^F8oTZ$6o z^rZ4S>U2WhJPw3ThuqStQdklh7~G(mL!3Oe=>7jk{wEt7IRtq3Bxvj``Ha7Z5im2cG%mjmkNq!FUyK6) diff --git a/extra/resources/love.png b/extra/resources/love.png deleted file mode 100644 index 79373b177d74b8ae8d750128ecacf66c12986b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3097 zcmV+!4CeERP)(Od-RM2=g`3t)-d9)zmyj-HOX-3VhJO9G7t+uPh$4SoUoQVn0sr| z0oS?w4EtFqZfGB20VA3W!~(F}qoB(@h3!FBD_w`RMbQeT)!5wF{v=h; z`J-X6#=>We`37_NQlv~&ZttP;7d+m@{|dabGoS&WbZ{9`ItzFX{XDk5gDwJplaz?vWT0L%?3bQ# z751{HZ{N+iS>VFxt$KrywMx_KxewtPbZ`|M17`35+BgX|#RwL$0PJq-b&$m_IE-b} zF{9NdUESzvN~lk+O^`D<-DJXuV^585{X%as#V|2OeJJ~T_GXxlL`JFU2AKhF^^DfiwZ%P z-yhfZZQANnzwjo>r`8Z0VgcBXEuXNA3_7@gI*>yl$I-p#tVGsD+7$`{>jJjW^Qz$a z=(?Z>3>Yde3BDeo+7`-5*(#y5@khY@*lAq?QAptgerjYL(hLga&wqct9XvF8-PrmX z+n+OV0vCM~Mz$Xt|9TD|35wR|<1hFxzlR zbH?Ao687Paj)~W)3vd9{ZW}*LK&``hwgOpi04*GX#te-q4zE0?m&h|u4?>JT0`7jB zbusliszaZ>U^xYI?x8Mu3cFxGK@$dDbPXKYrf2n0p*Y`wd~EbDMjuL54uVH40J}Q^ zI)J*g%P#IFtJCHB28)hK4x7D5Q*0^RChX-dJA&&ud@OurK>6cVY=TZ@C zp+1cn8a9snD-WfFprHQ>92gUxcM4}P-NCaf{x@jxgh6Xk|GImk_20oR6d0|ayklV3 zI6H3$-Nt@gV|_OrV}@9Z&41TghKRHGK0^Eoa7Bd|^&Qy%wAohS@A~8~39e7N8LZ*D za11lUp%nlf1Ru^2X3)VFU9r_? zi%*7a+D;m{ofv;#jozwND>Ur~qpz##S#_QkPcpH zY(uJ-#@VUSrIv6GeO#cVzF`1)Vtm%7R_>TcZ!H+6$(Ok#+>pTR`pE6XYvTA3{7fPVCzJZigbaND;L5b#ceQzVQ`( zy7=~)*Y*7-$Awk^KJI82a}#&jB``x@q}I%`F|rO%8fU)>Ot6VVAi;_C)%W_}#w%N) zY0r(msp^<;1`lBgBfJcRRseJ$w++SgKvhLm8QL+_1A2=*H$OS zk3(Oqn0;&d3-r|3`qWFWLvfDa0i45#jtqoW06J1Ix+yaeDx;63+BnPJe$H4#?JXoh zRuOnDPK|?w(Yw?Vqca^>M(Q*rgMTWz7#1F zb2Isi(ficTrbFu}jBN-t#fgfGIE4ue3ZWH%hdtQcYD;S(J+L6F3H+mb`c^_30elCftU z_^HCQHVuYYtQR0nVW2%YO;O!AO5`WuN~NivG%sk1Le1 z*PHnPk@eSqHu=jxo33xt5pPo;8b33Bq~5?jUtQzVCFA@2EVCE*dxS5=4HK9752`P; zuK=p-6R01OS~vu~5{`{W0;FD$OXQiS4=L)CI`nOf46Uzf_>U)djSbQkVgb-b>vw>}+i@M{xu=gIPI0R5u|D*jS_gDU z3>`;#(#6iqBDHQ^?h;Pm4b<2cHNpW@yDj8Rpo(^zakuq+gU1QA0L;kbg_li-tiw7c z5}ZFmwJmf|kKj;;HN%%Ks~=;5ega6S>QmV(L@+wUD1fSgq;knsJLY$Hrkh%s{9Gz>)JyllKes%-Duj zbt&w{P)rqp6uuNwCUzAPU4Hjcr)Hk~=xycN*sZF(4pDTh->8p}fl$8!D3uBP22m5=Q(X83?%mXp3^F z%jly*If2eM4lF15>nZ{YqsughU!m3_y+w*39>Yl^(>#L;$?Tam8e#@a20||YO2-W9 zQ`Cnpor*x|8wZvX{M|rZ{8D60 z%wd<08oP>&F0AC&Vvd6YxOlCjI6s^W#5aKd_F9*{_)q;!nxpBJe4WdcF>V6&nl4$W z;NefH`=12!6rREqu8W$13wQ|~jEEW7CP24w*j?7p~lexR2va9us0cq zzX3eoiVBlHtc|4Te-~XA-3}R%@k|9g>eP3oKJ5gB*iLs1GV~b$cHtTND1cq;3b%9%cP0mfNBV>k0p6eNOT^fce2x>Hh(7*jPPGzE z0DxhFT-?Il9QGUekx6Pke=urMBnq1ifC)B=;^P-g49EBqj|YXA%FNa^$zX!~O=XVg zI%qgh%!z?PHqoI(=V(V4zvy5;Lw^~p8O9{ah%G=OhWlWmNGC(WjG|0s{?avK+kalG z%V7S3ga@0-{FhU14hJ#jelh#Z3Xqv+#HjtDoEVSD;tT_92ZBO4O-_b{;s zOg+knqOPf?@uy4w0396ucPNSUA9Pr_6Y;Q2Nkazv;fd*TB2{Ar3} zWFAWN2`7iTkjW?i8O4Kvh50{R3$kAXi5L?857+;{ zxmy3q{Sycz3cF>Wih-zv}(X_5XKYH2#&V&UQxq&$Rx3 z)BMjXcI^By{}Z(A%74P17{ZSAPA2{BM*oyv zxxm#7|IhRCw3GHH3w>H|>@!Uu+4H=1%4!rc`CUe~SN*t8ir64xq82-qXw~_3_+y&A zJ^ubaMf;;BjzRkN{ZUt=vZ7kwU27V2EARSU_q*;>_eK-zZrJQ>|N16_C}_RsQoCW( z?CMtg(2M3~8WfCPlequ@ioHUi08rTlhJF9vS2dc$d-Mgl5W!OUzrSvKeoFK)6hQc7fyBnqJ41c> zFZUfx#Kr|@ZadAH$)Q-G4^XP0B$fAtYFc&tr!E4*4~|id%1;aY7XEP9 z3Cz%rBzKuRV_lCyNIJFz%%j$iH+sIANm6Q>gQiba8W5KXp5LyGt=5tT#nDHhQy~r_ zT23%N`Q#jD>tI*A8=t?u{oMZv&ODrOCf?0sn!_V-m|ie&!=Oi8jP!Ro-RxbtOz4r5CZ3-w+A`AuNyei6Z@oG7Q8o21u7JE2k8c# zQw2&I*$i&^k>MKF2#rBugHfe&5pdx_7|Vy=hr_}!Wj=Y z;scpsWbf8MSS#@YJ(+IidxxNFzEq!wpx?LwYz9~LZJAky8RGEKD1=%o8* zHYlhcT#Z*aUmghVpW;`pi8Mmf(EGTWPY5Fjy>sd}1ou01A8YIrBP^9Fsub@JCbUGka^rI>=~o|Odn;i!>s{UnN+q*&_~;5oHuwaCAYJhMlW|6>B<@BCa#?@+ z4i5*`;pfEhoECY$4T4ksx~ze#NmB2PxUs@(-}Qd#TW5w`Oi@H^J7qRepw|w zrv}E<{bK7RPGB8h3cK{nEI}$e|3y&qa7HD;;qA{2%q2lgA@%oxarcRdr9!9i9WRKL z&ICi%ntOeHJZ5upd*PX(?dK+F+9QBJA%Ah~+~S(POCxVQm?$@R#Z&197vlpJUC)1# zS)*&uI;UW^A=Ebm7Z_)Ib{jz*z9Oi+!*^y|SwV+7 zjCzGA=M5b>-$8bcmkE@~L37GPdIS+1@l^^#P4~(&MQU1AjA?fJWIA`ObJ#-5zKCx; zHh!0$Xh54P{#|^Xw6o{5D|ozh-AZC3Ok$&_0$u(>si0iXlKwppNYwR;Hlwxnzs^Hd zS`B!~xq=h~)@lu6fsqhDH0WY62g~5x8CW9=BH&mmN>qSmvy4@RjOR?6&%w?!uAn;Q z^UB&%^z-7V4-j-i!eew_6vTpQ1MgMZ7^J1ZA)?3e9>pQe%$5){P%Bd=!AJ9Zs-?Da zzjs>}LG3E;4O2!hZDdcv=xtSZg%TaQ2kcIM*iyI&b&1hi&iJ8tza26zKzmL_b#;$B zpX*zT5&MLo3vXl;hYEG+g4mT9WWv$ZiRrfdOM}={LAsDh{k3kMx-}rW2Wq-qts~ob z!WT|p;4BofU&5_6AmIMZk;IVAo`nKrVpj~g_Qnlp@zS)z8%s&BzddyBmCxme%tI?y zyb`*q;1_iXeRss#S)%6)H_jkBUASmI3TN8h<((144L!)EBqWuV1T%r0*V~N?3Y*Ix zdfe(w=!Jy4<=mphzqG@GJm(pA*)F~A^*%moUvqyF)^^5!8QaN~(o2xQ-+Q!(@%X`&AeL&9z0m0;LX0foGo7Amkt8oF`Qif}2HC zW7HTAU~B_du11&H2cib08nA$~4k+?6xhA31SBi*^9X6IA>I3%hCM1J5>+@-ViUXhg zG}{SuPDsr~BY<&LDnx<4_-PiB@lgj;0;6ssF|lKLyG8kr0KzsT18;Z;!lWU4;(KOE$1kikMWvHcc8Dt(B12w;(GMwP&wp^w@$TP^zgfW;>U?JPy?k^E* z#p!b9BPeAzk%zjjhItH_FVG-V1=v79M(ThdWAx@I03)7dN`Oln0RNOfnaf2;(!C@t z4ora`-~%9ooy7c|z~FZHR3psUISq^rJueIg)H|VLW1&bkqD%%z3W|eOA*%2N9_j}B z+=Ekd=!14z?Sf@EBPnBJT5tfKC)s^0*t5mYPvd{rE6G)mdocNC;mG##sI99(MCf?T z@@)KSjp=r#lS01h{Ck15h2TV7Y%r}?3SVN6b4|p3l#Dqo|qBs{w&tU@*jq5m8G->j~l7K$rQVrKO*2~P) z4O7XNVUTf~8e@}mnjcC%1^Sv_(`FE+O-46QXV?Utnj5eyZUl`@@^oXu#K zRAKJfGuGJcf*I3Z!>wKU2MWW6&RRBXjuuV+xTzg-IIDWrS#WXat|`~~`g?5*0kgIB zq3G8F?EST6Hh%blFth?r#QLILRb}DpxHhzh` zr*Hbe@=R1t@6=EfezSF&wLjA9i7bN9mjVuc-~6DyU0B*8g%H{+w3Ulxo%0<4?$M<_ z&YcAYl%K_-f%>?8xOSY3;7S*-LUKQ(Dr~am5zJm0u~&YzO zK2g8x{p+EHMyok%kbuK#icytk?y&;kY96~ zcJVpD7Nm1?+Vpd23awm?E>z)HnX0@a6yYKN$qR-pxRL@+-cow|q$B=BvC}P%_`{-U zc88^CxtICw)Q1n+^IT0b5_48m*en)Rqkp(;;tuI-%5-UY3z1G)pqqw^=4gUmtkjy)h5H`5m8>yi0{ zoAFgjeDjQPjJH+nl+`V0ne-D(YA!aKP_@t+;$)sUAaYAM@R0neYIp1#<0pYI=95Ru zL+8PqdPm160!jCPXB27L(GbJnxfA!Iuxt7|{(&ZS>Zxb(y^h^e=JjV^Yz*gUe?H*B zxwUIx$`6t2m+)lj{n139`b#-lYrkbw&@-=Ew;i}}#mzX67s1iHX6^GWlM}H;x5LYM zKeT5HLq1C$NpdXONt{nV1!1Chwjny-?7sHyWVo$Hf|QKLqn53dZ_Ps}UV`e(tj-xF zifQ}ppmUjujpPtgRSV~>KI^&T=J3Jj*KWr?iN!g$U)Mt>?^m3ZZ~v(y4>o*c(m-J@ zrwA_DEpD=IOzi#htc>5sN&A^Ef~^koI?bt@EZw#;6aKYhM{7#zQ1F@;)$PV;$KBO| zo(m_2kFP`-uW0n<8U~)AtT|{GacqxI{PvoaME33!)gnIZZ&GvwJ&3O1y-K8sOJWSc z4SBSOjjtxB4bnq_a3XrnxDyLQ z^!Id!nIbcjTipI`@Ey-V(+HQq+r{0JW#gQ-1ET{H$%%=H6!KodH*p>9uX|lL%f(nP zKXNsX9mh)6THSh;u(0`z2fem4Q$dE+VU{j7D{4wQe;7Hqu~_{z07;s;*FL%KRk}T} z*D=fJ%c?D$@TsO+2B<(IuQ%7hqO-U^OB7e_VFcvYCo15U?>VO|Z%vsiV{hMB<~YJK z)s9e_8NR10xp72c^^NUFbg%EX!%KeC;k@?e_VQMzjIV|ze$eTdn-BkGn~43TNiFG~ zxa_3oc~UU@cL$ocJEHpnke|C}94Lq>Rb%k!I)9E!W_6Mb2wLL?l&1dr`^~?@S_rx`DY=LCD=b-$A9wt*V&!w9CT4cy zEPc~tKBjb}X3i&Xm8o1+7h6Dn96}y5FYVWAJpA(3(t-C7xD!q8_=VU=^(#z;w+NH9 ztjL`c<`M$eKQPWj{{p8cws+N-T`bWSLFFt~_^xLOURw)Z8Kny;hz%y5vl5>#W1^Qs zoyhgJ*BZ7r0*kxTP0y9aH!^}-_@^||Y`0uJ;DNcgWA(?j-}awL2!A$UF@%JSt6z&5 znQE@{HL(JpKfHpvYd!BjauH~ZLM?KoZA{Cbdik(4Wen{IDWaH5e%}>@#$`udo*vA7 z4CbO33H*&_gzZi5o2z&QjT(_cpA@&WLk2>pY-_5w(`QXH7LR}ZCRg;Hi>fSB#+qrd z%D*)(HkaCnZc9(s*4F)q!m9ROh+brkIkugs&-csxUBI{)XYEzhHy_%rz1NTx-Qd;}S-+^_ceIc8vMlWB;g9N5PU81O z=p4e68QIfAQ;#;+bI-KX>EflAeoty6pFd?`4JAZX)_w>-bvzjY;k7-NIJ82Kn*0gz zw}tP;vUsn;+s$RlmHob7uVSM2082%o``meIx{~zO@rL-OwDD6CWcT@|#;jFlWWWxF z+)fNP*G`J@N`u_jiJzOk3Ep=A4o+3=QjJpEmOvE+RUhLD;8aU$KFU%}SjKpDX^b@eGi%2$;r_-w#L6Z$%@t0~3h=V$xtsDt zmiXhCyHta~xS={C$NH+Jdz@W&()2=++|wt|O0R{I#3&b0ozWh*WIQu_nDs^ZzAAQ* zvFO;zc?9W6NvKf~1_UHAA8S#*pRYP=#|=2~T~!kptC9ofN<@2`e5hU4YubwJHJLWe z5%5sY%HyG4#Ec~h&rdsW9MSlj+xA?vj%y?~{_$#D0D_Tx3WB1=79Hq|N=BGH4H#MA zMKLJSHTm8*9zHul{$(^^m8RM>FIL5S+Nc1Z(T(=ldMJxtpaO|h+)d|%tBV}dB%Zh> zch`+}Z3;q~WR}xkp*}UoD@C?0s#I+3M}ahO30Yjrh9b{w8MT=;Np{ zPS>cJ!Wo~Nyd_49>9hH}<8mF3o!-Mt?A$!7+uC3TCzSEIxS;}E4`U9|Uuvx4_RlVL z?OzL_MMrQ=517t|Uf;}_nV;n4h{=%e+g#REo_pqS;=qqj>20Dg3JxA%C|7e;QCd`* z*J6H^EZN-`w%L~1qIzt3#(KQ0;M_Xdgqo2%kH&}u7pU12CcZ5k~+Cc^b;$~<&qFKyQO zE2)SJlA#RH29IokUO2Ja8U=|R%A1s$gUsw(YS8p|!8$UL&Z!l($09I53&A90BP3jd z>g!juKEaNYwo)bsYx{P0%Ab99{KU~S5iTuINQNB1|H!wiD^V^rr73HCBj6Sq8k*!s z%Mp>*Ij#I~hAPD1Fii#i;n2`4Kg1C?z6_bS)X5NM9?`CmwcHV-iiuI9+Fy54z+3LP z^7*6EPeytcsjmr_V+79A>glKUDhJd`K0rsA0BBylkY;L)5|>m{-99v+!#{#p;4O(c zskyID%FYFk8}*0c_U7E3(n?N{G} z;&Oz(z)nMRV~yvAe&N$7GUYkW1^$;z41r=KsuHGlkLW9|$enaxZfZzWIyw>lz)*gL z15wusvW7>8nO!QlyAllKJ~O25pdB5*PJ31;?x^|>J>8mfdsnG-FQr0m<#&~*(tF>_ za9k*1MOf;hb4Q8aW6sSeQff;g9@O#_y#68t{SkMp1obOO-&48Gx4qZVoN_+}B>CB9 z(<9-=0w_?CI*8R)qd)N$hNm)aWmd3{RWHRI%mc;BQZp{!`SQeua^nz^A`M!@Bnxfx zE$Ah++OVLHcB?FNu+K?g4C-;8R|X=G#yHEhWLMaikoE=p49d7J*NX78Mv2=agdexS@`C}-8$>WK6!Cg|Pfy9Fi5g9?deTSN z9@ovW{PdarmqwNJuU1BHSCkyJu})%On>4vbJM|t6LU%yU58=MJ8d=93IX2;-<@iDx&A>LUo222-;4aS|kk%!z@MG-5Wrm~%3dLU8fBk90 lu?zOu_5Z56yb=%L02L#<)Jf^bCfT~c*3!|UWFH~n{{cJ{OQ8S& literal 0 HcmV?d00001 diff --git a/extra/resources/planet.png b/extra/resources/planet.png deleted file mode 100644 index 5fac9612b0171bc2ad10104e810b0b955570d8a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7711 zcmY*;cQ{;M)b5#?sH68mbkU;sE}|tth$M(kv>;kALKrPZC)((u6GSiZ3!^7Oh#qwi zEeS@85zO4l_uc2Y&;9G1XP>=SdH34u?02m=6Jvd9N_I*B0I2U6=sW-b5b+fRkdqQ0 z)_zqk0C0Wlj?S%z@cg}kSE<%B!CT?&AsXedF}D-xzgpV-Is%|3t=^k`2r3F&$3c;e z24{1@u3zGY+CDjTWlfuR8+bvBca*C;5}`iUfptMP#)Hg(nE|>M3eF9XMyUjP3%1mT ziT2uW2BkUQ61SQU#<(jvmfgqPzIMLqx(Hm|HV;VHT{|f#-9J`4Q{Vn?n^Te;98I?? zV75m|&RY{prG;eThtTm2egdKmq-6l!2Z{gx5Ow(qCeD0lqbin;4}9kBF0p$R|8J_G zK2TC|=yLw?sNXD-su+(VvnKHbs~l-UYDu%AN9xG7#{E+0?d^5~xP1f&#~f&$21Ua0 zxy3W_8sc=^G*$8C62($f z@TBWI>+C1|o>})ntLPW3I)m&Q`@b2B zJ<*H-b&ebTlA7d8DX4Wwp+D{7rBj9<7vSp5Ms%_ke`e&!I}Q+?E$ zV=RGa-r#Z_R=*L-#-{kayFZ=FsS~Ed~cAg*Svq#s4nN0d@4xEMBq{alg_p#`R;|y>lUP zV{n;-jzSGRrYA}=PI`Hg{PH9zIKR^%e`ez{WB6QT=laJE$Oy#O1<7q4DM%nS7xcy*gQRZ=!<=l;I^j$+Hteun|7L{nPB7@)) zRjvv59N55gQpJutv%UXT87e|$1pmEvHosW(RvDVzesR*0JxDbRu_M*c3Y*o^vrh#@ zlgEWqR}>NAItWA6rYWzYcA2j{6SwUNTCcAltfTg?V#gQ5eM|8xQijRuorw^G%uUdiV8>WUedF%o#A#xj$!y6ovd!Ss}@&p==MR(Pod3+ zQPX;WuHBzfwCnnZv$QoTP0jQi-)Dw8{j?ag$!o}M*as`fO7kbzfW@0RhR>IBdNjyF z6}-M_iSi>-adS>tg;_W80AriRsWD`n^UK{!=dz&bjT|S-!k3j1SCE{JKi4m)D#UAJ zPjn#FvWN-Riwl(ayXRu3h2FI6YntIQU+fEv*96mgDN?rYv-874q_QePIVy}UHOl(0 zJ(wa9{wq^7@Z%tRK=n54PyRQwZ7VDni<`4^J`WCm{fp(i*2d()TrmvC;*!#@S#u_F zOO%gjm!cDAx4_|9QgG;*31qxr0&V+-hyZ+FC+mRg8Pcf%t6^yMo$8c>dOF~m$w~Q@ zIVN1@!hy|SMs4@duLy=@_*`y3VSW?a85U=EcjPbxp^grR;LX+bAOVYSZm*An?fN}= z=z9m^l7s?3 z2ES9O(kNu)RyIPWhMuil`{_v6uyYSig?l(1@-gs6KT)m9bbYe2;%?)y52UACV0cS6 ztv^E2>8o>SaTXbw2cDjlfgp;pLki;?IYS9<5XpO&)jWXh{+FYxQtEQgjw2DnJS&n` z81-}uh)I0)N`ZcEk5wD*#Q*bGWs(!WZM9A09$M3J!G0`9Ym8lMC#oBa6B>2M{rX$E zz+rpswS~eIQ|sq*ktxA>f0ZWA=Y1``V#RHS#W$#n4K4{_>w}jmjhw$#7SLjq%tz2E zLHOp2ESqm#*XEoS9F2$~VOnXpaKO{&qy8#tn4muY$v5V*1i8Uq;iWSQn@6~(%R7PP zodMlfcmi2%z{lZU{~JHJ3*s9cOX}GQA`4r2YM zX!^aMBxn3Wy`ru@zRTG60V64$--M7a=iV6v_bu+GxA43BIzN({VTG!NNlnE&EQWbT zo=mCmN6{J`!#?@j<0RPr4a=2plp3adWaG{_hnD?~K*L3&G75nwu(!0oH8^E2{Xmx( zH;Ddg#;f~G@&o@)s?q}8;57~1Fvi@n94*Hg)0UcpJK1MjVBAU?sd4_CToE#xaa+AR zNZ<{H+8wYt{f$XLn|p$V)BN-tq~>4yW5!l{H2!;L2k!_9O=Fm6oJb)s2^`h-8kSpZ zY+qd7#nNwX;gG|$rPNg2s_Lj~46cAKKYlh&1BBhMbDr5|W#0JY^O~D55*+U%PLT^U z$atd7{mE6jvelybqD=2XcQe>kxPL$W>$zZ%;{trYL*kGpo$|mHL~4Ln7+DHc*I3(5Dj8Fy~tkde(ycH z@qOdTSFty}&BF!vC2f;8n1YrbE(0ZhF7zu$Ulg(YL6)U{xqnNwUasyZTx*7!XIx(C zJ2%vD*S+CGPA!a#6Jk^W+y5whm^SQa){zMEq5wr-%NyoSsRYWx@b-$f*pm*FFNh2~yh3G0;nf-TbyH(jK<|FS-B63?qA=3LHB>eJ)ZYgWqT{cPm^ zG=+EJn9qoK_}~*U)9RKFc&0B&>Q_LaX7z;KG%cvYNOhFblMLVC$y{P?!wTJHj)s1bs9GhNz-jkwvi4Ax8~VYXr{>%R+`&r{R4~e6Wh17FE{FiMCJZr+;y^F+CW@&gT$nBe}TaNdeTXoykm(BZYc9N}1ST_Ju$S?Na>iJ;E1 z|Bm(R!~B55l-us6T1%9_!5YuZu-Ug^1;2!J=sVGF{clnptp7!HP-AEoBQJh$tH&5H zCoeS2E*TEg^>ukso)RxtGt)(MvVMU}{@+!x&yg$C$SEMp-W|9&Jz-scqm(ZOSJVqh zLz=}sero{K-{XlfxK1{%Tt|ysqOR%yadID8>nX<=2yQ5sGT&ox0NNLsCa3JkRXJPy zRCPGWkoS`E8VvA<5T%1wJENZ>?*1g$#QD0U_COX5l2W~6-f%1t;KXj~ATw=3a!(#Zlw1!UYm-Ac>%}5sNqX|YyN|;|{zS@# zWF#}PbZ@DRLTp#^t=N!D^V8&t{^GHZHF`^7M_l0hKMS%tp>&7)M3{Uh9$Iz*S@c>1 zT||!uZkahJ0Z+UrjXo14G5?b!R|9JK&XhaJhM;TwpQS1=EjQm==|<=IlZY7NoIB1A z`y{ta`2bqCMiF5m$F#k%*99C)Klv!2Qg{3R(atJf_C03R$idWGOb~K}bY7&T5ty7_ zjONVg>diM3>oHp;De^RlKF{M5u|jl`6!Pup?&1IOO_x zbZP|z!E7xe(*i`5k2&R>%fD4I?6r$b=O@8~cn1=d+(zz}Iwu2i#Q4fra;vGONBib! zAJ+!nVAYj%HPL((B8_X!*amBBB&x7C4we z==`FMyq9{ISaDP29mo(AyCwQ#?V$tjfFNqs z{z^+d`rA&v5{H)CtqG01qwA0JVkvmH`flC3u;0%_m@I?=-t$a9JsP%`zU#f(LKiC?H;)6&E`5E%F)AewAdSuxZ}v&SOH( z$|=_jUHVI)TRp_6dQsNpzu(p3^>qKrK4#%q-s`w7gZOCSc`M`4zO@A4t+iO*THGRV z_d0+~P)hd?n%NOM?%5!6hp4E>w!j&dd!2Yj=zcUQ1VExu30t*Om*Hjq1`)2Fl)=K3 zbdC})7wVb`=m#OP^p&6!kg6wT{jXFIxvvPPTodGr6WWE(7y`gYDolbrwDi;cz|p9< z8crB9f9_c1Mx@$Ko7+bcLEhhU10pbY1|9ALI)8gSz*#=Tq3j$`G56h{#hdg zAycndZ#;(pxGbZ$TQ_UJ*%#AISxoJBjlOvWEr}(Va6#rN@>@jU0olZTk~04ulyv_= z--%s>9~*!s1}>3b-^{D*)#3%R#-P@J@E7bEe@O?q3{<$8dK%#D+Py(dMv~{RoahD8?_Bawh0Cuh7^UY}2G#UnG5eL(I zTI1l#*p&_6xwj0Y6SSdUD~icH_r7MfD`*Qu*DWh&R}!|7=ex9-(f~s8JIn9q)E#|e z%rRBU^%j^eu3V2gURF_O;0lFLU{<_&>R$VBEV@c62{tu!9r^LVuK0~i^M22$2YH8{ zNMDKZ_vuV0+o-82%|G4Y5qH@Ur-=Z%HNh{Jg(*Pa)gQg3YfRftCNed}E$TtE6YZCz zH56r)rAqyVJk3oFv*oP3_z~ahwh489N0+Gx__^s4@ zs<>G__M*laxbQ`>SWDk;2A2eOR(x@dS^R2F3nCkNSm6H9zwOEtbI}&_-tLWAZbOwa zORG{WzDsJMihRbny%8VlqSoQ1Yit#lkjtCr-Aq%82f{5YevTTnQe##Tk_#;RZj|s< znL1{=*4~ROyYv4CW2Oq9rq%qMpo>O z6o9z@fvLMub-U?R6CJa&y9YXH|J{=UIXc!m(ug@96!RxImP5?HWxlAGPe<47b8g%2 z{6RQ*X+*qP00cK=l@!CxJ-AlfA50D6wvaEsbt{dni7V88Cc|U>iLU-t06 zV>0$Gh~d5T!8$6E54Q9{ZJ43G`llI6!A_odf8nJ8ar+1NFOYQqQhP_&=zsNw(_>k& z>71=%%sgp;O-q;(P7`|wAjT5pWO-_aiB1H>Num_+*07ol9Y-plB!vv{w8<*fA5Kc3 zoSNEio>5mUueriY#mN92#Qkm9yHLYiiTTw&n>s13qI$OgUODJC*^@dC3$LmpYJh1W zZ==Kgf}?V{^8IY!ywS2^TO^l5BO-IV8d6?=O@1@S8}L!{{758lcYN9W7*owANEzqX z*dl+#bYg>2C_q+f3QPm`3uGtb=%SAQ6o2&=yknw3;w+^lF<;%*35EF=Ns(pG^7J&XQcCOtQk`~=l8TEFdtp~6}oeo>H|TzbI(I8o(n(W`PJ)PpFjB< zA)HefShQ*l+x^_bI2Fh!6jlX-AQD_i!`6>h63N=@Mtx_ra}da(N6=T#{l^c;rXDlO zu4^*N6Ol~@_mKVe4K`aFz2!_rXZpBZ z4W}9Fs2i@1J~`>fN_!mx0#=tMPNV>94w?)}M{(1g0*7Vaq(mlIE<9U!y;0K*_I6l! zYJ}u|Ht`R!F7AysV<)ivAIACamv@N)SVQpY8O*z+8mh23)lYgjM_o>Yl1Fq@UE1ANavyYzL!(}!2-o3M&&+Tn&osc~jDPvK`hA%lP|nBTeOuM?-@Ph7YGO2k-irsn zowu2ez`gxS1xP&6g+u85NYFQLEG!gk+%Atn^6@f#fLnDH+~1}4XPc^EXs?kJCDxvN zzJ-AghJ8aCrS4flG$v&S0}@`1F-`MW($-u3K29rqbF2~Qu<)Q{_Bi{l4Le{hcN=S^ z^jwbp#zt?}pfb^bLFRqco_JB;K``UKwHl>FBNdvKuex^K z2sHQNy!POvw05p2F1+6p)5!YM3Pz9iy4L>18k;GL?^Y?rs1Ka5opOBknks@Sj2 z*iACQw8K$b8uOrY)9jyLht8x|FA`F@)>sYdKurH~APFO!zJn2W6KlYEW;@B?vl!30 z(aGse>jL-CT85YtVNiJS*ZTX~RDROcA6j~q5;3oJG8iDWF^>*H5I~`P$rp;QYq=6d z9v?zq>Z|{ubx{hH=~TG;^TPu>GW=_Ht1dg5rvR_^H*^@r*03ED zW*=f5UfLyJ+$BFe_Qj8r;}3k>`ZfQyjA5BtPn8Jd-Qug+whQZ7mVue~k}g8nYuFcS ztnMtDp8$yxVRpDm_?5^I`OEdcs$5&eagV%|FP)W>Q{bH3pM72oI0*|bNBf<$N>qY3RXc4am=lBYnk$orc&J$C|lt&^j;X7(vSrCM|sU$EmV>^pZwoOf4*If9@~;I^U*2~@K+>8dTQo@*0^P2U8M64TkZ+5xV*!yXcK!^A1ZEX)>FTQ zAQtIKl0bV&6W^^fgU8cRCInxBP_d@~&8Ypgl&$v{QhE*54+3^QX?8qGQ4%c_+{FIK z-(fX9{|Z&mR!~gD(48X7N`6)avZ*X})}H-m6rZ*TUBx2BBCzVGA<}(>XSi$z{L&|Y zkM6leuq^Hw{x97S`F`!)L8;Q+1gppvPoEmoD~7|!;+EG(17aJ}kIL(JKpHfcAm@Fq zveb0+9KzdC@62rM$}0EX%WxTR$KMSetdz@Y#42fF&GUetk(E+Kn|`CNc`px#BR&9| zuCDl>eJ`jrC@+m4c|24NWlhiQOqeJxMAE{vHh0MIyy4=Y{ZDp_$M0j#6T6{m={w6EGdsuB-{~yg|A~bT!t*G9?KFXm0E#90CYFw-3{*{Up{mYN-JE!l?=iWOGXkct#r7=APPKN=kAN~VV zbDi*{nX2w5U@{?EB7;I$Cs!m`96?tSXiDT_@o6CPG@>cmWo$46oroThLjCU${<(p!8NB$pOpJ0su diff --git a/extra/resources/star1.png b/extra/resources/star1.png deleted file mode 100644 index b7b880840e41d74658d9b133b184eb9a644c46fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmV-{0e=38P)H@Gq*`(bdOaM$knE-VH+6kIYP#6G-5yAxNgB|s-P<-d4N+0q+ zIgaiB|Ic@}v%0Ps5_f~Lj{-&k|3Sc{uZ2#R>+i>V-Mr2bI9;yDSHRRVUloDS9XN-g zKL<9zGf?&}z+(d(J;6C3|HSA#ML-VheEZ;qeEGgSg&ZK$+y&n46!=!GIS0zWNW#W- z3_0A+n`8mP&6{HQ4k#KCF(IlgXcqI(-rps#z(o$YeKx2fAjk_PIlvPxXI8W%sU-&< zfTdwPIQLcCfM^*C_u6th1Mk4rw_Bk-2MSzBV>kda*%2#8%R#gjBo)60lZ?uThBQUM zYs 1 do - s.t = s.t - 1 + + local function update_hearts(dt) + for i,v in ipairs(hearts) do + v.position = v.position + v.speed*dt*0.6 end end - - local function draw_star(s) - - local x = s.x0 + s.x * s.t - local y = s.y - local r = s.r0 + s.rv * s.t - local sx = s.scale - local sy = s.scale - - love.graphics.setColor(255*s.scale, 255*s.scale, 255, 255*s.scale) - love.graphics.draw(star1, x, y, r, sx, sy, 16, 16) - end - - local function update_star_layer(dt, layer) - for k,v in ipairs(layer) do - update_star(dt, v) + + local function draw_hearts() + for i,v in ipairs(hearts) do + local x = math.cos(v.position) * v.radius + cx + local y = math.sin(v.position) * v.radius + cy + love.graphics.setColor(255, 255, 255, v.opacity*255) + love.graphics.draw(heart_image, x, y, v.position+0.4, 1, 1, 32, 32) end end - - local function draw_star_layer(layer) - for k,v in ipairs(layer) do - draw_star(v) - end + + local function draw_pig(p) + love.graphics.setColor(255, 255, 255, 255) + love.graphics.draw(p.img, p.x, p.y, 0, 1, 1, 128, 128) end - local function create_knoll(p) - return { - p = p, - t0 = math.random() * 10, - t = 0 - } + local function loadimage(file, name) + return love.graphics.newImage(love.image.newImageData(love.filesystem.newFileData(file, name:gsub("_", "."), "base64"))) end - - local function create_knolls(n) - local t = {} - for i = 1,n do - table.insert(t, create_knoll((math.pi * 2 / n) * i)) - end - return t - end - - local function update_knoll(dt, k) - k.t = k.t + dt - end - - local function draw_knoll(k) - local x = planet.x - local y = planet.y - local a = k.p + k.t - local h = 225 + 20 * (1 + math.sin(k.t0 + k.t)) - love.graphics.draw(knoll1, x, y, a, .75, .75, 64, h) - end - - local function update_logo(dt) - logo.r = logo.r + dt - if logo.r > 360 then logo.r = logo.r - 360 end - logo.y = planet.y - end - - local function update_planet(dt) - planet.t = planet.t + dt - planet.y = 300 + math.sin(planet.t)*30 - end - - local function load_image_b64(b64, filename) - local file_data = love.filesystem.newFileData(b64, filename, "base64") - local image_data = love.image.newImageData(file_data) - return love.graphics.newImage(image_data) - end - + function love.load() - - planet = { - x = 400, - y = 300, - w = 128, - h = 128, - t = 0, - img = load_image_b64(planet_base64, "planet.png") - } - - logo = { - x = 400, - y = 300, - w = 256, - h = 64, - r = 0, - img = load_image_b64(love_base64, "love.png") - } - - love.graphics.setBackgroundColor(18, 18, 18) - star1 = load_image_b64(star1_base64, "star1.png") - knoll1 = load_image_b64(knoll1_base64, "knoll1.png") - - layers = {} - knolls = create_knolls(10) - - -- Add star layers. - table.insert(layers, create_star_layer(100, 0.5, 0.5)) - table.insert(layers, create_star_layer(70, 0.7, 0.7)) - table.insert(layers, create_star_layer(50, 1, 1)) - math.randomseed(os.time()) - + pig = { + x = cx, + y = cy, + img = loadimage(pig_png, "pig.png") + } + heart_image = loadimage(heart_png, "heart.png") + + add_heart_ring(100, 10, 2.4) + add_heart_ring(150, 20, 2.2) + add_heart_ring(200, 25, 2.0) + add_heart_ring(250, 35, 1.8) + add_heart_ring(300, 40, 1.6) + add_heart_ring(350, 50, 1.4) + add_heart_ring(400, 60, 1.2) + add_heart_ring(450, 70, 1) end - - function love.draw() - for k, v in ipairs(layers) do - draw_star_layer(v) - end - - for k, v in ipairs(knolls) do - draw_knoll(v) - end - - love.graphics.draw(planet.img, planet.x, planet.y, 0, 1, 1, planet.w, planet.h) - love.graphics.draw(logo.img, logo.x, logo.y, logo.r, 1, 1, logo.w/2, logo.h/2) - end - + function love.update(dt) - for k, v in ipairs(layers) do - update_star_layer(dt, v) + update_hearts(dt) + end + + function love.draw() + love.graphics.setBackgroundColor(254, 224, 238) + draw_hearts() + draw_pig(pig) + end + + function love.keyreleased(key) + if key == "escape" then + love.event.push("q") end - for k, v in ipairs(knolls) do - update_knoll(dt, v) - end - update_planet(dt) - update_logo(dt) end function love.conf(t) - t.title = "LOVE " .. love._version_string .. " (" .. love._version_codename .. ")" - t.modules.audio = false - t.modules.sound = false - t.modules.physics = false - t.modules.joystick = false - end - + t.title = "LOVE " .. love._version_string .. " (" .. love._version_codename .. ")" + t.modules.audio = false + t.modules.sound = false + t.modules.physics = false + t.modules.joystick = false + end end ----------------------------------------------------------- diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 360af1bef..ccaa60479 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -602,1351 +602,933 @@ const unsigned char boot_lua[] = 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, - 0x6d, 0x65, 0x28, 0x29, 0x0a,0x0a, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, - 0x34, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 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, 0x43, 0x37, 0x6d, 0x6c, 0x44, 0x51, 0x31, - 0x42, 0x4a, 0x51, 0x30, 0x4d, 0x67, 0x55, 0x48, 0x4a, 0x76, 0x5a, 0x6d, 0x6c, 0x73, 0x5a, 0x51, 0x41, 0x41, 0x0a, - 0x65, 0x41, 0x47, 0x46, 0x56, 0x4d, 0x39, 0x72, 0x45, 0x30, 0x45, 0x55, 0x2f, 0x6a, 0x5a, 0x75, 0x71, 0x64, - 0x41, 0x69, 0x43, 0x46, 0x70, 0x72, 0x44, 0x72, 0x4a, 0x34, 0x6b, 0x43, 0x4a, 0x4a, 0x57, 0x61, 0x74, 0x6f, - 0x52, 0x64, 0x51, 0x32, 0x2f, 0x52, 0x46, 0x69, 0x61, 0x77, 0x7a, 0x62, 0x48, 0x37, 0x5a, 0x46, 0x6b, 0x47, - 0x51, 0x7a, 0x53, 0x64, 0x5a, 0x75, 0x4e, 0x75, 0x76, 0x75, 0x4a, 0x72, 0x57, 0x6c, 0x69, 0x4f, 0x54, 0x69, 0x0a, - 0x30, 0x53, 0x72, 0x65, 0x52, 0x65, 0x32, 0x68, 0x42, 0x2f, 0x2b, 0x41, 0x48, 0x6e, 0x72, 0x77, 0x5a, 0x43, - 0x39, 0x4b, 0x68, 0x56, 0x70, 0x46, 0x4b, 0x4e, 0x36, 0x72, 0x4b, 0x47, 0x4b, 0x68, 0x46, 0x79, 0x33, 0x78, - 0x7a, 0x57, 0x35, 0x4d, 0x74, 0x71, 0x58, 0x71, 0x77, 0x4d, 0x35, 0x2b, 0x38, 0x39, 0x34, 0x33, 0x37, 0x33, - 0x31, 0x76, 0x64, 0x74, 0x38, 0x41, 0x44, 0x58, 0x4c, 0x53, 0x4e, 0x50, 0x57, 0x41, 0x42, 0x4f, 0x51, 0x4e, 0x0a, - 0x78, 0x31, 0x4b, 0x69, 0x45, 0x57, 0x6c, 0x73, 0x66, 0x45, 0x4a, 0x71, 0x2f, 0x49, 0x67, 0x41, 0x6a, 0x71, - 0x49, 0x4a, 0x51, 0x54, 0x51, 0x6c, 0x56, 0x64, 0x76, 0x73, 0x54, 0x69, 0x51, 0x47, 0x51, 0x59, 0x4e, 0x7a, - 0x2b, 0x58, 0x76, 0x6e, 0x32, 0x48, 0x6f, 0x50, 0x67, 0x56, 0x74, 0x57, 0x77, 0x33, 0x76, 0x37, 0x64, 0x37, - 0x4a, 0x33, 0x72, 0x5a, 0x72, 0x53, 0x74, 0x70, 0x6f, 0x48, 0x68, 0x50, 0x31, 0x41, 0x34, 0x45, 0x65, 0x61, 0x0a, - 0x32, 0x53, 0x71, 0x77, 0x37, 0x78, 0x64, 0x78, 0x43, 0x6c, 0x6b, 0x53, 0x41, 0x6f, 0x67, 0x38, 0x33, 0x36, - 0x45, 0x70, 0x78, 0x33, 0x51, 0x49, 0x33, 0x2b, 0x50, 0x59, 0x38, 0x75, 0x79, 0x50, 0x4f, 0x55, 0x35, 0x35, - 0x65, 0x4d, 0x47, 0x31, 0x44, 0x79, 0x73, 0x39, 0x78, 0x46, 0x6b, 0x69, 0x66, 0x45, 0x41, 0x31, 0x4c, 0x63, - 0x35, 0x2f, 0x54, 0x62, 0x68, 0x54, 0x7a, 0x53, 0x58, 0x54, 0x51, 0x49, 0x4e, 0x49, 0x4f, 0x4a, 0x54, 0x31, 0x0a, - 0x63, 0x56, 0x49, 0x2b, 0x6e, 0x4e, 0x65, 0x4c, 0x6c, 0x4e, 0x63, 0x64, 0x42, 0x32, 0x6c, 0x75, 0x5a, 0x73, - 0x62, 0x49, 0x45, 0x4c, 0x31, 0x50, 0x6b, 0x4b, 0x61, 0x37, 0x7a, 0x4f, 0x36, 0x72, 0x59, 0x71, 0x47, 0x63, - 0x54, 0x76, 0x59, 0x4f, 0x6b, 0x4c, 0x32, 0x64, 0x39, 0x48, 0x35, 0x4f, 0x73, 0x39, 0x34, 0x2b, 0x77, 0x69, - 0x48, 0x43, 0x43, 0x78, 0x6d, 0x74, 0x50, 0x30, 0x61, 0x34, 0x6a, 0x5a, 0x37, 0x31, 0x6a, 0x4e, 0x55, 0x2f, 0x0a, - 0x34, 0x6d, 0x48, 0x68, 0x70, 0x4f, 0x62, 0x45, 0x68, 0x6a, 0x30, 0x63, 0x47, 0x44, 0x58, 0x30, 0x2b, 0x47, - 0x41, 0x56, 0x74, 0x78, 0x71, 0x70, 0x2b, 0x44, 0x58, 0x43, 0x46, 0x46, 0x38, 0x51, 0x54, 0x53, 0x65, 0x69, - 0x56, 0x48, 0x48, 0x5a, 0x4c, 0x67, 0x33, 0x78, 0x6d, 0x4b, 0x37, 0x39, 0x56, 0x76, 0x4a, 0x4b, 0x67, 0x6e, - 0x43, 0x51, 0x4f, 0x4d, 0x70, 0x6b, 0x59, 0x59, 0x42, 0x7a, 0x57, 0x6b, 0x68, 0x50, 0x31, 0x30, 0x78, 0x75, 0x0a, - 0x2b, 0x4c, 0x71, 0x48, 0x42, 0x58, 0x30, 0x6d, 0x31, 0x78, 0x4f, 0x76, 0x34, 0x6e, 0x64, 0x57, 0x55, 0x65, - 0x46, 0x35, 0x6a, 0x78, 0x4e, 0x6e, 0x33, 0x74, 0x54, 0x64, 0x37, 0x30, 0x58, 0x61, 0x41, 0x71, 0x38, 0x77, - 0x44, 0x68, 0x30, 0x4d, 0x47, 0x67, 0x79, 0x61, 0x44, 0x55, 0x68, 0x51, 0x45, 0x45, 0x55, 0x45, 0x59, 0x5a, - 0x69, 0x77, 0x55, 0x45, 0x43, 0x47, 0x50, 0x42, 0x6f, 0x78, 0x4e, 0x4c, 0x4a, 0x79, 0x50, 0x79, 0x4f, 0x72, 0x0a, - 0x42, 0x68, 0x75, 0x54, 0x65, 0x7a, 0x4a, 0x31, 0x4a, 0x47, 0x71, 0x37, 0x64, 0x47, 0x4a, 0x45, 0x73, 0x55, - 0x46, 0x37, 0x4e, 0x74, 0x77, 0x39, 0x74, 0x31, 0x47, 0x6b, 0x33, 0x54, 0x7a, 0x2b, 0x4b, 0x43, 0x4a, 0x78, - 0x6c, 0x45, 0x4f, 0x31, 0x43, 0x4a, 0x4c, 0x38, 0x51, 0x66, 0x34, 0x71, 0x72, 0x38, 0x6c, 0x50, 0x35, 0x58, - 0x6e, 0x35, 0x79, 0x31, 0x79, 0x77, 0x32, 0x46, 0x62, 0x33, 0x6c, 0x4b, 0x32, 0x62, 0x6d, 0x72, 0x72, 0x79, 0x0a, - 0x34, 0x44, 0x76, 0x46, 0x35, 0x5a, 0x6d, 0x35, 0x47, 0x68, 0x37, 0x58, 0x30, 0x38, 0x6a, 0x6a, 0x63, 0x30, - 0x31, 0x65, 0x66, 0x4a, 0x58, 0x55, 0x64, 0x70, 0x4e, 0x58, 0x52, 0x35, 0x61, 0x73, 0x65, 0x58, 0x71, 0x38, - 0x6d, 0x75, 0x77, 0x61, 0x50, 0x2b, 0x78, 0x58, 0x6c, 0x7a, 0x48, 0x6d, 0x67, 0x6a, 0x57, 0x50, 0x78, 0x48, - 0x4f, 0x77, 0x2b, 0x2f, 0x45, 0x74, 0x58, 0x35, 0x58, 0x4d, 0x6c, 0x79, 0x6d, 0x4d, 0x46, 0x4d, 0x58, 0x6a, 0x0a, - 0x56, 0x66, 0x50, 0x71, 0x53, 0x34, 0x52, 0x31, 0x57, 0x6a, 0x45, 0x33, 0x33, 0x35, 0x39, 0x73, 0x66, 0x7a, - 0x73, 0x39, 0x34, 0x69, 0x37, 0x50, 0x4c, 0x72, 0x58, 0x57, 0x63, 0x36, 0x32, 0x4a, 0x69, 0x7a, 0x64, 0x57, - 0x6d, 0x35, 0x64, 0x6e, 0x2f, 0x57, 0x70, 0x49, 0x2b, 0x2b, 0x36, 0x71, 0x76, 0x4a, 0x50, 0x6d, 0x56, 0x66, - 0x6c, 0x50, 0x58, 0x76, 0x58, 0x78, 0x2f, 0x47, 0x66, 0x4e, 0x78, 0x47, 0x50, 0x69, 0x4b, 0x54, 0x45, 0x6d, 0x0a, - 0x64, 0x6f, 0x72, 0x6e, 0x49, 0x59, 0x6d, 0x58, 0x78, 0x53, 0x37, 0x78, 0x6b, 0x74, 0x68, 0x4c, 0x71, 0x77, - 0x76, 0x69, 0x59, 0x47, 0x33, 0x48, 0x43, 0x4a, 0x32, 0x56, 0x68, 0x69, 0x6e, 0x53, 0x62, 0x5a, 0x48, 0x36, - 0x4a, 0x4e, 0x56, 0x67, 0x59, 0x4a, 0x71, 0x38, 0x39, 0x53, 0x39, 0x64, 0x50, 0x31, 0x74, 0x34, 0x76, 0x55, - 0x5a, 0x2f, 0x44, 0x50, 0x56, 0x52, 0x6c, 0x42, 0x6e, 0x4d, 0x30, 0x6c, 0x53, 0x4a, 0x39, 0x33, 0x2f, 0x43, 0x0a, - 0x4b, 0x6d, 0x51, 0x30, 0x6e, 0x62, 0x6b, 0x4f, 0x62, 0x2f, 0x71, 0x50, 0x32, 0x38, 0x66, 0x38, 0x46, 0x2b, - 0x54, 0x33, 0x69, 0x75, 0x65, 0x66, 0x4b, 0x41, 0x49, 0x76, 0x62, 0x4f, 0x44, 0x49, 0x6d, 0x62, 0x70, 0x74, - 0x55, 0x33, 0x48, 0x76, 0x45, 0x4b, 0x46, 0x6c, 0x70, 0x57, 0x35, 0x7a, 0x72, 0x67, 0x49, 0x58, 0x76, 0x39, - 0x46, 0x39, 0x38, 0x4c, 0x5a, 0x75, 0x61, 0x36, 0x4e, 0x2b, 0x4f, 0x50, 0x77, 0x45, 0x57, 0x44, 0x79, 0x72, 0x0a, - 0x46, 0x71, 0x31, 0x53, 0x4e, 0x5a, 0x38, 0x67, 0x76, 0x41, 0x45, 0x63, 0x64, 0x6f, 0x64, 0x36, 0x48, 0x75, - 0x67, 0x70, 0x6d, 0x4e, 0x4f, 0x57, 0x6c, 0x73, 0x30, 0x35, 0x55, 0x6f, 0x63, 0x73, 0x6e, 0x35, 0x4f, 0x36, - 0x36, 0x63, 0x70, 0x69, 0x55, 0x73, 0x78, 0x51, 0x32, 0x30, 0x4e, 0x53, 0x55, 0x74, 0x63, 0x6c, 0x31, 0x32, - 0x56, 0x4c, 0x46, 0x72, 0x4f, 0x5a, 0x56, 0x57, 0x4c, 0x70, 0x64, 0x74, 0x69, 0x5a, 0x30, 0x78, 0x31, 0x75, 0x0a, - 0x48, 0x4b, 0x45, 0x35, 0x51, 0x76, 0x66, 0x45, 0x70, 0x30, 0x70, 0x6c, 0x6b, 0x2f, 0x71, 0x76, 0x38, 0x52, - 0x47, 0x77, 0x2f, 0x62, 0x42, 0x53, 0x2b, 0x66, 0x6d, 0x73, 0x55, 0x74, 0x6c, 0x2b, 0x54, 0x68, 0x72, 0x57, - 0x67, 0x5a, 0x66, 0x36, 0x62, 0x38, 0x43, 0x38, 0x2f, 0x55, 0x58, 0x41, 0x65, 0x49, 0x75, 0x4a, 0x41, 0x41, - 0x41, 0x41, 0x43, 0x58, 0x42, 0x49, 0x57, 0x58, 0x4d, 0x41, 0x41, 0x41, 0x73, 0x54, 0x41, 0x41, 0x41, 0x4c, 0x0a, - 0x45, 0x77, 0x45, 0x41, 0x6d, 0x70, 0x77, 0x59, 0x41, 0x41, 0x41, 0x4b, 0x45, 0x45, 0x6c, 0x45, 0x51, 0x56, - 0x52, 0x34, 0x41, 0x65, 0x32, 0x62, 0x61, 0x32, 0x77, 0x55, 0x31, 0x78, 0x58, 0x48, 0x7a, 0x2b, 0x79, 0x75, - 0x71, 0x59, 0x33, 0x42, 0x59, 0x4f, 0x4d, 0x51, 0x61, 0x48, 0x69, 0x6b, 0x78, 0x6a, 0x7a, 0x69, 0x4e, 0x70, - 0x41, 0x55, 0x4d, 0x49, 0x4b, 0x6b, 0x77, 0x71, 0x56, 0x53, 0x68, 0x49, 0x54, 0x55, 0x79, 0x6c, 0x58, 0x56, 0x0a, - 0x56, 0x71, 0x6f, 0x71, 0x52, 0x61, 0x71, 0x45, 0x43, 0x46, 0x43, 0x70, 0x4c, 0x53, 0x4a, 0x53, 0x50, 0x79, - 0x56, 0x52, 0x50, 0x30, 0x51, 0x69, 0x55, 0x6c, 0x73, 0x56, 0x62, 0x45, 0x64, 0x52, 0x50, 0x31, 0x53, 0x4b, - 0x2b, 0x69, 0x47, 0x4b, 0x57, 0x74, 0x52, 0x55, 0x53, 0x47, 0x33, 0x56, 0x68, 0x78, 0x49, 0x6c, 0x63, 0x62, - 0x7a, 0x47, 0x45, 0x46, 0x4a, 0x6b, 0x31, 0x6d, 0x76, 0x41, 0x42, 0x76, 0x78, 0x65, 0x76, 0x4c, 0x62, 0x58, 0x0a, - 0x33, 0x76, 0x55, 0x2b, 0x35, 0x2f, 0x62, 0x63, 0x54, 0x55, 0x31, 0x32, 0x5a, 0x32, 0x62, 0x78, 0x47, 0x74, - 0x74, 0x6e, 0x7a, 0x39, 0x72, 0x6e, 0x66, 0x74, 0x6d, 0x39, 0x64, 0x2b, 0x37, 0x4d, 0x4f, 0x66, 0x64, 0x2f, - 0x66, 0x6e, 0x76, 0x75, 0x7a, 0x4a, 0x32, 0x37, 0x68, 0x6c, 0x49, 0x4b, 0x70, 0x43, 0x78, 0x66, 0x42, 0x56, - 0x7a, 0x4c, 0x64, 0x2b, 0x67, 0x79, 0x63, 0x71, 0x32, 0x41, 0x41, 0x4c, 0x44, 0x4d, 0x4f, 0x52, 0x41, 0x41, 0x0a, - 0x42, 0x49, 0x42, 0x6c, 0x72, 0x73, 0x41, 0x79, 0x48, 0x37, 0x35, 0x6b, 0x41, 0x41, 0x46, 0x67, 0x6d, 0x53, - 0x75, 0x77, 0x7a, 0x49, 0x63, 0x76, 0x47, 0x55, 0x41, 0x41, 0x57, 0x4f, 0x59, 0x4b, 0x4c, 0x50, 0x50, 0x68, - 0x65, 0x35, 0x62, 0x79, 0x2b, 0x4e, 0x73, 0x37, 0x6d, 0x7a, 0x65, 0x59, 0x62, 0x6e, 0x67, 0x65, 0x46, 0x4f, - 0x77, 0x46, 0x51, 0x32, 0x30, 0x48, 0x4d, 0x4a, 0x37, 0x45, 0x38, 0x64, 0x59, 0x41, 0x71, 0x45, 0x72, 0x38, 0x0a, - 0x7a, 0x43, 0x77, 0x39, 0x65, 0x43, 0x79, 0x49, 0x37, 0x64, 0x63, 0x4d, 0x4d, 0x47, 0x34, 0x72, 0x55, 0x33, - 0x6e, 0x4e, 0x31, 0x66, 0x45, 0x50, 0x44, 0x32, 0x37, 0x36, 0x2b, 0x58, 0x52, 0x6d, 0x70, 0x36, 0x58, 0x34, - 0x33, 0x56, 0x68, 0x4b, 0x4b, 0x34, 0x47, 0x74, 0x66, 0x62, 0x38, 0x70, 0x63, 0x30, 0x2b, 0x56, 0x4e, 0x49, - 0x4c, 0x68, 0x4f, 0x71, 0x49, 0x4d, 0x4f, 0x41, 0x78, 0x4b, 0x31, 0x63, 0x34, 0x76, 0x61, 0x45, 0x59, 0x48, 0x0a, - 0x43, 0x76, 0x51, 0x2b, 0x77, 0x6e, 0x4f, 0x70, 0x66, 0x75, 0x66, 0x70, 0x66, 0x38, 0x2f, 0x76, 0x57, 0x6a, - 0x7a, 0x50, 0x58, 0x68, 0x49, 0x41, 0x65, 0x50, 0x31, 0x4e, 0x6a, 0x57, 0x44, 0x43, 0x6a, 0x7a, 0x48, 0x6f, - 0x6a, 0x59, 0x73, 0x6c, 0x4d, 0x32, 0x61, 0x47, 0x43, 0x57, 0x57, 0x6f, 0x64, 0x38, 0x42, 0x30, 0x76, 0x58, - 0x56, 0x67, 0x31, 0x30, 0x73, 0x64, 0x69, 0x32, 0x57, 0x48, 0x2b, 0x72, 0x70, 0x46, 0x44, 0x59, 0x43, 0x33, 0x0a, - 0x75, 0x2b, 0x57, 0x59, 0x53, 0x70, 0x6e, 0x6e, 0x77, 0x49, 0x41, 0x36, 0x59, 0x75, 0x48, 0x65, 0x4d, 0x31, - 0x50, 0x47, 0x6d, 0x59, 0x4e, 0x31, 0x4a, 0x32, 0x38, 0x53, 0x32, 0x31, 0x31, 0x77, 0x63, 0x30, 0x55, 0x4a, - 0x51, 0x4b, 0x76, 0x2f, 0x66, 0x4c, 0x31, 0x62, 0x75, 0x56, 0x37, 0x48, 0x31, 0x31, 0x68, 0x48, 0x46, 0x6c, - 0x79, 0x52, 0x75, 0x56, 0x33, 0x77, 0x37, 0x52, 0x56, 0x75, 0x38, 0x38, 0x79, 0x7a, 0x74, 0x54, 0x38, 0x4e, 0x0a, - 0x7a, 0x4f, 0x30, 0x30, 0x50, 0x72, 0x32, 0x4c, 0x43, 0x6f, 0x42, 0x57, 0x2f, 0x35, 0x74, 0x50, 0x75, 0x4d, - 0x33, 0x55, 0x2b, 0x58, 0x78, 0x54, 0x66, 0x53, 0x49, 0x56, 0x68, 0x39, 0x42, 0x30, 0x45, 0x4d, 0x4c, 0x78, - 0x45, 0x45, 0x53, 0x54, 0x59, 0x59, 0x67, 0x6c, 0x6f, 0x68, 0x42, 0x4c, 0x52, 0x69, 0x46, 0x70, 0x4a, 0x72, - 0x49, 0x69, 0x38, 0x43, 0x56, 0x50, 0x47, 0x58, 0x68, 0x63, 0x48, 0x6c, 0x69, 0x35, 0x59, 0x6a, 0x57, 0x55, 0x0a, - 0x65, 0x6b, 0x71, 0x68, 0x76, 0x48, 0x51, 0x74, 0x72, 0x43, 0x6d, 0x74, 0x41, 0x73, 0x50, 0x49, 0x37, 0x79, - 0x6e, 0x5a, 0x41, 0x47, 0x68, 0x4a, 0x6c, 0x63, 0x66, 0x50, 0x46, 0x4f, 0x4e, 0x4e, 0x59, 0x39, 0x45, 0x41, - 0x34, 0x4f, 0x31, 0x71, 0x4f, 0x61, 0x48, 0x41, 0x62, 0x4d, 0x6d, 0x4b, 0x6e, 0x45, 0x4e, 0x6c, 0x4f, 0x68, - 0x47, 0x47, 0x2b, 0x31, 0x4d, 0x44, 0x45, 0x49, 0x79, 0x4d, 0x77, 0x48, 0x51, 0x38, 0x37, 0x4e, 0x41, 0x6a, 0x0a, - 0x76, 0x79, 0x59, 0x64, 0x2f, 0x41, 0x6f, 0x45, 0x6f, 0x57, 0x72, 0x6c, 0x65, 0x6c, 0x68, 0x58, 0x76, 0x68, - 0x45, 0x38, 0x37, 0x70, 0x4a, 0x5a, 0x54, 0x6a, 0x53, 0x36, 0x58, 0x59, 0x5a, 0x36, 0x61, 0x66, 0x2b, 0x4f, - 0x55, 0x2f, 0x2b, 0x61, 0x70, 0x53, 0x4f, 0x72, 0x77, 0x2b, 0x77, 0x42, 0x2b, 0x4c, 0x54, 0x33, 0x74, 0x32, - 0x74, 0x6a, 0x30, 0x5a, 0x49, 0x57, 0x6e, 0x4f, 0x64, 0x2f, 0x2b, 0x44, 0x44, 0x6c, 0x67, 0x70, 0x46, 0x68, 0x0a, - 0x36, 0x42, 0x2f, 0x76, 0x67, 0x58, 0x41, 0x73, 0x39, 0x4c, 0x42, 0x75, 0x6a, 0x33, 0x51, 0x4d, 0x62, 0x77, - 0x43, 0x68, 0x73, 0x72, 0x77, 0x61, 0x4e, 0x6c, 0x64, 0x75, 0x68, 0x37, 0x4b, 0x53, 0x56, 0x62, 0x4e, 0x64, - 0x34, 0x34, 0x30, 0x44, 0x4f, 0x30, 0x2b, 0x39, 0x50, 0x46, 0x73, 0x6e, 0x4c, 0x73, 0x64, 0x5a, 0x41, 0x2b, - 0x44, 0x74, 0x75, 0x72, 0x41, 0x50, 0x38, 0x2f, 0x41, 0x66, 0x63, 0x4d, 0x2f, 0x4b, 0x56, 0x33, 0x4d, 0x4a, 0x0a, - 0x4e, 0x68, 0x55, 0x64, 0x68, 0x7a, 0x76, 0x42, 0x4c, 0x70, 0x69, 0x4d, 0x54, 0x65, 0x54, 0x71, 0x73, 0x6d, - 0x44, 0x74, 0x47, 0x6f, 0x54, 0x71, 0x56, 0x52, 0x73, 0x52, 0x68, 0x46, 0x70, 0x59, 0x67, 0x56, 0x4e, 0x46, - 0x72, 0x6f, 0x4c, 0x39, 0x50, 0x6f, 0x34, 0x4d, 0x42, 0x67, 0x34, 0x33, 0x4e, 0x4c, 0x79, 0x53, 0x7a, 0x4e, - 0x57, 0x48, 0x53, 0x7a, 0x74, 0x62, 0x41, 0x44, 0x37, 0x78, 0x58, 0x57, 0x67, 0x77, 0x4d, 0x50, 0x67, 0x6f, 0x0a, - 0x31, 0x46, 0x59, 0x6e, 0x73, 0x58, 0x53, 0x71, 0x76, 0x78, 0x76, 0x30, 0x77, 0x31, 0x69, 0x45, 0x2f, 0x76, - 0x37, 0x4c, 0x5a, 0x62, 0x68, 0x68, 0x51, 0x38, 0x56, 0x6d, 0x65, 0x47, 0x4a, 0x4e, 0x44, 0x62, 0x6a, 0x64, - 0x4f, 0x64, 0x62, 0x53, 0x46, 0x4c, 0x52, 0x35, 0x56, 0x45, 0x6e, 0x6a, 0x33, 0x71, 0x65, 0x4f, 0x44, 0x7a, - 0x72, 0x35, 0x7a, 0x36, 0x57, 0x4e, 0x4a, 0x51, 0x44, 0x74, 0x2f, 0x71, 0x5a, 0x76, 0x6d, 0x51, 0x72, 0x65, 0x0a, - 0x51, 0x5a, 0x48, 0x57, 0x4f, 0x51, 0x6e, 0x56, 0x50, 0x33, 0x34, 0x4c, 0x2b, 0x73, 0x5a, 0x75, 0x34, 0x77, - 0x4a, 0x66, 0x59, 0x62, 0x65, 0x7a, 0x6c, 0x62, 0x68, 0x4b, 0x59, 0x4e, 0x76, 0x36, 0x70, 0x32, 0x46, 0x74, - 0x57, 0x62, 0x57, 0x54, 0x6d, 0x35, 0x69, 0x38, 0x6a, 0x4b, 0x74, 0x4a, 0x74, 0x2b, 0x76, 0x6f, 0x6f, 0x57, - 0x30, 0x6e, 0x52, 0x68, 0x77, 0x37, 0x4d, 0x47, 0x6a, 0x4d, 0x37, 0x7a, 0x61, 0x58, 0x30, 0x46, 0x47, 0x64, 0x0a, - 0x39, 0x70, 0x55, 0x79, 0x33, 0x6b, 0x61, 0x54, 0x74, 0x75, 0x41, 0x6e, 0x55, 0x77, 0x6d, 0x34, 0x4d, 0x64, - 0x51, 0x42, 0x39, 0x38, 0x5a, 0x75, 0x46, 0x54, 0x7a, 0x34, 0x57, 0x70, 0x49, 0x45, 0x50, 0x6b, 0x33, 0x34, - 0x68, 0x71, 0x36, 0x67, 0x50, 0x39, 0x31, 0x59, 0x73, 0x38, 0x4f, 0x49, 0x71, 0x36, 0x7a, 0x50, 0x75, 0x68, - 0x4f, 0x70, 0x39, 0x33, 0x52, 0x66, 0x72, 0x6f, 0x56, 0x56, 0x42, 0x76, 0x6a, 0x34, 0x31, 0x70, 0x76, 0x72, 0x0a, - 0x33, 0x63, 0x6e, 0x55, 0x2b, 0x79, 0x6a, 0x57, 0x4c, 0x71, 0x74, 0x67, 0x73, 0x65, 0x51, 0x30, 0x42, 0x76, - 0x38, 0x79, 0x52, 0x42, 0x4d, 0x38, 0x6c, 0x2b, 0x65, 0x72, 0x79, 0x68, 0x2b, 0x44, 0x37, 0x59, 0x2f, 0x74, - 0x79, 0x66, 0x48, 0x6f, 0x61, 0x44, 0x51, 0x66, 0x32, 0x48, 0x6e, 0x79, 0x6c, 0x48, 0x56, 0x4d, 0x48, 0x4f, - 0x71, 0x73, 0x4d, 0x6f, 0x41, 0x6e, 0x61, 0x56, 0x35, 0x30, 0x43, 0x76, 0x35, 0x30, 0x59, 0x67, 0x71, 0x75, 0x0a, - 0x39, 0x37, 0x65, 0x78, 0x44, 0x62, 0x34, 0x4f, 0x5a, 0x44, 0x41, 0x63, 0x67, 0x42, 0x75, 0x44, 0x6c, 0x79, - 0x47, 0x6c, 0x55, 0x67, 0x35, 0x78, 0x56, 0x53, 0x66, 0x62, 0x2f, 0x45, 0x30, 0x43, 0x67, 0x49, 0x4d, 0x79, - 0x44, 0x35, 0x72, 0x61, 0x75, 0x70, 0x72, 0x4f, 0x34, 0x5a, 0x78, 0x2b, 0x36, 0x45, 0x48, 0x44, 0x2f, 0x37, - 0x39, 0x45, 0x45, 0x78, 0x48, 0x6f, 0x48, 0x47, 0x6a, 0x48, 0x64, 0x42, 0x75, 0x33, 0x48, 0x6d, 0x4a, 0x58, 0x0a, - 0x44, 0x38, 0x58, 0x47, 0x6f, 0x57, 0x76, 0x34, 0x43, 0x72, 0x36, 0x44, 0x4d, 0x75, 0x32, 0x2b, 0x4b, 0x62, - 0x6a, 0x51, 0x37, 0x6d, 0x75, 0x32, 0x6a, 0x63, 0x2f, 0x65, 0x6b, 0x62, 0x61, 0x46, 0x52, 0x51, 0x62, 0x34, - 0x70, 0x4c, 0x76, 0x35, 0x4b, 0x52, 0x7a, 0x32, 0x57, 0x65, 0x76, 0x51, 0x39, 0x55, 0x71, 0x65, 0x62, 0x37, - 0x67, 0x6a, 0x50, 0x64, 0x64, 0x61, 0x6a, 0x33, 0x47, 0x74, 0x68, 0x36, 0x62, 0x48, 0x34, 0x47, 0x62, 0x67, 0x0a, - 0x76, 0x34, 0x37, 0x75, 0x6d, 0x51, 0x62, 0x4d, 0x75, 0x70, 0x44, 0x6c, 0x65, 0x4f, 0x49, 0x69, 0x4e, 0x72, - 0x49, 0x41, 0x77, 0x47, 0x58, 0x43, 0x37, 0x2b, 0x31, 0x6a, 0x56, 0x4e, 0x41, 0x64, 0x75, 0x4d, 0x59, 0x36, - 0x37, 0x64, 0x74, 0x39, 0x2f, 0x72, 0x78, 0x6c, 0x4e, 0x49, 0x79, 0x4c, 0x55, 0x6d, 0x4e, 0x4f, 0x37, 0x34, - 0x6e, 0x55, 0x62, 0x71, 0x2b, 0x2f, 0x2b, 0x58, 0x79, 0x75, 0x38, 0x77, 0x72, 0x52, 0x58, 0x6e, 0x41, 0x41, 0x0a, - 0x63, 0x71, 0x58, 0x2b, 0x65, 0x79, 0x69, 0x67, 0x2f, 0x6a, 0x55, 0x56, 0x61, 0x2b, 0x6e, 0x44, 0x56, 0x63, - 0x6c, 0x51, 0x31, 0x4f, 0x34, 0x2f, 0x50, 0x68, 0x6d, 0x63, 0x31, 0x68, 0x74, 0x56, 0x75, 0x49, 0x79, 0x72, - 0x6f, 0x41, 0x43, 0x38, 0x43, 0x2b, 0x2b, 0x36, 0x63, 0x64, 0x58, 0x73, 0x75, 0x46, 0x57, 0x4d, 0x53, 0x52, - 0x52, 0x75, 0x59, 0x4c, 0x7a, 0x58, 0x32, 0x6c, 0x78, 0x55, 0x64, 0x62, 0x31, 0x47, 0x6f, 0x61, 0x63, 0x43, 0x0a, - 0x70, 0x35, 0x74, 0x43, 0x33, 0x4b, 0x58, 0x45, 0x4a, 0x67, 0x73, 0x55, 0x46, 0x49, 0x43, 0x74, 0x76, 0x68, - 0x46, 0x39, 0x34, 0x37, 0x63, 0x6d, 0x4f, 0x37, 0x49, 0x4b, 0x65, 0x6b, 0x5a, 0x76, 0x73, 0x48, 0x6a, 0x4f, - 0x7a, 0x2f, 0x5a, 0x72, 0x37, 0x72, 0x55, 0x34, 0x76, 0x6e, 0x6e, 0x73, 0x78, 0x7a, 0x55, 0x4c, 0x65, 0x31, - 0x48, 0x66, 0x61, 0x2f, 0x56, 0x64, 0x65, 0x4e, 0x72, 0x65, 0x54, 0x74, 0x39, 0x53, 0x55, 0x41, 0x44, 0x77, 0x0a, - 0x6f, 0x66, 0x6b, 0x6e, 0x31, 0x69, 0x45, 0x50, 0x68, 0x2b, 0x35, 0x42, 0x4a, 0x44, 0x35, 0x6c, 0x62, 0x53, - 0x37, 0x61, 0x2b, 0x6d, 0x44, 0x6f, 0x4c, 0x74, 0x37, 0x48, 0x52, 0x47, 0x7a, 0x2b, 0x75, 0x38, 0x46, 0x34, - 0x7a, 0x64, 0x5a, 0x59, 0x67, 0x49, 0x61, 0x43, 0x41, 0x64, 0x44, 0x6d, 0x61, 0x7a, 0x70, 0x75, 0x2f, 0x66, - 0x58, 0x72, 0x78, 0x36, 0x66, 0x2b, 0x69, 0x5a, 0x34, 0x43, 0x79, 0x4c, 0x42, 0x34, 0x4a, 0x76, 0x57, 0x59, 0x0a, - 0x50, 0x6c, 0x38, 0x70, 0x7a, 0x4c, 0x61, 0x68, 0x39, 0x7a, 0x52, 0x30, 0x64, 0x50, 0x35, 0x75, 0x53, 0x33, - 0x59, 0x72, 0x66, 0x61, 0x31, 0x67, 0x41, 0x42, 0x67, 0x47, 0x76, 0x47, 0x67, 0x64, 0x37, 0x73, 0x68, 0x6b, - 0x48, 0x38, 0x53, 0x54, 0x4d, 0x57, 0x74, 0x7a, 0x30, 0x64, 0x65, 0x44, 0x59, 0x64, 0x79, 0x62, 0x67, 0x43, - 0x2b, 0x76, 0x72, 0x43, 0x58, 0x70, 0x39, 0x76, 0x7a, 0x43, 0x32, 0x6b, 0x5a, 0x64, 0x7a, 0x2f, 0x45, 0x71, 0x0a, - 0x61, 0x33, 0x48, 0x64, 0x61, 0x4f, 0x31, 0x73, 0x72, 0x6e, 0x57, 0x35, 0x34, 0x61, 0x44, 0x56, 0x79, 0x73, - 0x44, 0x45, 0x48, 0x57, 0x74, 0x54, 0x56, 0x6e, 0x33, 0x6e, 0x78, 0x75, 0x64, 0x67, 0x30, 0x37, 0x71, 0x76, - 0x34, 0x55, 0x61, 0x4e, 0x44, 0x54, 0x41, 0x53, 0x75, 0x67, 0x6b, 0x39, 0x67, 0x58, 0x59, 0x59, 0x47, 0x50, - 0x4e, 0x6e, 0x39, 0x58, 0x6e, 0x55, 0x79, 0x75, 0x71, 0x79, 0x4b, 0x74, 0x69, 0x31, 0x38, 0x54, 0x42, 0x73, 0x0a, - 0x71, 0x74, 0x71, 0x4e, 0x64, 0x2b, 0x39, 0x44, 0x30, 0x44, 0x64, 0x36, 0x48, 0x61, 0x39, 0x2f, 0x46, 0x59, - 0x47, 0x30, 0x70, 0x2b, 0x2b, 0x35, 0x32, 0x74, 0x41, 0x33, 0x68, 0x49, 0x4f, 0x68, 0x58, 0x71, 0x68, 0x5a, - 0x5a, 0x33, 0x32, 0x72, 0x72, 0x62, 0x36, 0x4e, 0x31, 0x2f, 0x72, 0x5a, 0x58, 0x4b, 0x2b, 0x33, 0x6b, 0x50, - 0x30, 0x4c, 0x38, 0x69, 0x37, 0x41, 0x32, 0x39, 0x56, 0x30, 0x46, 0x6c, 0x2b, 0x64, 0x6e, 0x4d, 0x73, 0x63, 0x0a, - 0x53, 0x43, 0x67, 0x61, 0x68, 0x45, 0x35, 0x63, 0x53, 0x6e, 0x55, 0x71, 0x4b, 0x7a, 0x77, 0x72, 0x34, 0x62, - 0x76, 0x31, 0x72, 0x38, 0x48, 0x6a, 0x46, 0x54, 0x74, 0x73, 0x68, 0x2b, 0x2f, 0x65, 0x76, 0x77, 0x4b, 0x58, - 0x50, 0x6e, 0x31, 0x6a, 0x58, 0x6f, 0x48, 0x61, 0x58, 0x39, 0x4d, 0x49, 0x68, 0x33, 0x61, 0x38, 0x61, 0x4c, - 0x74, 0x32, 0x4e, 0x42, 0x47, 0x43, 0x76, 0x33, 0x2f, 0x32, 0x61, 0x2b, 0x68, 0x46, 0x45, 0x4f, 0x5a, 0x62, 0x0a, - 0x33, 0x50, 0x67, 0x4b, 0x65, 0x65, 0x2f, 0x57, 0x42, 0x74, 0x43, 0x76, 0x6b, 0x6a, 0x4f, 0x4c, 0x71, 0x64, - 0x54, 0x75, 0x67, 0x37, 0x74, 0x4f, 0x4f, 0x36, 0x38, 0x63, 0x5a, 0x58, 0x5a, 0x63, 0x70, 0x4f, 0x38, 0x46, - 0x6d, 0x51, 0x4c, 0x77, 0x62, 0x64, 0x39, 0x68, 0x36, 0x33, 0x67, 0x43, 0x6b, 0x77, 0x50, 0x57, 0x70, 0x6e, - 0x54, 0x39, 0x59, 0x63, 0x48, 0x58, 0x48, 0x62, 0x5a, 0x55, 0x66, 0x7a, 0x30, 0x4e, 0x68, 0x2b, 0x37, 0x33, 0x0a, - 0x4b, 0x4f, 0x57, 0x35, 0x48, 0x54, 0x39, 0x79, 0x44, 0x4c, 0x36, 0x2b, 0x56, 0x6d, 0x6c, 0x4a, 0x42, 0x58, - 0x78, 0x6e, 0x37, 0x36, 0x75, 0x67, 0x4d, 0x38, 0x39, 0x38, 0x69, 0x33, 0x34, 0x63, 0x31, 0x46, 0x4f, 0x42, - 0x74, 0x62, 0x67, 0x4e, 0x34, 0x36, 0x69, 0x31, 0x6a, 0x62, 0x4a, 0x65, 0x45, 0x41, 0x44, 0x77, 0x6a, 0x78, - 0x5a, 0x48, 0x72, 0x49, 0x50, 0x4d, 0x74, 0x62, 0x48, 0x44, 0x2b, 0x73, 0x76, 0x58, 0x76, 0x30, 0x72, 0x39, 0x0a, - 0x71, 0x39, 0x65, 0x66, 0x4d, 0x30, 0x56, 0x6e, 0x42, 0x74, 0x31, 0x76, 0x72, 0x68, 0x44, 0x6f, 0x77, 0x4f, - 0x36, 0x72, 0x2b, 0x66, 0x37, 0x4d, 0x5a, 0x64, 0x4b, 0x66, 0x2b, 0x74, 0x72, 0x44, 0x6f, 0x65, 0x78, 0x70, - 0x35, 0x65, 0x69, 0x65, 0x6c, 0x78, 0x63, 0x45, 0x67, 0x6a, 0x48, 0x63, 0x70, 0x32, 0x67, 0x74, 0x6d, 0x41, - 0x6d, 0x66, 0x74, 0x37, 0x5a, 0x52, 0x31, 0x73, 0x6e, 0x76, 0x41, 0x64, 0x70, 0x38, 0x4c, 0x66, 0x67, 0x33, 0x0a, - 0x4c, 0x53, 0x6a, 0x4c, 0x48, 0x47, 0x51, 0x6b, 0x50, 0x6d, 0x6e, 0x62, 0x71, 0x61, 0x75, 0x50, 0x36, 0x39, - 0x53, 0x63, 0x6d, 0x66, 0x5a, 0x31, 0x59, 0x50, 0x37, 0x73, 0x66, 0x53, 0x57, 0x64, 0x37, 0x71, 0x32, 0x5a, - 0x51, 0x66, 0x63, 0x37, 0x39, 0x73, 0x78, 0x5a, 0x75, 0x48, 0x67, 0x35, 0x76, 0x36, 0x65, 0x72, 0x36, 0x6c, - 0x57, 0x62, 0x6f, 0x4b, 0x48, 0x75, 0x52, 0x4b, 0x59, 0x62, 0x38, 0x4c, 0x64, 0x72, 0x35, 0x36, 0x42, 0x72, 0x0a, - 0x38, 0x4b, 0x4e, 0x30, 0x32, 0x2b, 0x34, 0x74, 0x4c, 0x38, 0x41, 0x33, 0x36, 0x37, 0x35, 0x34, 0x67, 0x61, - 0x66, 0x37, 0x6a, 0x6b, 0x37, 0x65, 0x77, 0x51, 0x32, 0x6e, 0x66, 0x56, 0x6e, 0x6e, 0x7a, 0x4b, 0x55, 0x79, - 0x67, 0x54, 0x75, 0x55, 0x37, 0x63, 0x58, 0x34, 0x68, 0x72, 0x32, 0x4e, 0x72, 0x6f, 0x55, 0x2b, 0x41, 0x78, - 0x6a, 0x4b, 0x52, 0x76, 0x78, 0x45, 0x64, 0x4e, 0x51, 0x32, 0x59, 0x6e, 0x31, 0x54, 0x6c, 0x6a, 0x6b, 0x76, 0x0a, - 0x36, 0x31, 0x2f, 0x38, 0x54, 0x50, 0x42, 0x31, 0x5a, 0x33, 0x31, 0x7a, 0x70, 0x75, 0x75, 0x5a, 0x76, 0x31, - 0x59, 0x39, 0x48, 0x58, 0x79, 0x35, 0x30, 0x6e, 0x36, 0x66, 0x59, 0x4c, 0x73, 0x34, 0x4e, 0x74, 0x54, 0x58, - 0x2f, 0x69, 0x43, 0x64, 0x34, 0x6d, 0x65, 0x4f, 0x5a, 0x51, 0x5a, 0x66, 0x74, 0x33, 0x31, 0x32, 0x39, 0x78, - 0x2f, 0x77, 0x6e, 0x38, 0x36, 0x6d, 0x6d, 0x63, 0x50, 0x70, 0x76, 0x6e, 0x75, 0x65, 0x50, 0x50, 0x61, 0x67, 0x0a, - 0x2f, 0x69, 0x68, 0x66, 0x39, 0x48, 0x5a, 0x30, 0x2f, 0x57, 0x6f, 0x37, 0x75, 0x36, 0x6a, 0x4b, 0x74, 0x70, - 0x76, 0x6e, 0x36, 0x37, 0x4c, 0x62, 0x36, 0x47, 0x72, 0x30, 0x41, 0x41, 0x44, 0x73, 0x73, 0x77, 0x34, 0x76, - 0x48, 0x50, 0x30, 0x69, 0x6e, 0x56, 0x75, 0x50, 0x7a, 0x64, 0x54, 0x2f, 0x65, 0x75, 0x56, 0x58, 0x74, 0x68, - 0x73, 0x39, 0x44, 0x63, 0x47, 0x6c, 0x71, 0x36, 0x39, 0x6e, 0x54, 0x51, 0x65, 0x54, 0x30, 0x66, 0x73, 0x7a, 0x0a, - 0x70, 0x2b, 0x54, 0x39, 0x32, 0x54, 0x33, 0x30, 0x77, 0x59, 0x4e, 0x66, 0x66, 0x75, 0x5a, 0x4a, 0x47, 0x67, - 0x4a, 0x39, 0x62, 0x4b, 0x61, 0x45, 0x48, 0x46, 0x4c, 0x34, 0x7a, 0x4c, 0x46, 0x38, 0x50, 0x35, 0x31, 0x32, - 0x4c, 0x52, 0x74, 0x4a, 0x34, 0x35, 0x6c, 0x38, 0x7a, 0x31, 0x2f, 0x6f, 0x66, 0x75, 0x52, 0x54, 0x67, 0x41, - 0x46, 0x71, 0x47, 0x38, 0x35, 0x37, 0x57, 0x53, 0x57, 0x4b, 0x75, 0x33, 0x32, 0x73, 0x5a, 0x52, 0x4c, 0x54, 0x0a, - 0x35, 0x56, 0x38, 0x36, 0x58, 0x6f, 0x56, 0x74, 0x6a, 0x39, 0x66, 0x44, 0x72, 0x57, 0x46, 0x76, 0x7a, 0x73, - 0x63, 0x39, 0x33, 0x65, 0x39, 0x50, 0x62, 0x62, 0x2b, 0x45, 0x72, 0x36, 0x7a, 0x66, 0x44, 0x34, 0x48, 0x4a, - 0x58, 0x74, 0x44, 0x31, 0x66, 0x4d, 0x6f, 0x2f, 0x72, 0x37, 0x66, 0x41, 0x52, 0x47, 0x51, 0x6f, 0x33, 0x62, - 0x58, 0x39, 0x39, 0x73, 0x57, 0x63, 0x70, 0x2b, 0x68, 0x2b, 0x67, 0x64, 0x42, 0x74, 0x2f, 0x45, 0x4e, 0x4a, 0x0a, - 0x47, 0x48, 0x77, 0x44, 0x48, 0x2b, 0x62, 0x73, 0x6c, 0x2b, 0x2b, 0x42, 0x69, 0x43, 0x30, 0x44, 0x34, 0x4a, - 0x6d, 0x47, 0x71, 0x32, 0x41, 0x5a, 0x67, 0x42, 0x77, 0x41, 0x44, 0x4c, 0x37, 0x31, 0x59, 0x64, 0x68, 0x78, - 0x6b, 0x55, 0x51, 0x4c, 0x71, 0x68, 0x2b, 0x2f, 0x38, 0x6e, 0x6b, 0x45, 0x30, 0x2f, 0x50, 0x79, 0x58, 0x4f, - 0x64, 0x6d, 0x6e, 0x54, 0x30, 0x2b, 0x38, 0x76, 0x39, 0x78, 0x31, 0x72, 0x6a, 0x70, 0x66, 0x67, 0x38, 0x44, 0x0a, - 0x5a, 0x4e, 0x59, 0x4c, 0x57, 0x44, 0x72, 0x45, 0x48, 0x4a, 0x61, 0x46, 0x63, 0x54, 0x2f, 0x68, 0x64, 0x6b, - 0x73, 0x33, 0x73, 0x69, 0x72, 0x70, 0x46, 0x4e, 0x44, 0x52, 0x38, 0x64, 0x5a, 0x4b, 0x48, 0x46, 0x6c, 0x46, - 0x35, 0x75, 0x68, 0x4d, 0x66, 0x44, 0x78, 0x4b, 0x6d, 0x63, 0x6e, 0x4d, 0x70, 0x69, 0x58, 0x39, 0x50, 0x65, - 0x61, 0x38, 0x30, 0x72, 0x6d, 0x35, 0x55, 0x49, 0x4d, 0x6d, 0x42, 0x53, 0x43, 0x32, 0x31, 0x72, 0x54, 0x39, 0x0a, - 0x72, 0x53, 0x5a, 0x6c, 0x70, 0x67, 0x6f, 0x31, 0x39, 0x6f, 0x4c, 0x59, 0x54, 0x53, 0x6b, 0x37, 0x37, 0x4a, - 0x67, 0x56, 0x62, 0x62, 0x70, 0x51, 0x4f, 0x55, 0x63, 0x4b, 0x67, 0x43, 0x65, 0x5a, 0x4c, 0x4c, 0x63, 0x4f, - 0x7a, 0x48, 0x51, 0x51, 0x78, 0x4e, 0x70, 0x6e, 0x4b, 0x64, 0x57, 0x64, 0x67, 0x44, 0x63, 0x41, 0x4c, 0x4b, - 0x2f, 0x45, 0x36, 0x55, 0x5a, 0x4d, 0x43, 0x6b, 0x42, 0x4b, 0x32, 0x55, 0x6c, 0x33, 0x45, 0x6f, 0x52, 0x75, 0x0a, - 0x2b, 0x47, 0x4b, 0x4a, 0x46, 0x41, 0x43, 0x52, 0x6d, 0x35, 0x38, 0x43, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, - 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, - 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, - 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x0a, - 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, - 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, - 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, - 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x0a, - 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, - 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, - 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, - 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x0a, - 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, - 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, - 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, - 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x0a, - 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, - 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, - 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, - 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x0a, - 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, - 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, - 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, - 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x0a, - 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, - 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, - 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, - 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x0a, - 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, - 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, - 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, - 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x0a, - 0x4c, 0x79, 0x61, 0x6b, 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, - 0x73, 0x4a, 0x71, 0x55, 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, - 0x51, 0x75, 0x71, 0x52, 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, - 0x42, 0x36, 0x4a, 0x41, 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x6d, 0x41, 0x44, 0x41, 0x4c, 0x79, 0x61, 0x6b, 0x0a, - 0x48, 0x67, 0x6b, 0x41, 0x70, 0x48, 0x4c, 0x7a, 0x4d, 0x79, 0x59, 0x41, 0x38, 0x49, 0x73, 0x4a, 0x71, 0x55, - 0x63, 0x43, 0x41, 0x4b, 0x6e, 0x63, 0x2f, 0x49, 0x77, 0x4a, 0x41, 0x50, 0x78, 0x69, 0x51, 0x75, 0x71, 0x52, - 0x41, 0x45, 0x41, 0x71, 0x4e, 0x7a, 0x39, 0x6a, 0x41, 0x67, 0x43, 0x2f, 0x6d, 0x4a, 0x42, 0x36, 0x4a, 0x41, - 0x43, 0x51, 0x79, 0x73, 0x33, 0x50, 0x32, 0x50, 0x38, 0x41, 0x43, 0x2f, 0x6b, 0x64, 0x31, 0x2f, 0x36, 0x61, 0x0a, - 0x4b, 0x5a, 0x63, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, - 0x49, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x20, - 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 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, 0x42, 0x41, 0x43, 0x41, 0x59, 0x41, - 0x41, 0x41, 0x44, 0x31, 0x58, 0x61, 0x6d, 0x2b, 0x41, 0x41, 0x41, 0x41, 0x43, 0x58, 0x42, 0x49, 0x57, 0x58, - 0x4d, 0x41, 0x41, 0x41, 0x73, 0x54, 0x41, 0x41, 0x41, 0x4c, 0x45, 0x77, 0x45, 0x41, 0x6d, 0x70, 0x77, 0x59, 0x0a, - 0x41, 0x41, 0x41, 0x4c, 0x79, 0x30, 0x6c, 0x45, 0x51, 0x56, 0x52, 0x34, 0x41, 0x65, 0x32, 0x63, 0x6a, 0x31, - 0x58, 0x63, 0x4f, 0x68, 0x50, 0x46, 0x58, 0x39, 0x37, 0x35, 0x43, 0x6e, 0x41, 0x71, 0x69, 0x4b, 0x6b, 0x67, - 0x70, 0x6f, 0x4b, 0x59, 0x43, 0x6c, 0x67, 0x71, 0x77, 0x46, 0x54, 0x41, 0x70, 0x67, 0x4b, 0x57, 0x43, 0x69, - 0x41, 0x56, 0x73, 0x46, 0x54, 0x41, 0x70, 0x67, 0x4a, 0x4d, 0x42, 0x66, 0x47, 0x72, 0x41, 0x4b, 0x55, 0x43, 0x0a, - 0x33, 0x45, 0x47, 0x2b, 0x33, 0x30, 0x33, 0x73, 0x39, 0x35, 0x54, 0x42, 0x33, 0x6a, 0x39, 0x67, 0x37, 0x32, - 0x36, 0x51, 0x37, 0x6a, 0x6b, 0x33, 0x6d, 0x68, 0x6c, 0x4a, 0x4d, 0x2f, 0x4a, 0x49, 0x6d, 0x76, 0x58, 0x75, - 0x79, 0x65, 0x48, 0x64, 0x6a, 0x78, 0x38, 0x2f, 0x2f, 0x6f, 0x71, 0x49, 0x47, 0x59, 0x67, 0x5a, 0x43, 0x44, - 0x4d, 0x44, 0x66, 0x34, 0x66, 0x35, 0x32, 0x50, 0x47, 0x70, 0x59, 0x77, 0x5a, 0x69, 0x42, 0x70, 0x53, 0x42, 0x0a, - 0x57, 0x41, 0x44, 0x69, 0x4f, 0x59, 0x67, 0x5a, 0x43, 0x44, 0x67, 0x44, 0x73, 0x51, 0x41, 0x45, 0x76, 0x50, - 0x6e, 0x78, 0x30, 0x57, 0x4d, 0x47, 0x59, 0x67, 0x47, 0x49, 0x5a, 0x79, 0x42, 0x6d, 0x49, 0x4f, 0x41, 0x4d, - 0x78, 0x41, 0x49, 0x51, 0x38, 0x4f, 0x62, 0x48, 0x52, 0x34, 0x38, 0x5a, 0x69, 0x41, 0x55, 0x67, 0x6e, 0x6f, - 0x47, 0x59, 0x67, 0x59, 0x41, 0x7a, 0x38, 0x4c, 0x2b, 0x41, 0x6e, 0x2f, 0x31, 0x50, 0x65, 0x2f, 0x53, 0x4d, 0x0a, - 0x42, 0x65, 0x66, 0x51, 0x77, 0x52, 0x4c, 0x57, 0x4d, 0x4f, 0x4b, 0x76, 0x76, 0x35, 0x51, 0x58, 0x4d, 0x54, - 0x58, 0x4a, 0x63, 0x4f, 0x68, 0x69, 0x43, 0x53, 0x4e, 0x36, 0x4d, 0x68, 0x41, 0x4c, 0x51, 0x45, 0x39, 0x69, - 0x39, 0x73, 0x69, 0x63, 0x73, 0x4a, 0x59, 0x37, 0x6d, 0x48, 0x74, 0x72, 0x30, 0x75, 0x55, 0x2f, 0x67, 0x70, - 0x56, 0x6e, 0x43, 0x30, 0x6e, 0x4d, 0x65, 0x64, 0x68, 0x54, 0x4f, 0x49, 0x48, 0x4b, 0x7a, 0x79, 0x6f, 0x73, 0x0a, - 0x47, 0x50, 0x41, 0x56, 0x7a, 0x6c, 0x63, 0x4e, 0x44, 0x4b, 0x30, 0x2f, 0x66, 0x67, 0x58, 0x59, 0x2f, 0x59, - 0x35, 0x66, 0x73, 0x59, 0x51, 0x6e, 0x71, 0x50, 0x2b, 0x52, 0x70, 0x56, 0x61, 0x36, 0x44, 0x2b, 0x6d, 0x35, - 0x62, 0x30, 0x44, 0x57, 0x6f, 0x62, 0x39, 0x76, 0x57, 0x74, 0x50, 0x31, 0x70, 0x74, 0x57, 0x73, 0x65, 0x57, - 0x34, 0x39, 0x65, 0x77, 0x48, 0x58, 0x75, 0x66, 0x77, 0x4d, 0x2b, 0x31, 0x6b, 0x6f, 0x62, 0x6d, 0x67, 0x66, 0x0a, - 0x59, 0x51, 0x45, 0x6a, 0x6d, 0x67, 0x7a, 0x45, 0x41, 0x72, 0x44, 0x62, 0x6f, 0x36, 0x44, 0x4c, 0x50, 0x59, - 0x58, 0x74, 0x51, 0x56, 0x59, 0x72, 0x58, 0x59, 0x65, 0x31, 0x52, 0x64, 0x45, 0x4b, 0x70, 0x74, 0x58, 0x59, - 0x33, 0x4e, 0x6a, 0x2b, 0x4a, 0x46, 0x58, 0x50, 0x2b, 0x61, 0x4e, 0x68, 0x73, 0x63, 0x62, 0x43, 0x5a, 0x34, - 0x7a, 0x35, 0x42, 0x6e, 0x50, 0x34, 0x55, 0x71, 0x52, 0x4d, 0x56, 0x47, 0x37, 0x76, 0x6f, 0x66, 0x49, 0x58, 0x0a, - 0x50, 0x4e, 0x37, 0x46, 0x2f, 0x77, 0x71, 0x38, 0x73, 0x7a, 0x4f, 0x67, 0x41, 0x2f, 0x69, 0x30, 0x4a, 0x50, - 0x6f, 0x42, 0x66, 0x51, 0x37, 0x71, 0x6b, 0x76, 0x54, 0x68, 0x6b, 0x6f, 0x35, 0x5a, 0x58, 0x2b, 0x65, 0x65, - 0x32, 0x78, 0x39, 0x5a, 0x58, 0x39, 0x71, 0x73, 0x73, 0x61, 0x5a, 0x39, 0x33, 0x38, 0x69, 0x32, 0x55, 0x5a, - 0x37, 0x75, 0x59, 0x47, 0x34, 0x37, 0x47, 0x72, 0x32, 0x69, 0x4c, 0x65, 0x46, 0x33, 0x4b, 0x46, 0x6c, 0x49, 0x0a, - 0x47, 0x33, 0x36, 0x69, 0x7a, 0x57, 0x45, 0x58, 0x46, 0x50, 0x4d, 0x49, 0x74, 0x6e, 0x4f, 0x36, 0x78, 0x72, - 0x78, 0x35, 0x57, 0x2f, 0x77, 0x4e, 0x59, 0x48, 0x64, 0x62, 0x6e, 0x4b, 0x30, 0x49, 0x6e, 0x64, 0x4c, 0x76, - 0x6f, 0x41, 0x35, 0x71, 0x41, 0x72, 0x74, 0x51, 0x64, 0x68, 0x6e, 0x2f, 0x41, 0x4a, 0x75, 0x65, 0x50, 0x56, - 0x31, 0x6a, 0x6e, 0x58, 0x70, 0x75, 0x66, 0x56, 0x70, 0x72, 0x76, 0x4d, 0x55, 0x63, 0x77, 0x79, 0x56, 0x30, 0x0a, - 0x63, 0x42, 0x6c, 0x53, 0x4f, 0x67, 0x74, 0x34, 0x44, 0x76, 0x30, 0x38, 0x74, 0x72, 0x36, 0x44, 0x4c, 0x67, - 0x4a, 0x2f, 0x6b, 0x35, 0x53, 0x49, 0x33, 0x57, 0x53, 0x67, 0x58, 0x6a, 0x50, 0x73, 0x6c, 0x35, 0x35, 0x78, - 0x46, 0x66, 0x61, 0x79, 0x70, 0x32, 0x2f, 0x66, 0x7a, 0x62, 0x6c, 0x5a, 0x34, 0x4d, 0x4c, 0x6f, 0x72, 0x58, - 0x71, 0x44, 0x6b, 0x4c, 0x56, 0x4b, 0x30, 0x2b, 0x71, 0x35, 0x44, 0x2b, 0x45, 0x5a, 0x64, 0x48, 0x41, 0x56, 0x0a, - 0x48, 0x41, 0x4e, 0x6d, 0x38, 0x41, 0x44, 0x61, 0x4f, 0x41, 0x6b, 0x32, 0x78, 0x51, 0x67, 0x57, 0x73, 0x51, - 0x44, 0x73, 0x62, 0x75, 0x74, 0x31, 0x6b, 0x4d, 0x55, 0x75, 0x4f, 0x49, 0x78, 0x6c, 0x30, 0x7a, 0x47, 0x6a, - 0x31, 0x53, 0x64, 0x64, 0x33, 0x65, 0x68, 0x71, 0x53, 0x71, 0x68, 0x50, 0x72, 0x6b, 0x32, 0x51, 0x4d, 0x7a, - 0x6a, 0x64, 0x5a, 0x4d, 0x4b, 0x49, 0x59, 0x30, 0x2b, 0x4e, 0x62, 0x2f, 0x31, 0x43, 0x62, 0x7a, 0x48, 0x46, 0x0a, - 0x4d, 0x44, 0x46, 0x47, 0x35, 0x55, 0x76, 0x50, 0x72, 0x58, 0x5a, 0x54, 0x31, 0x45, 0x77, 0x34, 0x67, 0x58, - 0x4d, 0x7a, 0x4d, 0x55, 0x4f, 0x66, 0x47, 0x56, 0x73, 0x77, 0x61, 0x76, 0x77, 0x4e, 0x59, 0x4c, 0x64, 0x62, - 0x72, 0x63, 0x4f, 0x6e, 0x37, 0x37, 0x65, 0x70, 0x74, 0x77, 0x79, 0x48, 0x72, 0x49, 0x50, 0x61, 0x64, 0x63, - 0x68, 0x54, 0x37, 0x41, 0x35, 0x75, 0x69, 0x6d, 0x39, 0x4d, 0x55, 0x4b, 0x77, 0x61, 0x36, 0x74, 0x50, 0x54, 0x0a, - 0x77, 0x56, 0x30, 0x68, 0x49, 0x66, 0x43, 0x54, 0x43, 0x66, 0x34, 0x65, 0x58, 0x57, 0x74, 0x72, 0x6f, 0x54, - 0x47, 0x50, 0x55, 0x47, 0x32, 0x4c, 0x43, 0x6b, 0x47, 0x58, 0x33, 0x78, 0x2f, 0x58, 0x39, 0x6d, 0x33, 0x61, - 0x36, 0x6c, 0x4f, 0x2f, 0x38, 0x43, 0x62, 0x4a, 0x70, 0x39, 0x59, 0x51, 0x48, 0x47, 0x49, 0x42, 0x32, 0x49, - 0x38, 0x74, 0x6e, 0x37, 0x43, 0x4d, 0x44, 0x44, 0x71, 0x34, 0x67, 0x44, 0x71, 0x51, 0x51, 0x79, 0x48, 0x48, 0x0a, - 0x30, 0x62, 0x33, 0x6e, 0x72, 0x45, 0x54, 0x57, 0x52, 0x64, 0x6f, 0x56, 0x43, 0x67, 0x4c, 0x72, 0x41, 0x72, - 0x62, 0x51, 0x38, 0x36, 0x72, 0x67, 0x2b, 0x65, 0x69, 0x36, 0x6f, 0x41, 0x63, 0x4d, 0x47, 0x43, 0x6f, 0x76, - 0x43, 0x62, 0x34, 0x65, 0x6f, 0x64, 0x6f, 0x57, 0x79, 0x6b, 0x6e, 0x5a, 0x4b, 0x71, 0x47, 0x30, 0x38, 0x55, - 0x66, 0x41, 0x2f, 0x64, 0x68, 0x70, 0x58, 0x51, 0x4a, 0x52, 0x53, 0x4f, 0x45, 0x45, 0x66, 0x6d, 0x70, 0x6b, 0x0a, - 0x48, 0x64, 0x49, 0x4d, 0x43, 0x75, 0x58, 0x50, 0x66, 0x33, 0x2b, 0x39, 0x48, 0x54, 0x77, 0x30, 0x65, 0x74, - 0x33, 0x59, 0x2b, 0x68, 0x72, 0x62, 0x6e, 0x7a, 0x4e, 0x77, 0x41, 0x68, 0x64, 0x39, 0x45, 0x30, 0x61, 0x32, - 0x48, 0x78, 0x76, 0x2f, 0x65, 0x67, 0x34, 0x66, 0x43, 0x59, 0x72, 0x57, 0x35, 0x2b, 0x4d, 0x7a, 0x53, 0x75, - 0x30, 0x62, 0x58, 0x69, 0x6e, 0x4c, 0x31, 0x78, 0x78, 0x4f, 0x50, 0x54, 0x38, 0x35, 0x63, 0x75, 0x6e, 0x70, 0x0a, - 0x51, 0x59, 0x6a, 0x78, 0x44, 0x57, 0x42, 0x2f, 0x74, 0x72, 0x6c, 0x67, 0x4b, 0x65, 0x63, 0x77, 0x32, 0x33, - 0x42, 0x4a, 0x63, 0x38, 0x62, 0x66, 0x77, 0x68, 0x4c, 0x32, 0x34, 0x59, 0x36, 0x4f, 0x69, 0x64, 0x65, 0x70, - 0x43, 0x33, 0x41, 0x41, 0x31, 0x57, 0x34, 0x62, 0x50, 0x30, 0x78, 0x41, 0x72, 0x63, 0x4e, 0x35, 0x74, 0x67, - 0x4a, 0x5a, 0x62, 0x77, 0x41, 0x74, 0x48, 0x49, 0x4c, 0x47, 0x44, 0x49, 0x30, 0x70, 0x44, 0x71, 0x38, 0x38, 0x0a, - 0x70, 0x35, 0x66, 0x49, 0x4d, 0x30, 0x38, 0x50, 0x51, 0x6f, 0x77, 0x2f, 0x41, 0x75, 0x35, 0x2b, 0x6d, 0x33, - 0x55, 0x78, 0x39, 0x54, 0x71, 0x71, 0x51, 0x35, 0x2b, 0x39, 0x59, 0x44, 0x6b, 0x46, 0x63, 0x2b, 0x36, 0x68, - 0x4c, 0x6e, 0x6b, 0x4b, 0x75, 0x32, 0x41, 0x2f, 0x51, 0x52, 0x4d, 0x47, 0x58, 0x58, 0x51, 0x4e, 0x48, 0x4e, - 0x6d, 0x6d, 0x5a, 0x2f, 0x56, 0x52, 0x6f, 0x54, 0x6a, 0x66, 0x67, 0x48, 0x78, 0x73, 0x39, 0x43, 0x39, 0x47, 0x0a, - 0x48, 0x30, 0x70, 0x56, 0x44, 0x6f, 0x4a, 0x48, 0x4c, 0x41, 0x43, 0x37, 0x4f, 0x77, 0x49, 0x36, 0x67, 0x4c, - 0x71, 0x30, 0x79, 0x79, 0x37, 0x75, 0x4a, 0x71, 0x76, 0x54, 0x35, 0x66, 0x6f, 0x47, 0x69, 0x34, 0x35, 0x4a, - 0x44, 0x70, 0x75, 0x39, 0x53, 0x46, 0x4e, 0x73, 0x4b, 0x64, 0x77, 0x6d, 0x37, 0x4f, 0x55, 0x75, 0x4f, 0x34, - 0x4c, 0x72, 0x4f, 0x58, 0x77, 0x73, 0x66, 0x47, 0x56, 0x41, 0x2b, 0x65, 0x4f, 0x41, 0x76, 0x76, 0x35, 0x59, 0x0a, - 0x56, 0x2f, 0x45, 0x72, 0x77, 0x47, 0x36, 0x32, 0x4c, 0x69, 0x47, 0x73, 0x50, 0x72, 0x57, 0x7a, 0x6e, 0x76, - 0x41, 0x36, 0x39, 0x41, 0x2b, 0x77, 0x67, 0x69, 0x58, 0x30, 0x6b, 0x61, 0x4e, 0x6f, 0x33, 0x6d, 0x6e, 0x54, - 0x30, 0x6a, 0x7a, 0x44, 0x47, 0x5a, 0x62, 0x35, 0x4d, 0x2b, 0x75, 0x76, 0x4e, 0x34, 0x33, 0x55, 0x73, 0x35, - 0x66, 0x49, 0x52, 0x35, 0x34, 0x2b, 0x74, 0x76, 0x68, 0x45, 0x67, 0x4d, 0x51, 0x4c, 0x63, 0x6f, 0x69, 0x73, 0x0a, - 0x5a, 0x32, 0x79, 0x68, 0x35, 0x31, 0x49, 0x52, 0x61, 0x36, 0x45, 0x2b, 0x6a, 0x52, 0x6b, 0x61, 0x4e, 0x6f, - 0x37, 0x38, 0x4b, 0x77, 0x2b, 0x6c, 0x68, 0x4b, 0x43, 0x67, 0x2f, 0x77, 0x6f, 0x63, 0x47, 0x42, 0x4f, 0x65, - 0x64, 0x77, 0x70, 0x6e, 0x4d, 0x4e, 0x33, 0x42, 0x73, 0x79, 0x76, 0x2b, 0x4e, 0x32, 0x6a, 0x78, 0x68, 0x45, - 0x46, 0x72, 0x55, 0x76, 0x2b, 0x36, 0x65, 0x36, 0x4c, 0x31, 0x33, 0x38, 0x45, 0x75, 0x46, 0x42, 0x69, 0x74, 0x0a, - 0x6e, 0x37, 0x78, 0x6a, 0x59, 0x4e, 0x63, 0x34, 0x4f, 0x32, 0x38, 0x49, 0x33, 0x63, 0x5a, 0x2b, 0x58, 0x47, - 0x4e, 0x39, 0x4e, 0x78, 0x31, 0x6a, 0x68, 0x6c, 0x69, 0x4c, 0x7a, 0x58, 0x2f, 0x58, 0x57, 0x6f, 0x61, 0x49, - 0x73, 0x2f, 0x63, 0x2b, 0x51, 0x76, 0x77, 0x4b, 0x63, 0x45, 0x57, 0x46, 0x46, 0x2f, 0x55, 0x64, 0x32, 0x50, - 0x2b, 0x30, 0x32, 0x56, 0x62, 0x68, 0x37, 0x2f, 0x72, 0x6b, 0x4c, 0x77, 0x6d, 0x75, 0x54, 0x37, 0x6f, 0x5a, 0x0a, - 0x72, 0x4f, 0x47, 0x36, 0x63, 0x41, 0x77, 0x38, 0x61, 0x57, 0x6a, 0x6e, 0x33, 0x57, 0x44, 0x50, 0x6f, 0x59, - 0x38, 0x53, 0x5a, 0x65, 0x45, 0x62, 0x6b, 0x4a, 0x57, 0x4c, 0x78, 0x4e, 0x6a, 0x47, 0x55, 0x49, 0x2b, 0x4e, - 0x30, 0x39, 0x4c, 0x6f, 0x55, 0x6e, 0x4e, 0x6a, 0x2b, 0x32, 0x37, 0x30, 0x49, 0x56, 0x54, 0x6c, 0x4a, 0x54, - 0x4f, 0x4f, 0x62, 0x6f, 0x30, 0x65, 0x6a, 0x42, 0x70, 0x69, 0x41, 0x5a, 0x68, 0x34, 0x75, 0x37, 0x75, 0x4e, 0x0a, - 0x67, 0x2b, 0x2b, 0x46, 0x2b, 0x33, 0x6e, 0x42, 0x37, 0x65, 0x47, 0x62, 0x4d, 0x30, 0x43, 0x76, 0x6e, 0x77, - 0x36, 0x2b, 0x46, 0x41, 0x73, 0x6d, 0x79, 0x6b, 0x64, 0x74, 0x48, 0x4f, 0x69, 0x77, 0x32, 0x32, 0x66, 0x38, - 0x62, 0x4d, 0x61, 0x70, 0x2f, 0x38, 0x4c, 0x4d, 0x47, 0x30, 0x4f, 0x64, 0x47, 0x4b, 0x64, 0x66, 0x6a, 0x54, - 0x36, 0x32, 0x71, 0x75, 0x64, 0x55, 0x50, 0x67, 0x6f, 0x54, 0x71, 0x45, 0x4b, 0x66, 0x47, 0x56, 0x73, 0x77, 0x0a, - 0x61, 0x6d, 0x67, 0x46, 0x51, 0x49, 0x64, 0x41, 0x62, 0x4f, 0x46, 0x61, 0x59, 0x51, 0x74, 0x74, 0x53, 0x67, - 0x78, 0x37, 0x30, 0x65, 0x62, 0x59, 0x7a, 0x75, 0x41, 0x51, 0x30, 0x45, 0x46, 0x57, 0x45, 0x66, 0x43, 0x52, - 0x6f, 0x6b, 0x78, 0x39, 0x41, 0x37, 0x4b, 0x44, 0x58, 0x34, 0x78, 0x4e, 0x59, 0x7a, 0x4a, 0x6a, 0x47, 0x31, - 0x4b, 0x56, 0x37, 0x39, 0x52, 0x7a, 0x57, 0x43, 0x4d, 0x76, 0x50, 0x48, 0x31, 0x73, 0x55, 0x66, 0x48, 0x76, 0x0a, - 0x59, 0x57, 0x45, 0x43, 0x61, 0x52, 0x31, 0x36, 0x67, 0x77, 0x6f, 0x57, 0x6f, 0x52, 0x55, 0x41, 0x48, 0x51, - 0x51, 0x66, 0x7a, 0x6c, 0x64, 0x47, 0x6c, 0x75, 0x33, 0x6c, 0x56, 0x32, 0x78, 0x39, 0x47, 0x67, 0x2b, 0x4a, - 0x43, 0x6d, 0x65, 0x58, 0x78, 0x75, 0x45, 0x35, 0x65, 0x6d, 0x4a, 0x73, 0x4d, 0x33, 0x53, 0x4e, 0x39, 0x61, - 0x46, 0x50, 0x78, 0x37, 0x46, 0x77, 0x61, 0x68, 0x77, 0x76, 0x6a, 0x4e, 0x36, 0x71, 0x64, 0x53, 0x73, 0x4d, 0x0a, - 0x31, 0x4b, 0x62, 0x34, 0x30, 0x58, 0x50, 0x70, 0x71, 0x31, 0x34, 0x47, 0x66, 0x53, 0x69, 0x57, 0x43, 0x71, - 0x62, 0x7a, 0x6a, 0x61, 0x48, 0x4a, 0x6f, 0x52, 0x57, 0x41, 0x31, 0x47, 0x7a, 0x77, 0x67, 0x39, 0x48, 0x48, - 0x55, 0x68, 0x4d, 0x63, 0x46, 0x38, 0x62, 0x35, 0x47, 0x66, 0x72, 0x51, 0x42, 0x31, 0x34, 0x68, 0x5a, 0x74, - 0x44, 0x42, 0x46, 0x6c, 0x32, 0x78, 0x31, 0x57, 0x65, 0x4c, 0x54, 0x34, 0x5a, 0x74, 0x32, 0x6b, 0x34, 0x61, 0x0a, - 0x75, 0x4a, 0x30, 0x59, 0x66, 0x31, 0x2b, 0x4e, 0x33, 0x71, 0x70, 0x56, 0x4b, 0x7a, 0x54, 0x74, 0x42, 0x36, - 0x4f, 0x76, 0x71, 0x2b, 0x70, 0x5a, 0x64, 0x50, 0x45, 0x66, 0x59, 0x51, 0x45, 0x74, 0x46, 0x45, 0x65, 0x58, - 0x33, 0x38, 0x61, 0x7a, 0x34, 0x39, 0x36, 0x38, 0x48, 0x6e, 0x6f, 0x42, 0x32, 0x4e, 0x59, 0x47, 0x46, 0x79, - 0x61, 0x51, 0x44, 0x6c, 0x35, 0x70, 0x62, 0x45, 0x4f, 0x71, 0x6c, 0x38, 0x62, 0x5a, 0x71, 0x64, 0x47, 0x6c, 0x0a, - 0x6c, 0x6e, 0x41, 0x4f, 0x66, 0x56, 0x79, 0x67, 0x70, 0x4c, 0x35, 0x68, 0x41, 0x48, 0x6c, 0x69, 0x66, 0x4e, - 0x62, 0x6f, 0x69, 0x78, 0x36, 0x2f, 0x7a, 0x74, 0x68, 0x7a, 0x6f, 0x36, 0x39, 0x53, 0x4d, 0x77, 0x62, 0x6f, - 0x30, 0x31, 0x34, 0x73, 0x59, 0x42, 0x65, 0x75, 0x4d, 0x63, 0x62, 0x4c, 0x33, 0x32, 0x51, 0x6d, 0x74, 0x41, - 0x4a, 0x67, 0x44, 0x30, 0x52, 0x70, 0x44, 0x53, 0x50, 0x70, 0x6e, 0x34, 0x7a, 0x66, 0x57, 0x36, 0x4d, 0x50, 0x0a, - 0x72, 0x64, 0x6f, 0x4c, 0x70, 0x6f, 0x75, 0x52, 0x64, 0x67, 0x54, 0x52, 0x57, 0x30, 0x44, 0x74, 0x32, 0x52, - 0x50, 0x6b, 0x4b, 0x30, 0x38, 0x66, 0x51, 0x6a, 0x77, 0x32, 0x54, 0x75, 0x7a, 0x61, 0x2f, 0x47, 0x36, 0x48, - 0x49, 0x72, 0x5a, 0x49, 0x45, 0x62, 0x54, 0x32, 0x64, 0x58, 0x48, 0x48, 0x77, 0x4c, 0x37, 0x78, 0x46, 0x58, - 0x32, 0x36, 0x2b, 0x50, 0x61, 0x5a, 0x31, 0x2f, 0x58, 0x39, 0x4a, 0x73, 0x65, 0x46, 0x56, 0x67, 0x41, 0x2b, 0x0a, - 0x37, 0x6d, 0x67, 0x58, 0x63, 0x78, 0x4e, 0x33, 0x32, 0x53, 0x55, 0x77, 0x51, 0x31, 0x2b, 0x6b, 0x31, 0x73, - 0x79, 0x79, 0x4d, 0x62, 0x49, 0x4f, 0x54, 0x78, 0x70, 0x6e, 0x76, 0x77, 0x70, 0x4d, 0x73, 0x49, 0x6c, 0x44, - 0x49, 0x4d, 0x47, 0x4a, 0x39, 0x64, 0x58, 0x33, 0x2b, 0x74, 0x2f, 0x47, 0x4b, 0x31, 0x75, 0x68, 0x61, 0x63, - 0x2b, 0x4e, 0x76, 0x71, 0x6e, 0x71, 0x6d, 0x48, 0x41, 0x47, 0x44, 0x32, 0x45, 0x4a, 0x49, 0x37, 0x77, 0x4d, 0x0a, - 0x68, 0x46, 0x59, 0x41, 0x64, 0x43, 0x43, 0x33, 0x44, 0x63, 0x58, 0x30, 0x34, 0x39, 0x62, 0x6f, 0x62, 0x67, - 0x75, 0x4c, 0x65, 0x44, 0x41, 0x78, 0x4d, 0x71, 0x4f, 0x33, 0x36, 0x68, 0x79, 0x68, 0x62, 0x4a, 0x57, 0x6d, - 0x76, 0x61, 0x48, 0x31, 0x31, 0x32, 0x79, 0x36, 0x31, 0x31, 0x59, 0x6e, 0x78, 0x6f, 0x39, 0x44, 0x58, 0x36, - 0x79, 0x59, 0x66, 0x57, 0x76, 0x36, 0x43, 0x2f, 0x54, 0x55, 0x32, 0x50, 0x72, 0x55, 0x53, 0x36, 0x39, 0x44, 0x0a, - 0x63, 0x59, 0x37, 0x67, 0x41, 0x5a, 0x7a, 0x44, 0x69, 0x49, 0x34, 0x4d, 0x68, 0x46, 0x59, 0x41, 0x4f, 0x6c, - 0x49, 0x77, 0x75, 0x69, 0x6b, 0x7a, 0x45, 0x53, 0x71, 0x6a, 0x6a, 0x36, 0x58, 0x61, 0x4f, 0x4d, 0x76, 0x65, - 0x66, 0x73, 0x35, 0x59, 0x52, 0x4f, 0x30, 0x74, 0x4a, 0x45, 0x46, 0x57, 0x45, 0x58, 0x67, 0x74, 0x54, 0x6f, - 0x32, 0x44, 0x68, 0x64, 0x47, 0x37, 0x31, 0x42, 0x4b, 0x6a, 0x4d, 0x78, 0x31, 0x58, 0x52, 0x75, 0x39, 0x54, 0x0a, - 0x35, 0x33, 0x53, 0x38, 0x61, 0x33, 0x68, 0x43, 0x57, 0x38, 0x4b, 0x49, 0x4a, 0x52, 0x6d, 0x49, 0x42, 0x57, - 0x42, 0x4a, 0x63, 0x74, 0x35, 0x59, 0x6c, 0x79, 0x35, 0x31, 0x48, 0x78, 0x77, 0x64, 0x6c, 0x36, 0x5a, 0x7a, - 0x67, 0x69, 0x36, 0x2b, 0x46, 0x43, 0x6b, 0x54, 0x63, 0x7a, 0x50, 0x35, 0x69, 0x39, 0x48, 0x37, 0x31, 0x4d, - 0x2b, 0x6d, 0x51, 0x2b, 0x73, 0x6f, 0x6a, 0x47, 0x30, 0x49, 0x4e, 0x63, 0x57, 0x4a, 0x69, 0x6f, 0x73, 0x34, 0x0a, - 0x68, 0x51, 0x6b, 0x4d, 0x43, 0x71, 0x45, 0x56, 0x67, 0x49, 0x63, 0x39, 0x32, 0x4e, 0x31, 0x71, 0x53, 0x32, - 0x73, 0x6f, 0x4e, 0x34, 0x78, 0x7a, 0x7a, 0x58, 0x67, 0x37, 0x52, 0x32, 0x38, 0x42, 0x4b, 0x58, 0x77, 0x4a, - 0x7a, 0x73, 0x32, 0x6b, 0x45, 0x74, 0x30, 0x5a, 0x57, 0x35, 0x2b, 0x36, 0x6f, 0x4b, 0x4d, 0x30, 0x6e, 0x56, - 0x70, 0x4c, 0x5a, 0x6d, 0x79, 0x76, 0x55, 0x65, 0x56, 0x4c, 0x61, 0x31, 0x52, 0x52, 0x2b, 0x67, 0x6f, 0x56, 0x0a, - 0x55, 0x34, 0x55, 0x67, 0x67, 0x63, 0x45, 0x67, 0x74, 0x41, 0x4a, 0x67, 0x4e, 0x33, 0x62, 0x49, 0x41, 0x32, - 0x56, 0x39, 0x39, 0x2b, 0x6e, 0x62, 0x69, 0x70, 0x6e, 0x32, 0x4c, 0x57, 0x43, 0x4a, 0x2f, 0x59, 0x79, 0x2b, - 0x32, 0x75, 0x76, 0x58, 0x5a, 0x58, 0x6a, 0x4a, 0x56, 0x77, 0x48, 0x4e, 0x4b, 0x7a, 0x77, 0x2f, 0x45, 0x6d, - 0x2b, 0x4e, 0x76, 0x6b, 0x71, 0x31, 0x61, 0x39, 0x48, 0x34, 0x65, 0x7a, 0x68, 0x5a, 0x4e, 0x58, 0x48, 0x4e, 0x0a, - 0x66, 0x6c, 0x33, 0x2b, 0x53, 0x33, 0x67, 0x48, 0x74, 0x64, 0x35, 0x57, 0x6e, 0x79, 0x49, 0x48, 0x67, 0x39, - 0x41, 0x4b, 0x51, 0x47, 0x31, 0x32, 0x56, 0x68, 0x73, 0x2f, 0x4e, 0x74, 0x7a, 0x59, 0x41, 0x58, 0x72, 0x38, - 0x70, 0x7a, 0x33, 0x32, 0x5a, 0x57, 0x5a, 0x48, 0x70, 0x79, 0x36, 0x46, 0x6a, 0x78, 0x78, 0x6c, 0x35, 0x68, - 0x76, 0x57, 0x6b, 0x43, 0x65, 0x4d, 0x38, 0x58, 0x50, 0x72, 0x30, 0x4f, 0x64, 0x77, 0x45, 0x7a, 0x67, 0x47, 0x0a, - 0x6e, 0x35, 0x67, 0x4a, 0x38, 0x71, 0x6b, 0x4c, 0x4f, 0x34, 0x4f, 0x2b, 0x66, 0x39, 0x53, 0x4e, 0x6f, 0x66, - 0x6b, 0x31, 0x72, 0x4f, 0x41, 0x6e, 0x2b, 0x42, 0x30, 0x36, 0x2b, 0x41, 0x45, 0x47, 0x67, 0x39, 0x41, 0x4b, - 0x67, 0x44, 0x62, 0x62, 0x68, 0x7a, 0x5a, 0x2b, 0x62, 0x44, 0x67, 0x54, 0x49, 0x44, 0x66, 0x36, 0x57, 0x47, - 0x70, 0x71, 0x48, 0x4e, 0x74, 0x6e, 0x4e, 0x39, 0x33, 0x2f, 0x71, 0x74, 0x64, 0x49, 0x35, 0x62, 0x2f, 0x61, 0x0a, - 0x4c, 0x2b, 0x47, 0x43, 0x4a, 0x6a, 0x4f, 0x32, 0x5a, 0x61, 0x72, 0x47, 0x2b, 0x37, 0x6a, 0x31, 0x6c, 0x51, - 0x33, 0x6b, 0x6b, 0x72, 0x46, 0x6e, 0x48, 0x65, 0x50, 0x6c, 0x2f, 0x78, 0x48, 0x4f, 0x34, 0x4b, 0x70, 0x31, - 0x35, 0x59, 0x77, 0x70, 0x34, 0x41, 0x32, 0x38, 0x68, 0x31, 0x4e, 0x6f, 0x6f, 0x61, 0x4c, 0x33, 0x73, 0x54, - 0x45, 0x6d, 0x74, 0x76, 0x4d, 0x74, 0x36, 0x36, 0x48, 0x39, 0x51, 0x52, 0x42, 0x74, 0x37, 0x70, 0x4f, 0x33, 0x0a, - 0x6f, 0x54, 0x58, 0x79, 0x65, 0x30, 0x38, 0x66, 0x53, 0x39, 0x54, 0x42, 0x79, 0x7a, 0x33, 0x6e, 0x52, 0x38, - 0x69, 0x6c, 0x70, 0x34, 0x38, 0x68, 0x36, 0x73, 0x41, 0x58, 0x6e, 0x75, 0x50, 0x50, 0x79, 0x4e, 0x65, 0x65, - 0x76, 0x6b, 0x78, 0x55, 0x6e, 0x68, 0x36, 0x68, 0x32, 0x68, 0x59, 0x4f, 0x34, 0x52, 0x41, 0x71, 0x5a, 0x38, - 0x74, 0x51, 0x30, 0x4b, 0x6e, 0x59, 0x4c, 0x54, 0x54, 0x2b, 0x41, 0x4b, 0x36, 0x61, 0x31, 0x34, 0x37, 0x76, 0x0a, - 0x61, 0x67, 0x75, 0x4d, 0x56, 0x39, 0x42, 0x66, 0x6a, 0x78, 0x31, 0x58, 0x59, 0x66, 0x42, 0x6a, 0x5a, 0x45, - 0x76, 0x47, 0x61, 0x7a, 0x30, 0x35, 0x46, 0x4f, 0x54, 0x7a, 0x47, 0x6b, 0x36, 0x67, 0x35, 0x70, 0x51, 0x4e, - 0x61, 0x64, 0x34, 0x2b, 0x51, 0x6e, 0x73, 0x44, 0x71, 0x4e, 0x6c, 0x53, 0x35, 0x32, 0x31, 0x72, 0x67, 0x71, - 0x78, 0x4e, 0x48, 0x78, 0x75, 0x56, 0x43, 0x58, 0x42, 0x71, 0x39, 0x44, 0x48, 0x55, 0x69, 0x58, 0x46, 0x71, 0x0a, - 0x31, 0x32, 0x43, 0x36, 0x66, 0x31, 0x4e, 0x72, 0x4e, 0x50, 0x76, 0x36, 0x6e, 0x57, 0x4b, 0x37, 0x2f, 0x32, - 0x33, 0x55, 0x63, 0x79, 0x58, 0x42, 0x64, 0x47, 0x48, 0x4d, 0x43, 0x33, 0x54, 0x35, 0x65, 0x77, 0x33, 0x6d, - 0x54, 0x46, 0x62, 0x52, 0x72, 0x4a, 0x59, 0x34, 0x79, 0x65, 0x6a, 0x4c, 0x50, 0x53, 0x5a, 0x4c, 0x78, 0x71, - 0x70, 0x72, 0x44, 0x6c, 0x50, 0x34, 0x41, 0x63, 0x36, 0x67, 0x35, 0x73, 0x74, 0x2f, 0x43, 0x63, 0x50, 0x42, 0x0a, - 0x53, 0x48, 0x39, 0x78, 0x5a, 0x5a, 0x2f, 0x2f, 0x45, 0x6f, 0x72, 0x2b, 0x79, 0x6f, 0x79, 0x50, 0x4b, 0x35, - 0x53, 0x78, 0x31, 0x35, 0x76, 0x35, 0x41, 0x5a, 0x48, 0x31, 0x31, 0x33, 0x38, 0x32, 0x2b, 0x63, 0x73, 0x2f, - 0x6d, 0x36, 0x35, 0x76, 0x30, 0x68, 0x46, 0x76, 0x55, 0x78, 0x38, 0x61, 0x50, 0x7a, 0x4e, 0x2b, 0x70, 0x4e, - 0x37, 0x41, 0x50, 0x6c, 0x39, 0x64, 0x34, 0x39, 0x4d, 0x6c, 0x34, 0x2f, 0x76, 0x38, 0x4c, 0x4c, 0x4d, 0x58, 0x0a, - 0x2b, 0x48, 0x75, 0x45, 0x4c, 0x38, 0x55, 0x4e, 0x45, 0x35, 0x66, 0x35, 0x44, 0x36, 0x6f, 0x76, 0x74, 0x4b, - 0x38, 0x41, 0x71, 0x75, 0x77, 0x54, 0x71, 0x42, 0x2b, 0x53, 0x57, 0x6a, 0x67, 0x45, 0x76, 0x52, 0x4b, 0x4f, - 0x6a, 0x55, 0x63, 0x43, 0x70, 0x46, 0x36, 0x51, 0x53, 0x2b, 0x53, 0x5a, 0x70, 0x77, 0x38, 0x70, 0x36, 0x70, - 0x4d, 0x36, 0x39, 0x78, 0x7a, 0x4f, 0x6b, 0x63, 0x38, 0x38, 0x66, 0x52, 0x50, 0x52, 0x2b, 0x74, 0x4c, 0x63, 0x0a, - 0x42, 0x5a, 0x53, 0x2f, 0x57, 0x6b, 0x71, 0x44, 0x6e, 0x46, 0x5a, 0x6a, 0x66, 0x56, 0x79, 0x6a, 0x36, 0x4b, - 0x76, 0x48, 0x47, 0x4e, 0x41, 0x2b, 0x48, 0x73, 0x4f, 0x73, 0x59, 0x56, 0x63, 0x4d, 0x72, 0x61, 0x39, 0x71, - 0x2b, 0x49, 0x38, 0x6e, 0x64, 0x34, 0x30, 0x4e, 0x30, 0x68, 0x5a, 0x69, 0x41, 0x64, 0x42, 0x47, 0x36, 0x33, - 0x65, 0x41, 0x78, 0x4e, 0x74, 0x78, 0x48, 0x65, 0x61, 0x35, 0x70, 0x34, 0x38, 0x68, 0x54, 0x6e, 0x47, 0x71, 0x0a, - 0x37, 0x37, 0x45, 0x2b, 0x39, 0x4a, 0x31, 0x61, 0x42, 0x33, 0x52, 0x49, 0x44, 0x42, 0x31, 0x48, 0x65, 0x64, - 0x4c, 0x46, 0x7a, 0x73, 0x77, 0x69, 0x74, 0x57, 0x35, 0x64, 0x37, 0x68, 0x4a, 0x4f, 0x34, 0x41, 0x33, 0x55, - 0x32, 0x42, 0x59, 0x31, 0x77, 0x67, 0x46, 0x55, 0x75, 0x79, 0x33, 0x6b, 0x54, 0x61, 0x43, 0x4b, 0x64, 0x70, - 0x74, 0x78, 0x74, 0x2f, 0x56, 0x38, 0x67, 0x38, 0x63, 0x4a, 0x74, 0x51, 0x44, 0x4d, 0x79, 0x4f, 0x53, 0x46, 0x0a, - 0x6c, 0x30, 0x32, 0x48, 0x72, 0x4d, 0x4d, 0x36, 0x4a, 0x68, 0x4b, 0x63, 0x50, 0x30, 0x4b, 0x31, 0x4c, 0x58, - 0x52, 0x51, 0x6a, 0x2b, 0x42, 0x51, 0x68, 0x7a, 0x58, 0x44, 0x6c, 0x79, 0x36, 0x72, 0x48, 0x32, 0x4f, 0x42, - 0x66, 0x67, 0x4a, 0x66, 0x41, 0x2f, 0x6d, 0x7a, 0x61, 0x31, 0x2f, 0x6c, 0x54, 0x7a, 0x45, 0x56, 0x4f, 0x32, - 0x4b, 0x50, 0x4d, 0x78, 0x44, 0x61, 0x6a, 0x34, 0x44, 0x74, 0x56, 0x73, 0x78, 0x62, 0x6f, 0x57, 0x6c, 0x54, 0x0a, - 0x32, 0x6c, 0x6b, 0x6a, 0x6a, 0x39, 0x58, 0x55, 0x4f, 0x4e, 0x61, 0x62, 0x68, 0x6f, 0x38, 0x4d, 0x78, 0x56, - 0x35, 0x59, 0x76, 0x33, 0x38, 0x54, 0x75, 0x63, 0x75, 0x58, 0x59, 0x75, 0x70, 0x54, 0x2b, 0x72, 0x57, 0x51, - 0x6e, 0x30, 0x4e, 0x59, 0x72, 0x65, 0x6e, 0x6f, 0x6d, 0x6e, 0x47, 0x4c, 0x4e, 0x63, 0x66, 0x47, 0x59, 0x54, - 0x76, 0x4d, 0x51, 0x4b, 0x67, 0x46, 0x77, 0x4a, 0x48, 0x7a, 0x53, 0x35, 0x50, 0x33, 0x43, 0x2f, 0x54, 0x4d, 0x0a, - 0x32, 0x49, 0x5a, 0x57, 0x64, 0x53, 0x6e, 0x73, 0x78, 0x56, 0x42, 0x4d, 0x46, 0x59, 0x45, 0x55, 0x76, 0x68, - 0x52, 0x54, 0x4a, 0x6e, 0x59, 0x56, 0x45, 0x6c, 0x31, 0x2b, 0x39, 0x31, 0x4b, 0x6e, 0x5a, 0x70, 0x37, 0x38, - 0x36, 0x47, 0x33, 0x6c, 0x32, 0x74, 0x69, 0x74, 0x71, 0x72, 0x77, 0x4f, 0x55, 0x58, 0x53, 0x73, 0x33, 0x36, - 0x69, 0x50, 0x6b, 0x49, 0x46, 0x51, 0x76, 0x77, 0x49, 0x6f, 0x6c, 0x51, 0x6e, 0x38, 0x42, 0x6c, 0x50, 0x59, 0x0a, - 0x6f, 0x6b, 0x59, 0x34, 0x67, 0x47, 0x72, 0x48, 0x67, 0x75, 0x4c, 0x71, 0x73, 0x6d, 0x59, 0x6d, 0x67, 0x47, - 0x4c, 0x71, 0x38, 0x6c, 0x77, 0x62, 0x2b, 0x7a, 0x49, 0x31, 0x70, 0x31, 0x4f, 0x46, 0x53, 0x36, 0x32, 0x46, - 0x2f, 0x49, 0x78, 0x31, 0x45, 0x62, 0x58, 0x32, 0x63, 0x36, 0x68, 0x57, 0x72, 0x4f, 0x45, 0x43, 0x33, 0x73, - 0x49, 0x53, 0x52, 0x76, 0x77, 0x68, 0x47, 0x51, 0x69, 0x35, 0x41, 0x47, 0x69, 0x4c, 0x63, 0x71, 0x6a, 0x4c, 0x0a, - 0x36, 0x4b, 0x4e, 0x43, 0x4f, 0x59, 0x48, 0x4f, 0x4e, 0x77, 0x34, 0x73, 0x4a, 0x2f, 0x6a, 0x72, 0x4b, 0x67, - 0x49, 0x4b, 0x6f, 0x38, 0x73, 0x30, 0x68, 0x31, 0x2b, 0x68, 0x31, 0x69, 0x4b, 0x39, 0x52, 0x59, 0x6f, 0x67, - 0x48, 0x73, 0x4e, 0x4a, 0x49, 0x39, 0x4d, 0x38, 0x67, 0x77, 0x72, 0x4a, 0x37, 0x4a, 0x6b, 0x31, 0x47, 0x6d, - 0x49, 0x47, 0x54, 0x41, 0x5a, 0x43, 0x4c, 0x77, 0x42, 0x4b, 0x78, 0x77, 0x7a, 0x71, 0x55, 0x39, 0x53, 0x48, 0x0a, - 0x4c, 0x70, 0x32, 0x4b, 0x51, 0x4f, 0x6b, 0x62, 0x42, 0x35, 0x59, 0x54, 0x2f, 0x4e, 0x31, 0x41, 0x58, 0x65, - 0x53, 0x68, 0x6f, 0x48, 0x57, 0x66, 0x77, 0x63, 0x56, 0x51, 0x44, 0x71, 0x4f, 0x66, 0x74, 0x35, 0x32, 0x42, - 0x55, 0x48, 0x38, 0x44, 0x38, 0x48, 0x64, 0x31, 0x68, 0x6a, 0x4c, 0x33, 0x44, 0x63, 0x69, 0x36, 0x6e, 0x50, - 0x71, 0x45, 0x31, 0x67, 0x57, 0x56, 0x2f, 0x46, 0x4a, 0x6b, 0x54, 0x4d, 0x78, 0x68, 0x6c, 0x34, 0x38, 0x61, 0x0a, - 0x75, 0x34, 0x71, 0x4d, 0x4c, 0x71, 0x7a, 0x6b, 0x31, 0x32, 0x4b, 0x4f, 0x67, 0x77, 0x4f, 0x34, 0x65, 0x4b, - 0x32, 0x6a, 0x4f, 0x44, 0x2b, 0x63, 0x44, 0x4d, 0x51, 0x33, 0x67, 0x50, 0x2f, 0x32, 0x57, 0x70, 0x65, 0x39, - 0x2b, 0x45, 0x2f, 0x39, 0x54, 0x5a, 0x71, 0x6a, 0x36, 0x5a, 0x56, 0x38, 0x6e, 0x63, 0x75, 0x56, 0x4d, 0x57, - 0x34, 0x43, 0x39, 0x5a, 0x6f, 0x75, 0x57, 0x61, 0x6a, 0x67, 0x34, 0x55, 0x2b, 0x70, 0x2b, 0x35, 0x38, 0x45, 0x0a, - 0x38, 0x78, 0x53, 0x65, 0x77, 0x68, 0x53, 0x75, 0x69, 0x35, 0x71, 0x42, 0x43, 0x33, 0x67, 0x4a, 0x48, 0x59, - 0x79, 0x49, 0x47, 0x64, 0x67, 0x6f, 0x41, 0x37, 0x45, 0x41, 0x2f, 0x4a, 0x34, 0x75, 0x58, 0x63, 0x4b, 0x72, - 0x33, 0x30, 0x33, 0x50, 0x74, 0x42, 0x4b, 0x4c, 0x4c, 0x74, 0x34, 0x2f, 0x58, 0x73, 0x39, 0x48, 0x35, 0x41, - 0x54, 0x6d, 0x6e, 0x73, 0x32, 0x4b, 0x4b, 0x67, 0x43, 0x56, 0x4e, 0x58, 0x62, 0x6f, 0x47, 0x62, 0x59, 0x4a, 0x0a, - 0x2f, 0x41, 0x54, 0x54, 0x68, 0x6a, 0x51, 0x2f, 0x34, 0x66, 0x68, 0x58, 0x6c, 0x4a, 0x38, 0x48, 0x75, 0x49, - 0x41, 0x52, 0x4d, 0x51, 0x4d, 0x76, 0x7a, 0x6b, 0x41, 0x73, 0x41, 0x4d, 0x39, 0x54, 0x70, 0x77, 0x75, 0x6f, - 0x74, 0x77, 0x47, 0x31, 0x51, 0x36, 0x48, 0x47, 0x30, 0x51, 0x46, 0x55, 0x47, 0x78, 0x45, 0x7a, 0x73, 0x44, - 0x63, 0x5a, 0x69, 0x4c, 0x38, 0x42, 0x50, 0x4e, 0x2b, 0x4b, 0x43, 0x70, 0x4d, 0x2b, 0x72, 0x63, 0x2b, 0x67, 0x0a, - 0x67, 0x36, 0x2f, 0x46, 0x48, 0x41, 0x64, 0x48, 0x4d, 0x46, 0x37, 0x2b, 0x31, 0x32, 0x59, 0x79, 0x7a, 0x68, - 0x38, 0x38, 0x41, 0x2f, 0x45, 0x4e, 0x59, 0x48, 0x56, 0x4b, 0x4d, 0x34, 0x62, 0x6f, 0x75, 0x33, 0x6b, 0x4f, - 0x4a, 0x61, 0x2b, 0x43, 0x43, 0x6b, 0x67, 0x4a, 0x39, 0x59, 0x71, 0x75, 0x4e, 0x6c, 0x35, 0x38, 0x6b, 0x68, - 0x43, 0x78, 0x6e, 0x78, 0x6d, 0x49, 0x42, 0x57, 0x44, 0x7a, 0x66, 0x56, 0x45, 0x52, 0x53, 0x44, 0x71, 0x6d, 0x0a, - 0x36, 0x61, 0x4a, 0x58, 0x48, 0x66, 0x5a, 0x6f, 0x69, 0x68, 0x6e, 0x59, 0x32, 0x77, 0x7a, 0x45, 0x41, 0x72, - 0x43, 0x33, 0x57, 0x78, 0x4d, 0x58, 0x46, 0x6a, 0x4d, 0x77, 0x66, 0x67, 0x62, 0x69, 0x62, 0x77, 0x44, 0x6a, - 0x35, 0x7a, 0x68, 0x47, 0x69, 0x42, 0x6e, 0x59, 0x32, 0x77, 0x7a, 0x45, 0x41, 0x72, 0x43, 0x33, 0x57, 0x78, - 0x4d, 0x58, 0x46, 0x6a, 0x4d, 0x77, 0x66, 0x67, 0x5a, 0x69, 0x41, 0x52, 0x67, 0x2f, 0x78, 0x7a, 0x46, 0x43, 0x0a, - 0x7a, 0x4d, 0x44, 0x65, 0x5a, 0x69, 0x41, 0x57, 0x67, 0x4c, 0x33, 0x64, 0x6d, 0x72, 0x69, 0x77, 0x6d, 0x49, - 0x48, 0x78, 0x4d, 0x78, 0x41, 0x4c, 0x77, 0x50, 0x67, 0x35, 0x6a, 0x68, 0x46, 0x69, 0x42, 0x76, 0x59, 0x32, - 0x41, 0x37, 0x45, 0x41, 0x37, 0x4f, 0x33, 0x57, 0x78, 0x49, 0x58, 0x46, 0x44, 0x49, 0x79, 0x66, 0x67, 0x56, - 0x67, 0x41, 0x78, 0x73, 0x39, 0x78, 0x6a, 0x42, 0x41, 0x7a, 0x73, 0x4c, 0x63, 0x5a, 0x2b, 0x44, 0x2f, 0x67, 0x0a, - 0x6b, 0x56, 0x6d, 0x37, 0x6b, 0x69, 0x4a, 0x4a, 0x36, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, - 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, - 0x34, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 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, 0x64, 0x35, 0x6b, 0x6c, 0x45, 0x51, 0x56, - 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x64, 0x66, 0x5a, 0x42, 0x63, 0x31, 0x58, 0x6e, 0x6d, 0x66, 0x37, 0x64, 0x37, 0x0a, - 0x50, 0x71, 0x55, 0x5a, 0x7a, 0x57, 0x6a, 0x30, 0x4d, 0x66, 0x70, 0x41, 0x51, 0x69, 0x4e, 0x45, 0x4a, 0x41, - 0x47, 0x79, 0x51, 0x4d, 0x45, 0x73, 0x77, 0x6f, 0x41, 0x4d, 0x43, 0x56, 0x35, 0x69, 0x78, 0x53, 0x6e, 0x6a, - 0x73, 0x47, 0x56, 0x58, 0x4a, 0x62, 0x76, 0x72, 0x4c, 0x55, 0x78, 0x43, 0x63, 0x4a, 0x6d, 0x74, 0x70, 0x4c, - 0x4c, 0x6c, 0x53, 0x72, 0x41, 0x68, 0x41, 0x64, 0x74, 0x4a, 0x4f, 0x61, 0x6d, 0x34, 0x6a, 0x41, 0x74, 0x77, 0x0a, - 0x58, 0x48, 0x61, 0x74, 0x64, 0x31, 0x31, 0x4f, 0x78, 0x52, 0x56, 0x32, 0x6c, 0x58, 0x56, 0x46, 0x57, 0x44, - 0x5a, 0x6c, 0x73, 0x41, 0x4f, 0x78, 0x4d, 0x49, 0x73, 0x52, 0x57, 0x42, 0x69, 0x51, 0x73, 0x4e, 0x43, 0x33, - 0x72, 0x4e, 0x46, 0x49, 0x6f, 0x35, 0x6e, 0x52, 0x6a, 0x4f, 0x61, 0x7a, 0x37, 0x38, 0x30, 0x66, 0x70, 0x78, - 0x76, 0x64, 0x61, 0x63, 0x31, 0x6f, 0x7a, 0x72, 0x6c, 0x39, 0x75, 0x2f, 0x74, 0x32, 0x33, 0x2b, 0x64, 0x58, 0x0a, - 0x64, 0x59, 0x76, 0x70, 0x34, 0x66, 0x53, 0x64, 0x6f, 0x2b, 0x37, 0x7a, 0x50, 0x50, 0x63, 0x39, 0x35, 0x37, - 0x7a, 0x6e, 0x48, 0x43, 0x38, 0x49, 0x41, 0x6f, 0x51, 0x51, 0x36, 0x53, 0x52, 0x54, 0x37, 0x51, 0x6f, 0x49, - 0x49, 0x61, 0x71, 0x48, 0x44, 0x45, 0x43, 0x49, 0x46, 0x43, 0x4d, 0x44, 0x45, 0x43, 0x4c, 0x46, 0x79, 0x41, - 0x43, 0x45, 0x53, 0x44, 0x45, 0x79, 0x41, 0x43, 0x46, 0x53, 0x6a, 0x41, 0x78, 0x41, 0x69, 0x42, 0x51, 0x6a, 0x0a, - 0x41, 0x78, 0x41, 0x69, 0x78, 0x63, 0x67, 0x41, 0x68, 0x45, 0x67, 0x78, 0x44, 0x61, 0x58, 0x65, 0x34, 0x49, - 0x6c, 0x58, 0x78, 0x75, 0x4f, 0x6f, 0x68, 0x78, 0x41, 0x69, 0x41, 0x76, 0x64, 0x76, 0x61, 0x53, 0x37, 0x70, - 0x2f, 0x59, 0x6f, 0x41, 0x68, 0x45, 0x67, 0x78, 0x4a, 0x55, 0x63, 0x41, 0x6f, 0x71, 0x62, 0x78, 0x5a, 0x76, - 0x6d, 0x39, 0x38, 0x73, 0x4e, 0x54, 0x67, 0x67, 0x79, 0x67, 0x2f, 0x70, 0x67, 0x48, 0x58, 0x41, 0x56, 0x73, 0x0a, - 0x41, 0x6a, 0x72, 0x79, 0x50, 0x77, 0x4f, 0x73, 0x42, 0x70, 0x61, 0x45, 0x79, 0x71, 0x30, 0x48, 0x35, 0x73, - 0x39, 0x79, 0x6a, 0x78, 0x46, 0x67, 0x58, 0x2b, 0x68, 0x31, 0x48, 0x33, 0x41, 0x6b, 0x2f, 0x2f, 0x4d, 0x62, - 0x77, 0x43, 0x43, 0x77, 0x4e, 0x2f, 0x2f, 0x7a, 0x2b, 0x56, 0x68, 0x71, 0x4c, 0x61, 0x71, 0x43, 0x44, 0x4b, - 0x41, 0x32, 0x38, 0x59, 0x42, 0x31, 0x6f, 0x57, 0x73, 0x54, 0x52, 0x75, 0x67, 0x39, 0x77, 0x49, 0x6f, 0x59, 0x0a, - 0x37, 0x6a, 0x38, 0x66, 0x32, 0x47, 0x4a, 0x5a, 0x39, 0x67, 0x52, 0x77, 0x45, 0x47, 0x4d, 0x47, 0x65, 0x34, - 0x46, 0x66, 0x68, 0x69, 0x35, 0x46, 0x45, 0x67, 0x6c, 0x48, 0x42, 0x6c, 0x41, 0x62, 0x58, 0x41, 0x6c, 0x73, - 0x42, 0x57, 0x34, 0x47, 0x62, 0x67, 0x41, 0x32, 0x56, 0x37, 0x63, 0x36, 0x30, 0x31, 0x69, 0x52, 0x76, 0x39, - 0x34, 0x33, 0x77, 0x2f, 0x39, 0x37, 0x44, 0x58, 0x67, 0x4a, 0x65, 0x41, 0x48, 0x59, 0x44, 0x62, 0x78, 0x64, 0x0a, - 0x77, 0x58, 0x6f, 0x4a, 0x43, 0x32, 0x51, 0x41, 0x79, 0x65, 0x51, 0x47, 0x34, 0x42, 0x61, 0x4d, 0x34, 0x47, - 0x38, 0x47, 0x46, 0x6c, 0x65, 0x33, 0x4f, 0x70, 0x48, 0x5a, 0x6e, 0x4c, 0x2f, 0x75, 0x7a, 0x62, 0x38, 0x2b, - 0x6a, 0x54, 0x47, 0x43, 0x46, 0x34, 0x44, 0x6e, 0x38, 0x7a, 0x2b, 0x4c, 0x4b, 0x69, 0x49, 0x44, 0x53, 0x41, - 0x61, 0x62, 0x67, 0x4f, 0x33, 0x41, 0x48, 0x52, 0x6a, 0x42, 0x4e, 0x31, 0x57, 0x33, 0x4f, 0x6d, 0x56, 0x6a, 0x0a, - 0x4d, 0x66, 0x43, 0x68, 0x2f, 0x41, 0x57, 0x51, 0x77, 0x35, 0x6a, 0x42, 0x4c, 0x6d, 0x41, 0x6e, 0x70, 0x67, - 0x73, 0x68, 0x4b, 0x6f, 0x67, 0x4d, 0x6f, 0x44, 0x70, 0x30, 0x59, 0x63, 0x52, 0x2b, 0x4f, 0x33, 0x41, 0x58, - 0x30, 0x77, 0x66, 0x6e, 0x30, 0x6b, 0x51, 0x57, 0x32, 0x4a, 0x61, 0x2f, 0x2f, 0x67, 0x6f, 0x7a, 0x32, 0x4c, - 0x67, 0x44, 0x65, 0x42, 0x5a, 0x34, 0x42, 0x75, 0x69, 0x76, 0x58, 0x74, 0x58, 0x53, 0x67, 0x51, 0x79, 0x67, 0x0a, - 0x73, 0x6e, 0x77, 0x55, 0x75, 0x44, 0x74, 0x2f, 0x69, 0x59, 0x74, 0x5a, 0x41, 0x76, 0x78, 0x42, 0x2f, 0x67, - 0x4a, 0x34, 0x4b, 0x6e, 0x2f, 0x4a, 0x44, 0x4d, 0x71, 0x45, 0x44, 0x4b, 0x44, 0x38, 0x33, 0x41, 0x6e, 0x63, - 0x67, 0x33, 0x6e, 0x53, 0x5a, 0x36, 0x74, 0x63, 0x6c, 0x31, 0x6f, 0x6a, 0x62, 0x4a, 0x5a, 0x50, 0x41, 0x64, - 0x2f, 0x41, 0x64, 0x42, 0x64, 0x45, 0x54, 0x4d, 0x67, 0x41, 0x79, 0x6b, 0x4d, 0x50, 0x38, 0x48, 0x47, 0x4d, 0x0a, - 0x38, 0x46, 0x64, 0x57, 0x74, 0x79, 0x70, 0x31, 0x51, 0x38, 0x45, 0x4d, 0x6a, 0x6d, 0x4f, 0x4d, 0x34, 0x4a, - 0x75, 0x59, 0x36, 0x55, 0x64, 0x52, 0x41, 0x6c, 0x55, 0x33, 0x67, 0x47, 0x2b, 0x38, 0x31, 0x56, 0x6a, 0x74, - 0x4b, 0x70, 0x54, 0x45, 0x50, 0x52, 0x73, 0x6d, 0x77, 0x79, 0x38, 0x2f, 0x43, 0x4e, 0x79, 0x50, 0x47, 0x64, - 0x41, 0x54, 0x35, 0x57, 0x45, 0x6c, 0x38, 0x46, 0x44, 0x2b, 0x32, 0x67, 0x6b, 0x38, 0x41, 0x54, 0x78, 0x64, 0x0a, - 0x2b, 0x4a, 0x2b, 0x31, 0x31, 0x70, 0x36, 0x4b, 0x32, 0x6b, 0x2f, 0x46, 0x71, 0x62, 0x6f, 0x42, 0x31, 0x43, - 0x49, 0x7a, 0x66, 0x47, 0x6e, 0x33, 0x59, 0x59, 0x53, 0x2f, 0x71, 0x66, 0x4b, 0x31, 0x6d, 0x55, 0x34, 0x75, - 0x67, 0x4c, 0x50, 0x6a, 0x48, 0x6d, 0x66, 0x48, 0x50, 0x53, 0x5a, 0x38, 0x47, 0x42, 0x67, 0x33, 0x32, 0x62, - 0x37, 0x44, 0x6b, 0x78, 0x35, 0x6a, 0x75, 0x51, 0x76, 0x6c, 0x42, 0x69, 0x63, 0x38, 0x4a, 0x76, 0x32, 0x5a, 0x0a, - 0x37, 0x39, 0x47, 0x59, 0x67, 0x59, 0x36, 0x6d, 0x43, 0x7a, 0x6b, 0x38, 0x4c, 0x56, 0x6c, 0x6f, 0x61, 0x7a, - 0x53, 0x76, 0x4f, 0x35, 0x73, 0x44, 0x6d, 0x6a, 0x4b, 0x77, 0x73, 0x44, 0x6c, 0x67, 0x59, 0x58, 0x4e, 0x41, - 0x64, 0x72, 0x5a, 0x6b, 0x34, 0x73, 0x71, 0x77, 0x50, 0x58, 0x2f, 0x74, 0x78, 0x52, 0x6a, 0x42, 0x56, 0x38, - 0x50, 0x66, 0x54, 0x61, 0x32, 0x5a, 0x51, 0x54, 0x57, 0x51, 0x41, 0x54, 0x68, 0x51, 0x4a, 0x50, 0x77, 0x75, 0x0a, - 0x34, 0x4a, 0x4d, 0x59, 0x34, 0x53, 0x2b, 0x72, 0x64, 0x46, 0x32, 0x47, 0x4a, 0x6a, 0x79, 0x47, 0x4a, 0x73, - 0x31, 0x2f, 0x43, 0x34, 0x49, 0x2f, 0x4e, 0x77, 0x6e, 0x6e, 0x70, 0x30, 0x70, 0x58, 0x35, 0x4b, 0x51, 0x50, - 0x70, 0x38, 0x65, 0x4b, 0x37, 0x7a, 0x50, 0x7a, 0x66, 0x65, 0x63, 0x31, 0x42, 0x4c, 0x51, 0x33, 0x58, 0x6a, - 0x43, 0x45, 0x42, 0x55, 0x30, 0x42, 0x43, 0x78, 0x70, 0x68, 0x51, 0x56, 0x4e, 0x46, 0x6b, 0x77, 0x41, 0x33, 0x0a, - 0x41, 0x55, 0x38, 0x43, 0x44, 0x32, 0x4f, 0x4d, 0x34, 0x48, 0x47, 0x67, 0x76, 0x2f, 0x42, 0x39, 0x79, 0x51, - 0x68, 0x6d, 0x52, 0x77, 0x5a, 0x67, 0x53, 0x55, 0x6a, 0x38, 0x6a, 0x63, 0x43, 0x44, 0x6d, 0x4d, 0x5a, 0x57, - 0x45, 0x59, 0x59, 0x6d, 0x50, 0x45, 0x36, 0x4e, 0x65, 0x76, 0x53, 0x4f, 0x65, 0x76, 0x53, 0x4e, 0x65, 0x5a, - 0x79, 0x35, 0x53, 0x4a, 0x7a, 0x56, 0x34, 0x2f, 0x79, 0x55, 0x78, 0x2f, 0x6b, 0x70, 0x36, 0x42, 0x32, 0x39, 0x0a, - 0x75, 0x45, 0x36, 0x4c, 0x57, 0x67, 0x4b, 0x57, 0x74, 0x41, 0x52, 0x30, 0x74, 0x77, 0x59, 0x73, 0x62, 0x51, - 0x30, 0x71, 0x59, 0x51, 0x72, 0x4c, 0x67, 0x45, 0x66, 0x79, 0x31, 0x31, 0x38, 0x43, 0x6e, 0x77, 0x63, 0x6d, - 0x37, 0x39, 0x6b, 0x77, 0x4b, 0x52, 0x4f, 0x59, 0x42, 0x52, 0x6e, 0x41, 0x48, 0x42, 0x51, 0x39, 0x39, 0x66, - 0x38, 0x63, 0x38, 0x38, 0x51, 0x76, 0x36, 0x38, 0x44, 0x65, 0x38, 0x4b, 0x54, 0x48, 0x30, 0x52, 0x47, 0x50, 0x0a, - 0x34, 0x79, 0x4d, 0x65, 0x76, 0x65, 0x63, 0x7a, 0x30, 0x30, 0x4c, 0x33, 0x57, 0x75, 0x4a, 0x4d, 0x33, 0x71, - 0x7a, 0x65, 0x47, 0x6a, 0x43, 0x76, 0x57, 0x37, 0x4b, 0x77, 0x74, 0x4e, 0x58, 0x6e, 0x73, 0x72, 0x61, 0x41, - 0x56, 0x66, 0x4f, 0x44, 0x64, 0x37, 0x73, 0x56, 0x5a, 0x65, 0x4a, 0x68, 0x34, 0x42, 0x4f, 0x59, 0x69, 0x4f, - 0x41, 0x4c, 0x69, 0x67, 0x5a, 0x6d, 0x52, 0x67, 0x59, 0x77, 0x43, 0x30, 0x58, 0x43, 0x66, 0x77, 0x41, 0x6a, 0x0a, - 0x2f, 0x50, 0x58, 0x6c, 0x2b, 0x46, 0x73, 0x42, 0x63, 0x48, 0x7a, 0x45, 0x34, 0x38, 0x52, 0x49, 0x68, 0x73, - 0x50, 0x44, 0x48, 0x6b, 0x4d, 0x54, 0x79, 0x58, 0x6e, 0x43, 0x78, 0x38, 0x6c, 0x59, 0x44, 0x6f, 0x34, 0x4d, - 0x5a, 0x7a, 0x67, 0x79, 0x62, 0x46, 0x34, 0x76, 0x61, 0x41, 0x71, 0x34, 0x76, 0x43, 0x31, 0x67, 0x78, 0x58, - 0x79, 0x66, 0x6c, 0x66, 0x4f, 0x44, 0x57, 0x64, 0x63, 0x6d, 0x6c, 0x38, 0x42, 0x4b, 0x54, 0x42, 0x54, 0x77, 0x0a, - 0x58, 0x7a, 0x42, 0x47, 0x38, 0x4a, 0x69, 0x4d, 0x59, 0x44, 0x6f, 0x79, 0x67, 0x43, 0x49, 0x71, 0x4f, 0x61, - 0x70, 0x2f, 0x62, 0x4d, 0x54, 0x6a, 0x34, 0x4c, 0x6b, 0x4d, 0x68, 0x38, 0x39, 0x6c, 0x47, 0x4b, 0x2f, 0x52, - 0x70, 0x33, 0x77, 0x70, 0x44, 0x45, 0x31, 0x34, 0x37, 0x4f, 0x33, 0x33, 0x32, 0x4e, 0x75, 0x66, 0x6f, 0x54, - 0x6b, 0x4c, 0x6c, 0x37, 0x66, 0x37, 0x39, 0x4c, 0x53, 0x58, 0x78, 0x51, 0x7a, 0x57, 0x41, 0x31, 0x38, 0x47, 0x0a, - 0x50, 0x6b, 0x42, 0x2b, 0x31, 0x6b, 0x42, 0x47, 0x59, 0x4a, 0x41, 0x42, 0x68, 0x41, 0x69, 0x4a, 0x66, 0x77, - 0x32, 0x6d, 0x6e, 0x2f, 0x2b, 0x4a, 0x75, 0x50, 0x2f, 0x47, 0x71, 0x56, 0x47, 0x50, 0x66, 0x59, 0x50, 0x70, - 0x46, 0x66, 0x31, 0x73, 0x6a, 0x4f, 0x64, 0x67, 0x2f, 0x30, 0x43, 0x47, 0x2f, 0x51, 0x4d, 0x58, 0x7a, 0x47, - 0x42, 0x39, 0x68, 0x38, 0x2f, 0x53, 0x31, 0x6c, 0x69, 0x37, 0x43, 0x59, 0x56, 0x5a, 0x67, 0x36, 0x39, 0x6a, 0x0a, - 0x49, 0x6f, 0x4e, 0x44, 0x61, 0x52, 0x38, 0x66, 0x6b, 0x41, 0x46, 0x77, 0x30, 0x56, 0x50, 0x2f, 0x73, 0x35, - 0x68, 0x42, 0x70, 0x4e, 0x67, 0x59, 0x7a, 0x38, 0x48, 0x62, 0x67, 0x78, 0x6e, 0x32, 0x44, 0x57, 0x62, 0x65, - 0x6e, 0x5a, 0x59, 0x54, 0x73, 0x78, 0x4d, 0x32, 0x67, 0x38, 0x37, 0x6d, 0x67, 0x50, 0x55, 0x64, 0x50, 0x6c, - 0x64, 0x32, 0x2b, 0x44, 0x54, 0x48, 0x6c, 0x30, 0x66, 0x35, 0x69, 0x66, 0x7a, 0x31, 0x45, 0x50, 0x42, 0x6f, 0x0a, - 0x6d, 0x71, 0x4f, 0x42, 0x31, 0x4f, 0x38, 0x4a, 0x47, 0x42, 0x4c, 0x2f, 0x65, 0x34, 0x48, 0x76, 0x45, 0x61, - 0x50, 0x34, 0x2b, 0x38, 0x59, 0x38, 0x66, 0x6e, 0x51, 0x69, 0x79, 0x7a, 0x2f, 0x38, 0x73, 0x70, 0x47, 0x66, - 0x6e, 0x73, 0x70, 0x4b, 0x2f, 0x42, 0x45, 0x59, 0x47, 0x50, 0x66, 0x34, 0x36, 0x53, 0x6e, 0x7a, 0x47, 0x66, - 0x37, 0x6f, 0x52, 0x4a, 0x61, 0x2b, 0x65, 0x47, 0x64, 0x41, 0x48, 0x73, 0x46, 0x38, 0x35, 0x2b, 0x2b, 0x46, 0x0a, - 0x36, 0x69, 0x66, 0x6c, 0x56, 0x49, 0x50, 0x55, 0x52, 0x67, 0x42, 0x46, 0x58, 0x2f, 0x61, 0x6a, 0x77, 0x47, - 0x66, 0x69, 0x75, 0x76, 0x65, 0x52, 0x34, 0x51, 0x77, 0x2f, 0x50, 0x35, 0x4f, 0x5a, 0x63, 0x57, 0x70, 0x4d, - 0x52, 0x4d, 0x4d, 0x50, 0x34, 0x4d, 0x42, 0x51, 0x68, 0x67, 0x4e, 0x44, 0x47, 0x62, 0x70, 0x62, 0x41, 0x39, - 0x36, 0x7a, 0x79, 0x47, 0x64, 0x31, 0x32, 0x79, 0x79, 0x5a, 0x54, 0x47, 0x37, 0x63, 0x6d, 0x62, 0x38, 0x2b, 0x0a, - 0x42, 0x33, 0x77, 0x32, 0x62, 0x64, 0x46, 0x41, 0x4b, 0x69, 0x4f, 0x41, 0x6b, 0x50, 0x6a, 0x58, 0x59, 0x35, - 0x61, 0x65, 0x6c, 0x69, 0x7a, 0x2b, 0x41, 0x42, 0x4f, 0x32, 0x50, 0x76, 0x56, 0x4f, 0x41, 0x38, 0x38, 0x63, - 0x79, 0x30, 0x72, 0x38, 0x5a, 0x61, 0x52, 0x33, 0x31, 0x4f, 0x4f, 0x5a, 0x59, 0x31, 0x6d, 0x65, 0x65, 0x71, - 0x65, 0x42, 0x2f, 0x51, 0x4f, 0x5a, 0x75, 0x50, 0x59, 0x64, 0x2b, 0x77, 0x79, 0x6d, 0x4c, 0x61, 0x79, 0x48, 0x0a, - 0x39, 0x45, 0x51, 0x44, 0x71, 0x54, 0x4f, 0x41, 0x30, 0x42, 0x66, 0x37, 0x2b, 0x35, 0x67, 0x74, 0x71, 0x32, - 0x34, 0x72, 0x39, 0x5a, 0x35, 0x76, 0x44, 0x78, 0x72, 0x68, 0x50, 0x33, 0x38, 0x79, 0x79, 0x32, 0x43, 0x64, - 0x54, 0x75, 0x45, 0x6c, 0x6b, 0x63, 0x45, 0x4a, 0x6a, 0x2b, 0x64, 0x50, 0x47, 0x69, 0x4e, 0x34, 0x65, 0x7a, - 0x43, 0x57, 0x70, 0x6e, 0x77, 0x62, 0x70, 0x6b, 0x33, 0x38, 0x50, 0x71, 0x54, 0x44, 0x42, 0x46, 0x4c, 0x54, 0x0a, - 0x42, 0x53, 0x6a, 0x36, 0x4d, 0x70, 0x2f, 0x45, 0x35, 0x4f, 0x2b, 0x58, 0x78, 0x44, 0x74, 0x44, 0x47, 0x66, - 0x61, 0x63, 0x30, 0x63, 0x42, 0x65, 0x74, 0x52, 0x6d, 0x61, 0x38, 0x50, 0x6a, 0x58, 0x58, 0x32, 0x58, 0x35, - 0x65, 0x58, 0x2b, 0x47, 0x36, 0x78, 0x62, 0x35, 0x72, 0x46, 0x31, 0x51, 0x55, 0x74, 0x65, 0x67, 0x47, 0x66, - 0x67, 0x57, 0x5a, 0x6f, 0x2f, 0x44, 0x50, 0x36, 0x72, 0x33, 0x4c, 0x6b, 0x45, 0x71, 0x49, 0x6f, 0x43, 0x51, 0x0a, - 0x2b, 0x44, 0x64, 0x6a, 0x48, 0x4c, 0x34, 0x6b, 0x38, 0x66, 0x65, 0x4e, 0x65, 0x58, 0x7a, 0x33, 0x55, 0x41, - 0x50, 0x50, 0x6e, 0x64, 0x44, 0x41, 0x58, 0x70, 0x49, 0x59, 0x47, 0x50, 0x64, 0x34, 0x37, 0x6b, 0x53, 0x57, - 0x37, 0x78, 0x35, 0x71, 0x69, 0x47, 0x4f, 0x77, 0x38, 0x44, 0x35, 0x4d, 0x57, 0x39, 0x6b, 0x4d, 0x39, 0x52, - 0x73, 0x4e, 0x31, 0x48, 0x55, 0x45, 0x55, 0x50, 0x53, 0x6c, 0x2f, 0x56, 0x66, 0x67, 0x66, 0x7a, 0x4c, 0x37, 0x0a, - 0x59, 0x52, 0x68, 0x7a, 0x4d, 0x6a, 0x7a, 0x70, 0x38, 0x58, 0x4b, 0x66, 0x47, 0x59, 0x67, 0x53, 0x79, 0x61, - 0x56, 0x67, 0x30, 0x46, 0x63, 0x73, 0x38, 0x4c, 0x6c, 0x2b, 0x69, 0x56, 0x39, 0x4b, 0x79, 0x76, 0x46, 0x37, - 0x67, 0x44, 0x33, 0x41, 0x66, 0x77, 0x50, 0x2b, 0x56, 0x7a, 0x31, 0x47, 0x41, 0x33, 0x58, 0x62, 0x6b, 0x6b, - 0x50, 0x69, 0x7a, 0x77, 0x4a, 0x66, 0x77, 0x32, 0x77, 0x67, 0x45, 0x55, 0x6e, 0x38, 0x66, 0x67, 0x43, 0x76, 0x0a, - 0x6e, 0x6a, 0x48, 0x39, 0x66, 0x49, 0x6d, 0x2f, 0x64, 0x6a, 0x67, 0x77, 0x5a, 0x4c, 0x36, 0x7a, 0x56, 0x38, - 0x39, 0x6b, 0x38, 0x4b, 0x4f, 0x50, 0x46, 0x48, 0x71, 0x59, 0x74, 0x76, 0x4d, 0x31, 0x38, 0x6a, 0x73, 0x36, - 0x31, 0x56, 0x4d, 0x30, 0x55, 0x4a, 0x65, 0x74, 0x4f, 0x66, 0x51, 0x46, 0x58, 0x59, 0x73, 0x4a, 0x34, 0x2b, - 0x36, 0x64, 0x76, 0x66, 0x53, 0x6c, 0x36, 0x52, 0x76, 0x7a, 0x32, 0x48, 0x47, 0x6f, 0x67, 0x5a, 0x2f, 0x31, 0x0a, - 0x5a, 0x63, 0x6e, 0x70, 0x6d, 0x49, 0x75, 0x61, 0x49, 0x78, 0x66, 0x41, 0x7a, 0x2f, 0x71, 0x79, 0x37, 0x43, - 0x69, 0x39, 0x57, 0x33, 0x41, 0x76, 0x70, 0x69, 0x31, 0x64, 0x43, 0x2f, 0x56, 0x6a, 0x41, 0x6e, 0x56, 0x6e, - 0x41, 0x4b, 0x45, 0x76, 0x35, 0x73, 0x4f, 0x59, 0x38, 0x4f, 0x33, 0x71, 0x4b, 0x50, 0x65, 0x5a, 0x39, 0x4f, - 0x48, 0x46, 0x58, 0x74, 0x4f, 0x66, 0x56, 0x44, 0x2b, 0x2f, 0x39, 0x68, 0x6b, 0x59, 0x4e, 0x39, 0x32, 0x43, 0x0a, - 0x46, 0x33, 0x75, 0x7a, 0x73, 0x32, 0x36, 0x45, 0x59, 0x73, 0x48, 0x56, 0x6d, 0x44, 0x62, 0x31, 0x59, 0x61, - 0x67, 0x50, 0x45, 0x36, 0x67, 0x72, 0x41, 0x77, 0x68, 0x39, 0x49, 0x51, 0x39, 0x67, 0x74, 0x70, 0x65, 0x4f, - 0x52, 0x4f, 0x2b, 0x6f, 0x78, 0x34, 0x36, 0x44, 0x44, 0x66, 0x7a, 0x69, 0x62, 0x46, 0x31, 0x39, 0x50, 0x41, - 0x4c, 0x34, 0x78, 0x64, 0x6b, 0x4d, 0x4f, 0x77, 0x34, 0x32, 0x6c, 0x4a, 0x71, 0x6e, 0x73, 0x51, 0x50, 0x54, 0x0a, - 0x78, 0x6d, 0x72, 0x65, 0x42, 0x4f, 0x70, 0x69, 0x45, 0x4c, 0x44, 0x6f, 0x53, 0x33, 0x67, 0x4d, 0x2b, 0x46, - 0x54, 0x55, 0x65, 0x37, 0x31, 0x32, 0x4a, 0x73, 0x50, 0x50, 0x2b, 0x72, 0x49, 0x36, 0x31, 0x4b, 0x36, 0x4f, - 0x4f, 0x54, 0x66, 0x70, 0x73, 0x66, 0x4e, 0x77, 0x41, 0x37, 0x2b, 0x2b, 0x4a, 0x4d, 0x66, 0x6d, 0x52, 0x5a, - 0x48, 0x44, 0x67, 0x53, 0x39, 0x6a, 0x7a, 0x6d, 0x56, 0x38, 0x6f, 0x4a, 0x59, 0x48, 0x42, 0x32, 0x76, 0x2b, 0x0a, - 0x45, 0x52, 0x63, 0x53, 0x2f, 0x79, 0x72, 0x67, 0x58, 0x34, 0x67, 0x6f, 0x2f, 0x72, 0x45, 0x63, 0x66, 0x50, - 0x39, 0x6f, 0x41, 0x79, 0x39, 0x4c, 0x2f, 0x4b, 0x6b, 0x67, 0x41, 0x46, 0x37, 0x75, 0x79, 0x2f, 0x4c, 0x39, - 0x6f, 0x77, 0x32, 0x6c, 0x62, 0x4c, 0x6a, 0x79, 0x4b, 0x55, 0x79, 0x62, 0x57, 0x77, 0x57, 0x31, 0x47, 0x51, - 0x33, 0x55, 0x74, 0x41, 0x45, 0x55, 0x4c, 0x64, 0x2f, 0x39, 0x4e, 0x68, 0x48, 0x58, 0x37, 0x52, 0x64, 0x43, 0x0a, - 0x2f, 0x6d, 0x4d, 0x6a, 0x36, 0x75, 0x75, 0x6e, 0x6a, 0x57, 0x4d, 0x6a, 0x58, 0x71, 0x6c, 0x64, 0x67, 0x75, - 0x33, 0x41, 0x50, 0x32, 0x4c, 0x61, 0x59, 0x4d, 0x32, 0x5a, 0x51, 0x4d, 0x30, 0x61, 0x51, 0x4f, 0x69, 0x44, - 0x76, 0x67, 0x4c, 0x34, 0x4a, 0x38, 0x78, 0x68, 0x6d, 0x73, 0x37, 0x73, 0x4f, 0x5a, 0x31, 0x68, 0x35, 0x2b, - 0x47, 0x47, 0x57, 0x44, 0x62, 0x54, 0x46, 0x4c, 0x58, 0x4a, 0x2b, 0x53, 0x6e, 0x54, 0x4a, 0x64, 0x68, 0x7a, 0x0a, - 0x4f, 0x72, 0x49, 0x63, 0x62, 0x73, 0x4b, 0x30, 0x77, 0x53, 0x75, 0x67, 0x74, 0x6b, 0x79, 0x67, 0x4a, 0x67, - 0x32, 0x67, 0x53, 0x50, 0x7a, 0x2f, 0x41, 0x6c, 0x7a, 0x76, 0x65, 0x6f, 0x2b, 0x78, 0x48, 0x4f, 0x77, 0x36, - 0x32, 0x73, 0x41, 0x72, 0x70, 0x78, 0x58, 0x79, 0x43, 0x39, 0x4d, 0x6c, 0x65, 0x4f, 0x56, 0x30, 0x6c, 0x6c, - 0x33, 0x52, 0x75, 0x77, 0x54, 0x58, 0x59, 0x39, 0x70, 0x69, 0x54, 0x5a, 0x6c, 0x41, 0x7a, 0x52, 0x6c, 0x41, 0x0a, - 0x6b, 0x66, 0x68, 0x2f, 0x41, 0x47, 0x78, 0x77, 0x76, 0x55, 0x66, 0x66, 0x6d, 0x4d, 0x66, 0x2f, 0x50, 0x64, - 0x6a, 0x49, 0x63, 0x59, 0x58, 0x38, 0x6f, 0x6f, 0x6a, 0x6a, 0x49, 0x36, 0x5a, 0x74, 0x52, 0x4d, 0x77, 0x5a, - 0x32, 0x49, 0x42, 0x70, 0x6b, 0x7a, 0x56, 0x6a, 0x41, 0x6a, 0x56, 0x6c, 0x41, 0x45, 0x56, 0x39, 0x2f, 0x76, - 0x38, 0x48, 0x72, 0x48, 0x57, 0x39, 0x78, 0x38, 0x46, 0x7a, 0x4a, 0x75, 0x51, 0x66, 0x6e, 0x59, 0x71, 0x78, 0x0a, - 0x59, 0x71, 0x4b, 0x75, 0x47, 0x4a, 0x32, 0x43, 0x6e, 0x59, 0x63, 0x62, 0x4f, 0x48, 0x67, 0x75, 0x6b, 0x6a, - 0x7a, 0x57, 0x59, 0x74, 0x72, 0x6d, 0x47, 0x6b, 0x69, 0x2b, 0x43, 0x64, 0x53, 0x4d, 0x41, 0x52, 0x53, 0x4a, - 0x2f, 0x35, 0x2b, 0x49, 0x6b, 0x4f, 0x44, 0x7a, 0x32, 0x70, 0x6b, 0x4d, 0x7a, 0x78, 0x35, 0x58, 0x52, 0x70, - 0x2b, 0x59, 0x6d, 0x31, 0x77, 0x41, 0x7a, 0x78, 0x37, 0x50, 0x38, 0x74, 0x71, 0x5a, 0x53, 0x42, 0x4b, 0x35, 0x0a, - 0x47, 0x74, 0x4e, 0x47, 0x31, 0x30, 0x43, 0x79, 0x54, 0x61, 0x42, 0x6d, 0x44, 0x43, 0x44, 0x50, 0x4b, 0x75, - 0x42, 0x2f, 0x34, 0x39, 0x6a, 0x6e, 0x44, 0x34, 0x44, 0x64, 0x76, 0x56, 0x6c, 0x65, 0x37, 0x74, 0x50, 0x68, - 0x76, 0x4d, 0x4b, 0x4e, 0x6c, 0x2f, 0x75, 0x79, 0x37, 0x4f, 0x36, 0x4e, 0x4e, 0x45, 0x35, 0x30, 0x50, 0x61, - 0x61, 0x74, 0x72, 0x6f, 0x71, 0x37, 0x54, 0x6e, 0x46, 0x53, 0x45, 0x77, 0x59, 0x51, 0x63, 0x74, 0x41, 0x6e, 0x0a, - 0x63, 0x52, 0x7a, 0x74, 0x39, 0x77, 0x50, 0x34, 0x30, 0x59, 0x6b, 0x73, 0x62, 0x79, 0x69, 0x72, 0x54, 0x30, - 0x54, 0x6b, 0x6a, 0x62, 0x4d, 0x5a, 0x6e, 0x6a, 0x75, 0x65, 0x6a, 0x62, 0x4b, 0x67, 0x36, 0x42, 0x5a, 0x4d, - 0x6d, 0x30, 0x31, 0x73, 0x46, 0x4a, 0x42, 0x34, 0x56, 0x59, 0x51, 0x2b, 0x75, 0x4d, 0x64, 0x77, 0x6e, 0x4f, - 0x66, 0x50, 0x42, 0x66, 0x44, 0x44, 0x34, 0x31, 0x6e, 0x65, 0x30, 0x51, 0x6f, 0x2b, 0x55, 0x53, 0x49, 0x48, 0x0a, - 0x7a, 0x32, 0x58, 0x34, 0x59, 0x62, 0x54, 0x75, 0x34, 0x33, 0x5a, 0x4d, 0x32, 0x30, 0x32, 0x6b, 0x43, 0x53, - 0x52, 0x61, 0x47, 0x61, 0x45, 0x50, 0x37, 0x44, 0x34, 0x63, 0x4d, 0x2f, 0x78, 0x79, 0x41, 0x66, 0x7a, 0x67, - 0x61, 0x41, 0x4e, 0x48, 0x68, 0x68, 0x50, 0x39, 0x54, 0x78, 0x51, 0x31, 0x78, 0x4a, 0x48, 0x68, 0x44, 0x44, - 0x38, 0x34, 0x32, 0x68, 0x44, 0x46, 0x42, 0x44, 0x35, 0x46, 0x66, 0x68, 0x4f, 0x61, 0x70, 0x4a, 0x6c, 0x41, 0x0a, - 0x59, 0x74, 0x56, 0x52, 0x74, 0x4b, 0x72, 0x76, 0x53, 0x5a, 0x66, 0x33, 0x35, 0x67, 0x4c, 0x34, 0x33, 0x70, - 0x45, 0x47, 0x54, 0x70, 0x7a, 0x58, 0x4e, 0x4a, 0x2b, 0x49, 0x6c, 0x78, 0x50, 0x6e, 0x50, 0x62, 0x35, 0x33, - 0x4a, 0x4a, 0x49, 0x4a, 0x50, 0x45, 0x6b, 0x43, 0x56, 0x78, 0x45, 0x6d, 0x30, 0x67, 0x42, 0x43, 0x48, 0x39, - 0x41, 0x57, 0x48, 0x46, 0x66, 0x31, 0x2b, 0x51, 0x45, 0x38, 0x63, 0x36, 0x7a, 0x6b, 0x31, 0x56, 0x35, 0x43, 0x0a, - 0x7a, 0x49, 0x72, 0x5a, 0x6c, 0x62, 0x67, 0x68, 0x79, 0x70, 0x6a, 0x41, 0x44, 0x6b, 0x79, 0x62, 0x54, 0x6f, - 0x77, 0x4a, 0x4a, 0x4e, 0x49, 0x41, 0x38, 0x71, 0x7a, 0x42, 0x54, 0x4b, 0x56, 0x59, 0x34, 0x2b, 0x66, 0x37, - 0x2f, 0x45, 0x72, 0x77, 0x45, 0x65, 0x58, 0x6d, 0x2b, 0x49, 0x6a, 0x48, 0x44, 0x36, 0x4d, 0x4e, 0x44, 0x4c, - 0x34, 0x37, 0x50, 0x5a, 0x67, 0x45, 0x45, 0x6d, 0x63, 0x41, 0x52, 0x53, 0x50, 0x2b, 0x31, 0x6f, 0x6b, 0x2b, 0x0a, - 0x41, 0x66, 0x44, 0x6a, 0x58, 0x32, 0x58, 0x56, 0x35, 0x78, 0x63, 0x56, 0x34, 0x38, 0x68, 0x77, 0x68, 0x68, - 0x2f, 0x2f, 0x79, 0x6e, 0x6d, 0x4b, 0x63, 0x43, 0x30, 0x4a, 0x6d, 0x68, 0x6c, 0x49, 0x6c, 0x46, 0x70, 0x43, - 0x48, 0x38, 0x68, 0x6e, 0x4d, 0x61, 0x65, 0x31, 0x57, 0x4c, 0x50, 0x37, 0x70, 0x45, 0x62, 0x37, 0x52, 0x65, - 0x56, 0x35, 0x5a, 0x79, 0x6a, 0x44, 0x37, 0x70, 0x50, 0x4f, 0x2b, 0x53, 0x56, 0x33, 0x59, 0x74, 0x70, 0x34, 0x0a, - 0x31, 0x55, 0x6d, 0x4d, 0x59, 0x6b, 0x4c, 0x69, 0x76, 0x77, 0x33, 0x48, 0x38, 0x2f, 0x6c, 0x65, 0x4f, 0x35, - 0x50, 0x68, 0x7a, 0x59, 0x48, 0x45, 0x2f, 0x46, 0x4e, 0x45, 0x79, 0x6e, 0x68, 0x7a, 0x49, 0x42, 0x4d, 0x6c, - 0x59, 0x2f, 0x41, 0x52, 0x59, 0x6a, 0x69, 0x55, 0x70, 0x6c, 0x53, 0x53, 0x70, 0x70, 0x6f, 0x31, 0x6d, 0x48, - 0x58, 0x39, 0x31, 0x68, 0x77, 0x5a, 0x4e, 0x6a, 0x76, 0x34, 0x43, 0x46, 0x46, 0x4e, 0x58, 0x75, 0x36, 0x4c, 0x0a, - 0x31, 0x50, 0x33, 0x38, 0x4e, 0x6c, 0x55, 0x65, 0x44, 0x30, 0x69, 0x45, 0x41, 0x52, 0x54, 0x31, 0x2b, 0x35, - 0x66, 0x62, 0x76, 0x71, 0x39, 0x76, 0x7a, 0x4f, 0x50, 0x5a, 0x34, 0x31, 0x72, 0x4f, 0x4b, 0x35, 0x4c, 0x42, - 0x73, 0x38, 0x65, 0x64, 0x54, 0x79, 0x39, 0x65, 0x6a, 0x75, 0x4d, 0x55, 0x64, 0x39, 0x78, 0x55, 0x33, 0x51, - 0x43, 0x69, 0x39, 0x76, 0x74, 0x48, 0x70, 0x38, 0x78, 0x30, 0x6e, 0x78, 0x62, 0x32, 0x69, 0x4b, 0x53, 0x51, 0x0a, - 0x79, 0x30, 0x39, 0x42, 0x4f, 0x36, 0x34, 0x30, 0x72, 0x65, 0x70, 0x34, 0x51, 0x4e, 0x55, 0x4e, 0x49, 0x4d, - 0x38, 0x31, 0x4f, 0x50, 0x54, 0x37, 0x7a, 0x58, 0x53, 0x66, 0x6c, 0x76, 0x53, 0x4b, 0x35, 0x44, 0x45, 0x36, - 0x5a, 0x64, 0x71, 0x6d, 0x34, 0x2f, 0x54, 0x67, 0x49, 0x78, 0x67, 0x4e, 0x56, 0x4a, 0x79, 0x6b, 0x47, 0x4d, - 0x44, 0x6a, 0x4c, 0x6f, 0x56, 0x66, 0x4f, 0x71, 0x58, 0x6a, 0x74, 0x30, 0x56, 0x79, 0x36, 0x52, 0x33, 0x31, 0x0a, - 0x2b, 0x4f, 0x6b, 0x70, 0x35, 0x33, 0x45, 0x70, 0x4a, 0x77, 0x33, 0x45, 0x52, 0x52, 0x49, 0x4d, 0x34, 0x41, - 0x76, 0x41, 0x72, 0x62, 0x61, 0x46, 0x33, 0x78, 0x37, 0x4d, 0x61, 0x4c, 0x39, 0x2b, 0x6b, 0x58, 0x6a, 0x65, - 0x4f, 0x4a, 0x74, 0x78, 0x50, 0x62, 0x4c, 0x38, 0x56, 0x6f, 0x77, 0x57, 0x4b, 0x6b, 0x71, 0x31, 0x6c, 0x58, - 0x51, 0x6a, 0x38, 0x47, 0x65, 0x32, 0x68, 0x51, 0x63, 0x6e, 0x50, 0x48, 0x62, 0x33, 0x61, 0x73, 0x52, 0x66, 0x0a, - 0x31, 0x41, 0x61, 0x37, 0x65, 0x37, 0x4d, 0x4d, 0x54, 0x6a, 0x68, 0x46, 0x71, 0x6e, 0x2b, 0x47, 0x30, 0x55, - 0x54, 0x46, 0x71, 0x4c, 0x59, 0x42, 0x50, 0x47, 0x78, 0x62, 0x73, 0x4c, 0x43, 0x75, 0x76, 0x34, 0x52, 0x6a, - 0x6e, 0x59, 0x53, 0x6f, 0x4b, 0x4a, 0x4f, 0x2b, 0x61, 0x62, 0x4f, 0x4f, 0x34, 0x77, 0x48, 0x57, 0x6d, 0x6f, - 0x69, 0x44, 0x61, 0x68, 0x71, 0x41, 0x30, 0x36, 0x6a, 0x2f, 0x4b, 0x36, 0x65, 0x7a, 0x6e, 0x43, 0x37, 0x39, 0x0a, - 0x7a, 0x48, 0x63, 0x68, 0x4b, 0x73, 0x72, 0x70, 0x4d, 0x59, 0x39, 0x58, 0x54, 0x6a, 0x74, 0x46, 0x72, 0x52, - 0x57, 0x64, 0x46, 0x61, 0x69, 0x57, 0x41, 0x61, 0x7a, 0x43, 0x59, 0x64, 0x54, 0x2f, 0x78, 0x48, 0x6d, 0x50, - 0x6e, 0x30, 0x66, 0x62, 0x6d, 0x30, 0x32, 0x49, 0x71, 0x76, 0x50, 0x7a, 0x4d, 0x78, 0x6e, 0x58, 0x70, 0x65, - 0x6d, 0x50, 0x55, 0x4b, 0x47, 0x74, 0x78, 0x4b, 0x71, 0x6c, 0x71, 0x67, 0x64, 0x74, 0x43, 0x30, 0x37, 0x36, 0x0a, - 0x38, 0x4c, 0x7a, 0x37, 0x67, 0x67, 0x73, 0x68, 0x45, 0x6b, 0x4f, 0x41, 0x61, 0x63, 0x4f, 0x4f, 0x33, 0x56, - 0x64, 0x72, 0x6a, 0x5a, 0x52, 0x43, 0x4e, 0x51, 0x7a, 0x67, 0x67, 0x38, 0x41, 0x66, 0x32, 0x68, 0x5a, 0x2b, - 0x75, 0x53, 0x2f, 0x4c, 0x38, 0x4b, 0x52, 0x43, 0x66, 0x31, 0x48, 0x62, 0x44, 0x45, 0x39, 0x36, 0x72, 0x70, - 0x76, 0x53, 0x2f, 0x69, 0x46, 0x47, 0x4b, 0x32, 0x57, 0x6c, 0x47, 0x67, 0x5a, 0x77, 0x76, 0x32, 0x33, 0x42, 0x0a, - 0x55, 0x36, 0x4d, 0x65, 0x62, 0x32, 0x72, 0x4b, 0x54, 0x39, 0x51, 0x4a, 0x62, 0x35, 0x37, 0x4e, 0x63, 0x4d, - 0x6f, 0x74, 0x66, 0x38, 0x56, 0x61, 0x4b, 0x31, 0x47, 0x70, 0x74, 0x4c, 0x72, 0x2b, 0x46, 0x4d, 0x75, 0x4e, - 0x50, 0x66, 0x30, 0x41, 0x6e, 0x6a, 0x2b, 0x70, 0x30, 0x46, 0x2f, 0x55, 0x44, 0x77, 0x47, 0x6d, 0x54, 0x54, - 0x76, 0x4d, 0x43, 0x6d, 0x77, 0x48, 0x2f, 0x72, 0x68, 0x73, 0x46, 0x61, 0x4c, 0x79, 0x42, 0x6d, 0x44, 0x74, 0x0a, - 0x61, 0x48, 0x76, 0x37, 0x4d, 0x77, 0x79, 0x4d, 0x4b, 0x2f, 0x51, 0x58, 0x39, 0x63, 0x58, 0x41, 0x75, 0x4d, - 0x66, 0x65, 0x66, 0x69, 0x66, 0x5a, 0x6c, 0x54, 0x55, 0x4b, 0x71, 0x4b, 0x51, 0x42, 0x2f, 0x44, 0x6e, 0x51, - 0x59, 0x31, 0x50, 0x77, 0x2f, 0x4a, 0x54, 0x48, 0x61, 0x32, 0x65, 0x55, 0x38, 0x43, 0x50, 0x71, 0x6b, 0x39, - 0x66, 0x4f, 0x5a, 0x46, 0x31, 0x4f, 0x6f, 0x31, 0x36, 0x48, 0x30, 0x55, 0x35, 0x5a, 0x71, 0x4a, 0x51, 0x42, 0x0a, - 0x64, 0x41, 0x47, 0x66, 0x74, 0x79, 0x33, 0x38, 0x30, 0x71, 0x6d, 0x4d, 0x45, 0x6e, 0x35, 0x45, 0x33, 0x54, - 0x4c, 0x70, 0x6d, 0x7a, 0x62, 0x75, 0x77, 0x4f, 0x63, 0x78, 0x47, 0x6f, 0x71, 0x64, 0x53, 0x68, 0x6e, 0x41, - 0x41, 0x37, 0x59, 0x46, 0x65, 0x30, 0x63, 0x39, 0x44, 0x6d, 0x68, 0x72, 0x4c, 0x31, 0x48, 0x6e, 0x48, 0x42, - 0x6a, 0x4b, 0x75, 0x43, 0x35, 0x6f, 0x73, 0x39, 0x61, 0x51, 0x43, 0x35, 0x56, 0x51, 0x57, 0x68, 0x63, 0x4f, 0x0a, - 0x36, 0x59, 0x33, 0x4b, 0x39, 0x52, 0x64, 0x70, 0x34, 0x55, 0x57, 0x33, 0x74, 0x76, 0x34, 0x77, 0x5a, 0x59, - 0x67, 0x43, 0x4b, 0x6d, 0x45, 0x41, 0x39, 0x39, 0x6b, 0x57, 0x66, 0x47, 0x63, 0x6f, 0x77, 0x78, 0x6d, 0x6c, - 0x2b, 0x34, 0x71, 0x55, 0x63, 0x48, 0x72, 0x4d, 0x63, 0x7a, 0x32, 0x43, 0x33, 0x46, 0x70, 0x4c, 0x74, 0x6c, - 0x54, 0x43, 0x41, 0x4b, 0x78, 0x47, 0x4d, 0x51, 0x4e, 0x67, 0x6a, 0x39, 0x4a, 0x39, 0x52, 0x63, 0x70, 0x34, 0x0a, - 0x35, 0x58, 0x54, 0x47, 0x5a, 0x61, 0x6f, 0x37, 0x39, 0x68, 0x6d, 0x42, 0x63, 0x69, 0x76, 0x75, 0x58, 0x6d, - 0x43, 0x6c, 0x54, 0x63, 0x45, 0x44, 0x67, 0x35, 0x72, 0x32, 0x45, 0x2b, 0x6c, 0x6a, 0x59, 0x4e, 0x7a, 0x6a, - 0x67, 0x50, 0x32, 0x2b, 0x41, 0x53, 0x73, 0x78, 0x6d, 0x6f, 0x71, 0x4e, 0x63, 0x68, 0x75, 0x41, 0x6e, 0x76, - 0x35, 0x43, 0x7a, 0x4d, 0x47, 0x65, 0x4d, 0x39, 0x57, 0x4c, 0x41, 0x73, 0x71, 0x70, 0x75, 0x67, 0x38, 0x43, 0x0a, - 0x31, 0x39, 0x6f, 0x55, 0x66, 0x48, 0x73, 0x67, 0x77, 0x35, 0x44, 0x62, 0x78, 0x67, 0x6c, 0x43, 0x31, 0x41, - 0x31, 0x44, 0x45, 0x78, 0x35, 0x76, 0x32, 0x35, 0x39, 0x72, 0x63, 0x53, 0x30, 0x78, 0x72, 0x68, 0x45, 0x6f, - 0x70, 0x77, 0x48, 0x59, 0x5a, 0x2f, 0x30, 0x70, 0x33, 0x31, 0x2b, 0x6b, 0x48, 0x45, 0x63, 0x4e, 0x78, 0x42, - 0x59, 0x46, 0x6c, 0x45, 0x74, 0x35, 0x50, 0x56, 0x6a, 0x6d, 0x2f, 0x42, 0x38, 0x5a, 0x56, 0x74, 0x39, 0x66, 0x0a, - 0x69, 0x49, 0x46, 0x78, 0x7a, 0x2b, 0x56, 0x67, 0x6b, 0x65, 0x31, 0x59, 0x5a, 0x74, 0x58, 0x4f, 0x52, 0x62, - 0x6b, 0x4d, 0x34, 0x44, 0x2f, 0x62, 0x46, 0x6e, 0x54, 0x4d, 0x69, 0x78, 0x61, 0x69, 0x62, 0x6e, 0x48, 0x55, - 0x67, 0x72, 0x58, 0x47, 0x4c, 0x6b, 0x57, 0x35, 0x31, 0x48, 0x65, 0x50, 0x54, 0x61, 0x48, 0x54, 0x59, 0x78, - 0x34, 0x6e, 0x33, 0x58, 0x5a, 0x4b, 0x45, 0x61, 0x4a, 0x75, 0x4f, 0x58, 0x6e, 0x65, 0x63, 0x7a, 0x6c, 0x5a, 0x0a, - 0x36, 0x42, 0x36, 0x41, 0x4a, 0x31, 0x34, 0x5a, 0x4c, 0x2b, 0x6c, 0x76, 0x6c, 0x73, 0x4d, 0x41, 0x37, 0x67, - 0x42, 0x57, 0x32, 0x78, 0x52, 0x38, 0x58, 0x55, 0x39, 0x2f, 0x49, 0x61, 0x62, 0x78, 0x43, 0x33, 0x74, 0x4e, - 0x72, 0x4d, 0x62, 0x78, 0x42, 0x4f, 0x32, 0x5a, 0x4b, 0x49, 0x63, 0x43, 0x72, 0x5a, 0x37, 0x2b, 0x34, 0x7a, - 0x6b, 0x34, 0x35, 0x4a, 0x59, 0x46, 0x4a, 0x55, 0x54, 0x64, 0x63, 0x2b, 0x68, 0x63, 0x68, 0x76, 0x47, 0x63, 0x0a, - 0x64, 0x66, 0x47, 0x50, 0x51, 0x32, 0x6c, 0x52, 0x51, 0x4e, 0x77, 0x4b, 0x37, 0x41, 0x49, 0x2b, 0x61, 0x6c, - 0x50, 0x77, 0x6c, 0x30, 0x4d, 0x5a, 0x6e, 0x65, 0x73, 0x6e, 0x52, 0x42, 0x47, 0x35, 0x77, 0x47, 0x6a, 0x44, - 0x6b, 0x6f, 0x39, 0x53, 0x34, 0x76, 0x71, 0x41, 0x75, 0x41, 0x33, 0x67, 0x44, 0x74, 0x75, 0x43, 0x2b, 0x2b, - 0x7a, 0x6e, 0x50, 0x59, 0x56, 0x49, 0x46, 0x59, 0x37, 0x61, 0x73, 0x4e, 0x62, 0x63, 0x54, 0x4d, 0x53, 0x74, 0x0a, - 0x77, 0x72, 0x74, 0x74, 0x43, 0x76, 0x57, 0x4e, 0x65, 0x5a, 0x7a, 0x56, 0x31, 0x4a, 0x38, 0x51, 0x4d, 0x33, - 0x4a, 0x32, 0x33, 0x48, 0x50, 0x5a, 0x4f, 0x2f, 0x42, 0x75, 0x69, 0x4e, 0x34, 0x4e, 0x69, 0x4e, 0x4d, 0x41, - 0x6c, 0x6d, 0x42, 0x70, 0x41, 0x50, 0x76, 0x31, 0x39, 0x42, 0x66, 0x69, 0x6b, 0x6a, 0x69, 0x63, 0x4b, 0x33, - 0x67, 0x33, 0x52, 0x6e, 0x75, 0x52, 0x69, 0x46, 0x4f, 0x4a, 0x56, 0x71, 0x46, 0x49, 0x41, 0x4b, 0x35, 0x4c, 0x0a, - 0x49, 0x49, 0x56, 0x49, 0x48, 0x51, 0x66, 0x50, 0x4f, 0x61, 0x30, 0x50, 0x69, 0x4e, 0x77, 0x4e, 0x71, 0x4c, - 0x67, 0x42, 0x48, 0x42, 0x2f, 0x78, 0x58, 0x45, 0x59, 0x35, 0x68, 0x55, 0x67, 0x6c, 0x34, 0x7a, 0x6d, 0x6a, - 0x46, 0x55, 0x73, 0x53, 0x59, 0x51, 0x43, 0x33, 0x32, 0x78, 0x54, 0x53, 0x30, 0x31, 0x38, 0x49, 0x4f, 0x78, - 0x79, 0x30, 0x63, 0x6a, 0x74, 0x45, 0x47, 0x77, 0x65, 0x49, 0x53, 0x34, 0x32, 0x62, 0x73, 0x45, 0x6a, 0x2b, 0x0a, - 0x38, 0x51, 0x4d, 0x34, 0x4c, 0x41, 0x4d, 0x51, 0x77, 0x6f, 0x72, 0x44, 0x35, 0x7a, 0x4b, 0x32, 0x5a, 0x77, - 0x69, 0x73, 0x78, 0x6d, 0x6a, 0x51, 0x6d, 0x62, 0x6a, 0x55, 0x61, 0x4c, 0x58, 0x77, 0x52, 0x2b, 0x47, 0x2f, - 0x45, 0x50, 0x59, 0x34, 0x64, 0x67, 0x4f, 0x73, 0x4e, 0x46, 0x68, 0x4d, 0x53, 0x51, 0x59, 0x51, 0x43, 0x6a, - 0x6d, 0x73, 0x55, 0x68, 0x4b, 0x50, 0x6a, 0x2b, 0x6a, 0x70, 0x4c, 0x34, 0x51, 0x4c, 0x44, 0x70, 0x71, 0x35, 0x0a, - 0x45, 0x39, 0x79, 0x37, 0x41, 0x58, 0x45, 0x6f, 0x73, 0x67, 0x76, 0x59, 0x5a, 0x6c, 0x50, 0x51, 0x38, 0x59, - 0x68, 0x6b, 0x49, 0x56, 0x4b, 0x50, 0x67, 0x32, 0x61, 0x32, 0x45, 0x53, 0x45, 0x72, 0x4d, 0x41, 0x34, 0x44, - 0x75, 0x4e, 0x6d, 0x6d, 0x30, 0x50, 0x43, 0x6b, 0x6b, 0x6e, 0x2b, 0x45, 0x63, 0x4f, 0x58, 0x73, 0x75, 0x4f, - 0x64, 0x79, 0x4f, 0x72, 0x61, 0x56, 0x46, 0x73, 0x4e, 0x55, 0x7a, 0x41, 0x43, 0x4f, 0x32, 0x76, 0x64, 0x6c, 0x0a, - 0x68, 0x42, 0x41, 0x68, 0x48, 0x4c, 0x52, 0x54, 0x4f, 0x51, 0x4d, 0x49, 0x39, 0x54, 0x56, 0x75, 0x73, 0x53, - 0x6c, 0x2f, 0x62, 0x46, 0x67, 0x47, 0x49, 0x45, 0x51, 0x55, 0x48, 0x4c, 0x52, 0x7a, 0x43, 0x37, 0x69, 0x4e, - 0x41, 0x35, 0x51, 0x61, 0x41, 0x54, 0x51, 0x41, 0x4e, 0x38, 0x35, 0x56, 0x4b, 0x41, 0x42, 0x36, 0x52, 0x7a, - 0x55, 0x41, 0x4b, 0x45, 0x51, 0x55, 0x65, 0x6b, 0x65, 0x74, 0x73, 0x77, 0x4a, 0x76, 0x78, 0x47, 0x6a, 0x53, 0x0a, - 0x6d, 0x6c, 0x4a, 0x56, 0x65, 0x5a, 0x56, 0x4e, 0x6f, 0x59, 0x46, 0x78, 0x54, 0x66, 0x38, 0x4a, 0x45, 0x5a, - 0x58, 0x78, 0x48, 0x43, 0x37, 0x37, 0x5a, 0x6c, 0x70, 0x70, 0x73, 0x6b, 0x43, 0x70, 0x42, 0x72, 0x44, 0x56, - 0x70, 0x70, 0x44, 0x6a, 0x49, 0x59, 0x68, 0x43, 0x69, 0x43, 0x49, 0x63, 0x4e, 0x47, 0x53, 0x6c, 0x79, 0x51, - 0x49, 0x56, 0x4d, 0x51, 0x43, 0x48, 0x70, 0x59, 0x31, 0x43, 0x69, 0x42, 0x6c, 0x77, 0x30, 0x46, 0x44, 0x35, 0x0a, - 0x44, 0x53, 0x41, 0x30, 0x79, 0x48, 0x43, 0x44, 0x54, 0x58, 0x6d, 0x48, 0x6a, 0x51, 0x36, 0x46, 0x45, 0x44, - 0x50, 0x67, 0x6f, 0x4b, 0x45, 0x62, 0x77, 0x48, 0x34, 0x67, 0x73, 0x4a, 0x51, 0x49, 0x6f, 0x42, 0x6e, 0x59, - 0x4f, 0x46, 0x63, 0x68, 0x50, 0x34, 0x42, 0x42, 0x7a, 0x66, 0x38, 0x4c, 0x55, 0x52, 0x4b, 0x44, 0x34, 0x35, - 0x37, 0x74, 0x75, 0x6f, 0x43, 0x4e, 0x47, 0x47, 0x31, 0x61, 0x55, 0x59, 0x6f, 0x42, 0x57, 0x41, 0x30, 0x32, 0x0a, - 0x6e, 0x42, 0x33, 0x33, 0x58, 0x4e, 0x59, 0x31, 0x43, 0x79, 0x46, 0x6d, 0x49, 0x41, 0x43, 0x58, 0x52, 0x44, - 0x72, 0x72, 0x67, 0x63, 0x42, 0x53, 0x44, 0x4d, 0x44, 0x71, 0x33, 0x4c, 0x39, 0x2b, 0x50, 0x66, 0x32, 0x46, - 0x69, 0x41, 0x55, 0x48, 0x4c, 0x56, 0x6c, 0x70, 0x45, 0x30, 0x6f, 0x7a, 0x41, 0x4b, 0x76, 0x6c, 0x68, 0x7a, - 0x49, 0x41, 0x49, 0x65, 0x4c, 0x42, 0x51, 0x55, 0x76, 0x57, 0x53, 0x34, 0x50, 0x4c, 0x33, 0x67, 0x58, 0x51, 0x0a, - 0x75, 0x58, 0x39, 0x43, 0x78, 0x45, 0x4d, 0x35, 0x63, 0x67, 0x47, 0x63, 0x44, 0x53, 0x41, 0x30, 0x75, 0x72, - 0x6a, 0x65, 0x70, 0x76, 0x7a, 0x67, 0x68, 0x4f, 0x74, 0x66, 0x45, 0x45, 0x4c, 0x4d, 0x68, 0x49, 0x4f, 0x57, - 0x31, 0x6f, 0x50, 0x64, 0x54, 0x45, 0x44, 0x55, 0x43, 0x4b, 0x41, 0x42, 0x57, 0x44, 0x4e, 0x58, 0x6f, 0x51, - 0x41, 0x59, 0x6d, 0x56, 0x49, 0x45, 0x49, 0x45, 0x51, 0x63, 0x6a, 0x45, 0x78, 0x5a, 0x44, 0x36, 0x69, 0x76, 0x0a, - 0x77, 0x54, 0x49, 0x6c, 0x4f, 0x4b, 0x6f, 0x42, 0x72, 0x4c, 0x51, 0x70, 0x4e, 0x44, 0x4a, 0x70, 0x50, 0x58, - 0x55, 0x68, 0x68, 0x4a, 0x67, 0x44, 0x50, 0x7a, 0x43, 0x61, 0x73, 0x73, 0x52, 0x4b, 0x6f, 0x31, 0x45, 0x4e, - 0x77, 0x4f, 0x70, 0x73, 0x38, 0x75, 0x48, 0x4a, 0x69, 0x48, 0x63, 0x58, 0x51, 0x73, 0x79, 0x49, 0x67, 0x36, - 0x61, 0x73, 0x4e, 0x46, 0x70, 0x57, 0x41, 0x7a, 0x68, 0x6e, 0x37, 0x31, 0x5a, 0x43, 0x43, 0x41, 0x73, 0x63, 0x0a, - 0x4e, 0x46, 0x56, 0x57, 0x41, 0x37, 0x41, 0x36, 0x2f, 0x6c, 0x73, 0x52, 0x67, 0x42, 0x44, 0x78, 0x34, 0x71, - 0x41, 0x70, 0x4b, 0x34, 0x31, 0x47, 0x4e, 0x51, 0x43, 0x72, 0x76, 0x63, 0x66, 0x47, 0x63, 0x34, 0x6f, 0x41, - 0x68, 0x49, 0x67, 0x54, 0x42, 0x30, 0x31, 0x5a, 0x61, 0x62, 0x53, 0x73, 0x67, 0x34, 0x44, 0x6e, 0x70, 0x79, - 0x4c, 0x65, 0x58, 0x51, 0x67, 0x78, 0x49, 0x77, 0x36, 0x61, 0x4b, 0x75, 0x73, 0x67, 0x59, 0x49, 0x64, 0x4e, 0x0a, - 0x6f, 0x51, 0x6c, 0x66, 0x45, 0x59, 0x41, 0x51, 0x63, 0x65, 0x4b, 0x67, 0x4b, 0x53, 0x75, 0x4e, 0x6c, 0x72, - 0x6b, 0x4c, 0x45, 0x50, 0x48, 0x75, 0x51, 0x6f, 0x67, 0x5a, 0x63, 0x64, 0x42, 0x55, 0x57, 0x62, 0x73, 0x41, - 0x6c, 0x68, 0x46, 0x41, 0x78, 0x4c, 0x73, 0x4c, 0x49, 0x57, 0x62, 0x45, 0x51, 0x56, 0x4e, 0x6c, 0x6a, 0x51, - 0x42, 0x61, 0x62, 0x51, 0x70, 0x4e, 0x79, 0x51, 0x43, 0x45, 0x69, 0x42, 0x55, 0x48, 0x54, 0x56, 0x6c, 0x70, 0x0a, - 0x4e, 0x4b, 0x6f, 0x42, 0x74, 0x4e, 0x6b, 0x55, 0x6d, 0x74, 0x49, 0x59, 0x67, 0x42, 0x43, 0x78, 0x34, 0x71, - 0x41, 0x70, 0x4b, 0x34, 0x30, 0x36, 0x47, 0x55, 0x42, 0x6f, 0x63, 0x55, 0x47, 0x54, 0x54, 0x66, 0x6d, 0x63, - 0x30, 0x6f, 0x43, 0x46, 0x69, 0x42, 0x55, 0x48, 0x53, 0x57, 0x56, 0x68, 0x37, 0x67, 0x56, 0x42, 0x55, 0x53, - 0x49, 0x41, 0x44, 0x32, 0x69, 0x78, 0x4b, 0x53, 0x67, 0x44, 0x45, 0x43, 0x4a, 0x65, 0x4a, 0x75, 0x32, 0x37, 0x0a, - 0x41, 0x50, 0x4d, 0x78, 0x57, 0x72, 0x30, 0x6b, 0x4f, 0x71, 0x31, 0x44, 0x69, 0x42, 0x51, 0x6a, 0x41, 0x78, - 0x41, 0x69, 0x78, 0x63, 0x67, 0x41, 0x68, 0x4b, 0x67, 0x68, 0x47, 0x75, 0x30, 0x56, 0x4f, 0x34, 0x4c, 0x46, - 0x6b, 0x45, 0x45, 0x55, 0x41, 0x77, 0x69, 0x41, 0x4d, 0x5a, 0x75, 0x43, 0x57, 0x55, 0x30, 0x43, 0x43, 0x42, - 0x45, 0x72, 0x44, 0x70, 0x4c, 0x4b, 0x41, 0x64, 0x79, 0x2f, 0x35, 0x64, 0x49, 0x37, 0x68, 0x44, 0x73, 0x5a, 0x0a, - 0x51, 0x4f, 0x68, 0x6d, 0x56, 0x70, 0x73, 0x54, 0x79, 0x51, 0x43, 0x45, 0x69, 0x4a, 0x65, 0x4d, 0x76, 0x61, - 0x61, 0x73, 0x4e, 0x42, 0x71, 0x31, 0x43, 0x7a, 0x42, 0x73, 0x55, 0x36, 0x67, 0x68, 0x6f, 0x32, 0x6b, 0x41, - 0x49, 0x65, 0x4c, 0x45, 0x51, 0x56, 0x4f, 0x6a, 0x4e, 0x6f, 0x57, 0x69, 0x47, 0x6f, 0x44, 0x56, 0x7a, 0x52, - 0x73, 0x30, 0x77, 0x69, 0x42, 0x45, 0x72, 0x43, 0x51, 0x6c, 0x41, 0x68, 0x69, 0x30, 0x4b, 0x64, 0x51, 0x6b, 0x0a, - 0x41, 0x78, 0x41, 0x69, 0x56, 0x68, 0x77, 0x30, 0x5a, 0x61, 0x58, 0x52, 0x71, 0x42, 0x4c, 0x74, 0x74, 0x79, - 0x6e, 0x55, 0x6e, 0x49, 0x31, 0x34, 0x64, 0x79, 0x48, 0x45, 0x6a, 0x44, 0x68, 0x6f, 0x79, 0x6b, 0x71, 0x6a, - 0x5a, 0x59, 0x34, 0x41, 0x4e, 0x41, 0x59, 0x67, 0x52, 0x4a, 0x77, 0x34, 0x61, 0x4b, 0x71, 0x73, 0x45, 0x63, - 0x42, 0x78, 0x6d, 0x30, 0x4c, 0x7a, 0x72, 0x48, 0x59, 0x6d, 0x46, 0x30, 0x4c, 0x59, 0x30, 0x6d, 0x71, 0x76, 0x0a, - 0x71, 0x5a, 0x4d, 0x32, 0x68, 0x63, 0x72, 0x63, 0x42, 0x56, 0x41, 0x45, 0x49, 0x45, 0x53, 0x63, 0x74, 0x4e, - 0x68, 0x72, 0x71, 0x73, 0x2b, 0x6d, 0x55, 0x46, 0x51, 0x44, 0x4f, 0x47, 0x4a, 0x54, 0x71, 0x4b, 0x30, 0x78, - 0x34, 0x74, 0x32, 0x46, 0x45, 0x44, 0x50, 0x69, 0x6f, 0x43, 0x6b, 0x72, 0x6a, 0x55, 0x59, 0x31, 0x67, 0x49, - 0x4d, 0x32, 0x68, 0x64, 0x6f, 0x62, 0x46, 0x51, 0x45, 0x49, 0x45, 0x53, 0x63, 0x4f, 0x6d, 0x72, 0x4c, 0x53, 0x0a, - 0x61, 0x46, 0x6b, 0x6a, 0x67, 0x50, 0x6d, 0x4b, 0x41, 0x49, 0x53, 0x49, 0x46, 0x51, 0x64, 0x4e, 0x6c, 0x54, - 0x55, 0x43, 0x73, 0x4f, 0x77, 0x43, 0x42, 0x43, 0x36, 0x35, 0x79, 0x30, 0x4b, 0x49, 0x53, 0x35, 0x44, 0x78, - 0x6a, 0x4b, 0x59, 0x73, 0x4b, 0x61, 0x73, 0x42, 0x54, 0x41, 0x47, 0x48, 0x35, 0x69, 0x72, 0x6b, 0x34, 0x56, - 0x52, 0x68, 0x49, 0x63, 0x51, 0x6c, 0x6d, 0x4e, 0x39, 0x67, 0x2f, 0x55, 0x41, 0x39, 0x68, 0x4e, 0x48, 0x6f, 0x0a, - 0x6e, 0x44, 0x67, 0x62, 0x51, 0x47, 0x68, 0x42, 0x30, 0x44, 0x36, 0x62, 0x38, 0x68, 0x31, 0x57, 0x6d, 0x34, - 0x63, 0x4a, 0x49, 0x65, 0x62, 0x43, 0x51, 0x55, 0x76, 0x37, 0x59, 0x4f, 0x36, 0x56, 0x67, 0x46, 0x44, 0x61, - 0x66, 0x67, 0x42, 0x76, 0x32, 0x42, 0x54, 0x71, 0x62, 0x46, 0x59, 0x45, 0x49, 0x45, 0x51, 0x63, 0x4f, 0x47, - 0x6a, 0x4a, 0x53, 0x70, 0x74, 0x51, 0x6d, 0x67, 0x48, 0x73, 0x74, 0x53, 0x6e, 0x55, 0x4a, 0x51, 0x4d, 0x51, 0x0a, - 0x49, 0x68, 0x59, 0x63, 0x74, 0x47, 0x53, 0x6c, 0x54, 0x61, 0x69, 0x41, 0x41, 0x53, 0x79, 0x55, 0x41, 0x51, - 0x67, 0x52, 0x43, 0x77, 0x35, 0x61, 0x71, 0x6f, 0x67, 0x42, 0x57, 0x49, 0x55, 0x5a, 0x43, 0x35, 0x73, 0x31, - 0x45, 0x79, 0x42, 0x45, 0x71, 0x58, 0x67, 0x6b, 0x4c, 0x77, 0x49, 0x34, 0x44, 0x37, 0x77, 0x35, 0x56, 0x36, - 0x47, 0x73, 0x42, 0x78, 0x32, 0x4b, 0x41, 0x6f, 0x51, 0x6f, 0x69, 0x59, 0x37, 0x6d, 0x77, 0x48, 0x59, 0x76, 0x0a, - 0x67, 0x44, 0x65, 0x42, 0x53, 0x78, 0x38, 0x47, 0x45, 0x43, 0x4b, 0x53, 0x41, 0x59, 0x52, 0x47, 0x46, 0x31, - 0x2b, 0x79, 0x4b, 0x62, 0x2b, 0x6b, 0x52, 0x51, 0x59, 0x67, 0x52, 0x43, 0x6b, 0x34, 0x61, 0x4f, 0x67, 0x6c, - 0x73, 0x4a, 0x73, 0x42, 0x67, 0x4e, 0x4a, 0x33, 0x42, 0x64, 0x35, 0x74, 0x55, 0x32, 0x68, 0x70, 0x71, 0x77, - 0x78, 0x41, 0x69, 0x46, 0x4a, 0x77, 0x30, 0x4a, 0x43, 0x56, 0x4a, 0x67, 0x74, 0x55, 0x78, 0x41, 0x43, 0x36, 0x0a, - 0x5a, 0x51, 0x42, 0x43, 0x6c, 0x49, 0x53, 0x44, 0x68, 0x69, 0x70, 0x71, 0x41, 0x4e, 0x61, 0x35, 0x41, 0x4e, - 0x6f, 0x64, 0x53, 0x49, 0x68, 0x6f, 0x4e, 0x47, 0x66, 0x4c, 0x6b, 0x77, 0x4d, 0x41, 0x70, 0x52, 0x76, 0x41, - 0x46, 0x50, 0x44, 0x69, 0x58, 0x49, 0x55, 0x38, 0x6f, 0x4c, 0x74, 0x56, 0x5a, 0x34, 0x55, 0x4c, 0x45, 0x59, - 0x58, 0x75, 0x56, 0x74, 0x39, 0x32, 0x4a, 0x75, 0x31, 0x46, 0x4c, 0x46, 0x4f, 0x41, 0x43, 0x30, 0x51, 0x32, 0x0a, - 0x67, 0x4e, 0x41, 0x67, 0x77, 0x2f, 0x4d, 0x32, 0x35, 0x53, 0x39, 0x72, 0x55, 0x7a, 0x64, 0x41, 0x69, 0x43, - 0x67, 0x34, 0x61, 0x4f, 0x64, 0x35, 0x73, 0x42, 0x38, 0x41, 0x68, 0x48, 0x69, 0x4f, 0x42, 0x6e, 0x76, 0x42, - 0x70, 0x74, 0x43, 0x71, 0x2b, 0x54, 0x49, 0x41, 0x49, 0x61, 0x4c, 0x67, 0x6f, 0x42, 0x30, 0x72, 0x4c, 0x59, - 0x61, 0x70, 0x6d, 0x41, 0x47, 0x30, 0x4e, 0x51, 0x62, 0x4b, 0x43, 0x68, 0x54, 0x43, 0x6b, 0x59, 0x58, 0x4e, 0x0a, - 0x67, 0x63, 0x75, 0x4b, 0x32, 0x71, 0x6f, 0x59, 0x51, 0x44, 0x2f, 0x77, 0x59, 0x35, 0x75, 0x43, 0x79, 0x7a, - 0x51, 0x62, 0x49, 0x49, 0x51, 0x54, 0x44, 0x70, 0x72, 0x35, 0x4d, 0x5a, 0x5a, 0x37, 0x64, 0x59, 0x59, 0x70, - 0x79, 0x51, 0x42, 0x43, 0x66, 0x59, 0x31, 0x64, 0x4e, 0x75, 0x56, 0x58, 0x74, 0x57, 0x6b, 0x67, 0x55, 0x41, - 0x67, 0x58, 0x48, 0x44, 0x53, 0x7a, 0x43, 0x39, 0x7a, 0x36, 0x2f, 0x78, 0x44, 0x66, 0x38, 0x65, 0x41, 0x37, 0x0a, - 0x62, 0x51, 0x71, 0x74, 0x6e, 0x4b, 0x2f, 0x70, 0x51, 0x43, 0x46, 0x73, 0x61, 0x63, 0x34, 0x61, 0x7a, 0x56, - 0x68, 0x69, 0x70, 0x63, 0x46, 0x69, 0x34, 0x6a, 0x4b, 0x41, 0x76, 0x56, 0x68, 0x73, 0x51, 0x5a, 0x54, 0x78, - 0x59, 0x4c, 0x57, 0x69, 0x41, 0x43, 0x47, 0x73, 0x57, 0x4e, 0x33, 0x6d, 0x32, 0x2b, 0x62, 0x2f, 0x48, 0x38, - 0x46, 0x68, 0x41, 0x56, 0x43, 0x59, 0x4f, 0x45, 0x2f, 0x76, 0x73, 0x78, 0x71, 0x41, 0x36, 0x47, 0x6d, 0x58, 0x0a, - 0x41, 0x51, 0x68, 0x68, 0x67, 0x34, 0x4e, 0x57, 0x58, 0x67, 0x44, 0x33, 0x38, 0x42, 0x2f, 0x69, 0x4e, 0x51, - 0x43, 0x72, 0x45, 0x4f, 0x53, 0x79, 0x4e, 0x6e, 0x55, 0x44, 0x68, 0x4a, 0x69, 0x4c, 0x35, 0x71, 0x7a, 0x54, - 0x2f, 0x48, 0x2b, 0x6b, 0x38, 0x42, 0x2f, 0x69, 0x4e, 0x59, 0x42, 0x6e, 0x62, 0x41, 0x70, 0x35, 0x4b, 0x41, - 0x6f, 0x51, 0x59, 0x69, 0x35, 0x36, 0x32, 0x71, 0x32, 0x7a, 0x2f, 0x38, 0x42, 0x53, 0x65, 0x7a, 0x4d, 0x52, 0x0a, - 0x70, 0x77, 0x48, 0x30, 0x41, 0x54, 0x74, 0x73, 0x43, 0x71, 0x37, 0x72, 0x6b, 0x41, 0x45, 0x49, 0x63, 0x53, - 0x6b, 0x63, 0x4e, 0x4c, 0x49, 0x44, 0x79, 0x32, 0x50, 0x41, 0x5a, 0x69, 0x4a, 0x4f, 0x41, 0x77, 0x42, 0x34, - 0x79, 0x71, 0x5a, 0x51, 0x64, 0x32, 0x74, 0x41, 0x52, 0x35, 0x4e, 0x79, 0x41, 0x6f, 0x53, 0x59, 0x69, 0x59, - 0x36, 0x6d, 0x77, 0x47, 0x58, 0x31, 0x33, 0x31, 0x4d, 0x51, 0x72, 0x66, 0x38, 0x50, 0x38, 0x52, 0x75, 0x41, 0x0a, - 0x56, 0x54, 0x34, 0x41, 0x77, 0x4d, 0x61, 0x46, 0x69, 0x67, 0x4b, 0x45, 0x6d, 0x49, 0x6b, 0x4e, 0x6e, 0x55, - 0x37, 0x61, 0x73, 0x4e, 0x62, 0x63, 0x54, 0x4d, 0x52, 0x74, 0x41, 0x50, 0x33, 0x41, 0x64, 0x32, 0x77, 0x4b, - 0x72, 0x6c, 0x76, 0x67, 0x6b, 0x39, 0x56, 0x6d, 0x67, 0x55, 0x4a, 0x4d, 0x49, 0x2b, 0x76, 0x42, 0x6c, 0x66, - 0x62, 0x68, 0x2f, 0x33, 0x65, 0x49, 0x6b, 0x50, 0x30, 0x58, 0x4a, 0x6d, 0x34, 0x44, 0x41, 0x50, 0x69, 0x57, 0x0a, - 0x54, 0x61, 0x48, 0x6d, 0x4c, 0x4b, 0x7a, 0x52, 0x59, 0x4b, 0x41, 0x51, 0x30, 0x31, 0x6a, 0x54, 0x37, 0x72, - 0x76, 0x4d, 0x6b, 0x6e, 0x30, 0x4c, 0x6f, 0x6f, 0x66, 0x2f, 0x55, 0x42, 0x34, 0x44, 0x32, 0x41, 0x6d, 0x63, - 0x74, 0x43, 0x6c, 0x34, 0x64, 0x5a, 0x63, 0x4d, 0x51, 0x49, 0x67, 0x77, 0x56, 0x39, 0x6c, 0x33, 0x6a, 0x55, - 0x39, 0x53, 0x77, 0x76, 0x52, 0x66, 0x67, 0x58, 0x49, 0x59, 0x41, 0x4d, 0x43, 0x54, 0x4e, 0x6f, 0x57, 0x57, 0x0a, - 0x74, 0x41, 0x51, 0x73, 0x6d, 0x36, 0x66, 0x42, 0x51, 0x43, 0x45, 0x41, 0x6c, 0x73, 0x30, 0x4c, 0x58, 0x50, - 0x62, 0x2b, 0x2b, 0x78, 0x71, 0x55, 0x39, 0x76, 0x53, 0x48, 0x38, 0x68, 0x6d, 0x41, 0x56, 0x54, 0x63, 0x41, - 0x59, 0x4a, 0x4f, 0x69, 0x41, 0x43, 0x45, 0x41, 0x5a, 0x79, 0x31, 0x38, 0x4d, 0x34, 0x36, 0x2f, 0x57, 0x53, - 0x34, 0x44, 0x4f, 0x49, 0x68, 0x6c, 0x65, 0x4c, 0x4b, 0x71, 0x7a, 0x64, 0x66, 0x35, 0x67, 0x53, 0x4c, 0x31, 0x0a, - 0x64, 0x44, 0x51, 0x46, 0x4c, 0x69, 0x76, 0x2f, 0x64, 0x6d, 0x49, 0x30, 0x56, 0x6a, 0x4c, 0x6c, 0x4d, 0x67, - 0x43, 0x41, 0x4a, 0x32, 0x77, 0x4b, 0x65, 0x63, 0x41, 0x6d, 0x54, 0x51, 0x6d, 0x4b, 0x6c, 0x50, 0x4f, 0x65, - 0x4c, 0x71, 0x66, 0x4d, 0x50, 0x79, 0x74, 0x74, 0x32, 0x56, 0x42, 0x4f, 0x41, 0x33, 0x67, 0x61, 0x65, 0x4e, - 0x57, 0x6d, 0x34, 0x4a, 0x57, 0x64, 0x50, 0x75, 0x33, 0x32, 0x75, 0x35, 0x34, 0x49, 0x55, 0x56, 0x65, 0x30, 0x0a, - 0x4e, 0x77, 0x5a, 0x63, 0x61, 0x54, 0x2f, 0x33, 0x2f, 0x79, 0x70, 0x47, 0x57, 0x37, 0x46, 0x51, 0x54, 0x67, - 0x4d, 0x41, 0x68, 0x79, 0x6a, 0x67, 0x75, 0x73, 0x57, 0x4b, 0x41, 0x6b, 0x51, 0x36, 0x75, 0x57, 0x35, 0x78, - 0x64, 0x5a, 0x37, 0x2b, 0x55, 0x48, 0x34, 0x44, 0x2b, 0x44, 0x2b, 0x32, 0x42, 0x64, 0x64, 0x31, 0x2b, 0x45, - 0x6f, 0x50, 0x46, 0x71, 0x6d, 0x6a, 0x6f, 0x79, 0x6c, 0x77, 0x58, 0x52, 0x74, 0x6a, 0x72, 0x53, 0x6b, 0x62, 0x0a, - 0x79, 0x6d, 0x30, 0x41, 0x2f, 0x63, 0x43, 0x44, 0x4e, 0x67, 0x55, 0x39, 0x59, 0x49, 0x75, 0x69, 0x41, 0x4a, - 0x45, 0x79, 0x74, 0x72, 0x67, 0x39, 0x2f, 0x52, 0x2b, 0x69, 0x78, 0x4d, 0x79, 0x2f, 0x59, 0x73, 0x70, 0x74, - 0x41, 0x41, 0x42, 0x66, 0x74, 0x53, 0x33, 0x59, 0x73, 0x38, 0x42, 0x6e, 0x6b, 0x51, 0x34, 0x53, 0x46, 0x53, - 0x6c, 0x68, 0x55, 0x55, 0x74, 0x41, 0x7a, 0x77, 0x4b, 0x6e, 0x68, 0x39, 0x37, 0x6a, 0x63, 0x64, 0x65, 0x68, 0x0a, - 0x45, 0x67, 0x62, 0x51, 0x44, 0x33, 0x7a, 0x4f, 0x70, 0x71, 0x41, 0x48, 0x62, 0x4f, 0x33, 0x4f, 0x6c, 0x62, - 0x63, 0x32, 0x51, 0x69, 0x53, 0x45, 0x72, 0x64, 0x30, 0x35, 0x6c, 0x36, 0x66, 0x2f, 0x35, 0x34, 0x6a, 0x35, - 0x36, 0x51, 0x2b, 0x56, 0x4d, 0x51, 0x43, 0x41, 0x4c, 0x39, 0x6b, 0x57, 0x37, 0x47, 0x34, 0x4e, 0x75, 0x4d, - 0x4c, 0x4e, 0x46, 0x59, 0x57, 0x6f, 0x4f, 0x61, 0x35, 0x59, 0x34, 0x4c, 0x73, 0x65, 0x6d, 0x6d, 0x75, 0x74, 0x0a, - 0x49, 0x52, 0x63, 0x71, 0x5a, 0x51, 0x44, 0x39, 0x6d, 0x50, 0x36, 0x4c, 0x46, 0x54, 0x63, 0x73, 0x39, 0x57, - 0x6d, 0x73, 0x56, 0x4d, 0x32, 0x45, 0x71, 0x44, 0x43, 0x4e, 0x47, 0x64, 0x50, 0x47, 0x48, 0x59, 0x69, 0x39, - 0x37, 0x31, 0x2b, 0x67, 0x6b, 0x6a, 0x4b, 0x7a, 0x37, 0x72, 0x2f, 0x4d, 0x61, 0x77, 0x69, 0x34, 0x52, 0x69, - 0x6e, 0x43, 0x6f, 0x6b, 0x37, 0x5a, 0x31, 0x4a, 0x56, 0x6a, 0x58, 0x6f, 0x50, 0x54, 0x30, 0x7a, 0x2f, 0x32, 0x0a, - 0x76, 0x6e, 0x2b, 0x42, 0x53, 0x68, 0x71, 0x41, 0x39, 0x59, 0x77, 0x41, 0x77, 0x4c, 0x57, 0x4c, 0x63, 0x70, - 0x6f, 0x57, 0x46, 0x48, 0x56, 0x48, 0x5a, 0x33, 0x50, 0x41, 0x35, 0x6b, 0x56, 0x4f, 0x44, 0x37, 0x63, 0x48, - 0x4b, 0x64, 0x50, 0x54, 0x48, 0x79, 0x70, 0x72, 0x41, 0x41, 0x42, 0x66, 0x77, 0x48, 0x4b, 0x4e, 0x51, 0x4d, - 0x61, 0x44, 0x57, 0x35, 0x59, 0x37, 0x44, 0x5a, 0x49, 0x49, 0x6b, 0x57, 0x67, 0x38, 0x34, 0x4f, 0x5a, 0x6c, 0x0a, - 0x4f, 0x64, 0x75, 0x39, 0x2f, 0x73, 0x46, 0x6f, 0x35, 0x51, 0x74, 0x6c, 0x71, 0x78, 0x43, 0x56, 0x4e, 0x77, - 0x42, 0x77, 0x79, 0x47, 0x54, 0x71, 0x62, 0x67, 0x31, 0x63, 0x74, 0x30, 0x63, 0x53, 0x49, 0x72, 0x46, 0x73, - 0x58, 0x4f, 0x67, 0x38, 0x38, 0x42, 0x64, 0x72, 0x31, 0x74, 0x39, 0x4d, 0x56, 0x4d, 0x4d, 0x41, 0x6e, 0x67, - 0x62, 0x2b, 0x33, 0x72, 0x62, 0x77, 0x65, 0x35, 0x63, 0x36, 0x39, 0x35, 0x65, 0x45, 0x53, 0x42, 0x7a, 0x7a, 0x0a, - 0x47, 0x67, 0x4b, 0x75, 0x58, 0x2b, 0x49, 0x30, 0x78, 0x66, 0x33, 0x33, 0x78, 0x4a, 0x6a, 0x7a, 0x50, 0x78, - 0x76, 0x56, 0x47, 0x6d, 0x76, 0x2f, 0x4f, 0x39, 0x75, 0x43, 0x6a, 0x52, 0x6e, 0x59, 0x74, 0x6b, 0x4a, 0x64, - 0x41, 0x56, 0x47, 0x37, 0x65, 0x4a, 0x67, 0x32, 0x37, 0x44, 0x69, 0x7a, 0x39, 0x54, 0x66, 0x6c, 0x71, 0x63, - 0x31, 0x30, 0x71, 0x6d, 0x55, 0x41, 0x2b, 0x33, 0x47, 0x59, 0x46, 0x6c, 0x77, 0x78, 0x54, 0x37, 0x4d, 0x43, 0x0a, - 0x6f, 0x6e, 0x61, 0x35, 0x70, 0x73, 0x74, 0x6e, 0x68, 0x64, 0x76, 0x4f, 0x56, 0x77, 0x38, 0x42, 0x42, 0x38, - 0x70, 0x55, 0x6e, 0x57, 0x6c, 0x55, 0x63, 0x37, 0x62, 0x39, 0x55, 0x65, 0x44, 0x37, 0x74, 0x6f, 0x57, 0x76, - 0x58, 0x35, 0x4a, 0x54, 0x6d, 0x72, 0x43, 0x6f, 0x4f, 0x52, 0x61, 0x31, 0x4f, 0x49, 0x66, 0x2b, 0x75, 0x7a, - 0x44, 0x61, 0x71, 0x41, 0x6a, 0x56, 0x54, 0x72, 0x65, 0x78, 0x2f, 0x6f, 0x64, 0x6d, 0x50, 0x4c, 0x68, 0x74, 0x0a, - 0x52, 0x55, 0x35, 0x62, 0x69, 0x59, 0x75, 0x61, 0x49, 0x5a, 0x74, 0x76, 0x73, 0x77, 0x36, 0x6a, 0x2f, 0x67, - 0x42, 0x2f, 0x57, 0x61, 0x62, 0x71, 0x7a, 0x45, 0x69, 0x31, 0x44, 0x65, 0x44, 0x66, 0x67, 0x43, 0x2f, 0x61, - 0x46, 0x75, 0x35, 0x6f, 0x43, 0x6e, 0x6a, 0x66, 0x4d, 0x71, 0x30, 0x56, 0x45, 0x4c, 0x58, 0x42, 0x2b, 0x35, - 0x59, 0x35, 0x35, 0x37, 0x4a, 0x38, 0x45, 0x58, 0x69, 0x78, 0x54, 0x4e, 0x57, 0x5a, 0x6b, 0x57, 0x6f, 0x62, 0x0a, - 0x41, 0x4d, 0x43, 0x6e, 0x4d, 0x55, 0x5a, 0x67, 0x78, 0x5a, 0x55, 0x64, 0x50, 0x68, 0x73, 0x31, 0x4e, 0x53, - 0x67, 0x53, 0x7a, 0x73, 0x5a, 0x4f, 0x33, 0x2b, 0x57, 0x41, 0x44, 0x7a, 0x41, 0x61, 0x2b, 0x48, 0x53, 0x5a, - 0x71, 0x6a, 0x4d, 0x72, 0x53, 0x54, 0x41, 0x41, 0x67, 0x45, 0x2b, 0x36, 0x46, 0x4c, 0x36, 0x78, 0x4f, 0x2b, - 0x65, 0x79, 0x66, 0x62, 0x49, 0x51, 0x46, 0x57, 0x56, 0x70, 0x61, 0x38, 0x43, 0x4e, 0x37, 0x71, 0x74, 0x61, 0x0a, - 0x6e, 0x54, 0x51, 0x51, 0x46, 0x30, 0x6b, 0x78, 0x67, 0x4e, 0x64, 0x77, 0x6d, 0x42, 0x58, 0x49, 0x65, 0x50, - 0x41, 0x62, 0x4b, 0x33, 0x4f, 0x30, 0x32, 0x4a, 0x2b, 0x67, 0x49, 0x6b, 0x52, 0x46, 0x61, 0x4d, 0x6d, 0x61, - 0x74, 0x75, 0x6e, 0x59, 0x37, 0x33, 0x38, 0x49, 0x6f, 0x34, 0x47, 0x4b, 0x55, 0x33, 0x55, 0x44, 0x2b, 0x4d, - 0x5a, 0x62, 0x6a, 0x59, 0x55, 0x66, 0x48, 0x38, 0x58, 0x68, 0x6f, 0x4d, 0x4e, 0x35, 0x44, 0x51, 0x45, 0x66, 0x0a, - 0x57, 0x44, 0x57, 0x6c, 0x51, 0x55, 0x47, 0x52, 0x47, 0x4c, 0x49, 0x65, 0x66, 0x47, 0x44, 0x56, 0x6c, 0x47, - 0x76, 0x69, 0x57, 0x6b, 0x56, 0x48, 0x2f, 0x59, 0x75, 0x70, 0x75, 0x67, 0x48, 0x41, 0x4e, 0x42, 0x50, 0x34, - 0x49, 0x2b, 0x43, 0x55, 0x37, 0x66, 0x75, 0x57, 0x74, 0x41, 0x54, 0x63, 0x75, 0x6c, 0x79, 0x44, 0x67, 0x69, - 0x49, 0x5a, 0x33, 0x4c, 0x6f, 0x38, 0x78, 0x78, 0x4b, 0x33, 0x71, 0x65, 0x70, 0x54, 0x6d, 0x44, 0x5a, 0x66, 0x0a, - 0x4e, 0x52, 0x4a, 0x68, 0x41, 0x43, 0x45, 0x4f, 0x41, 0x52, 0x39, 0x7a, 0x65, 0x63, 0x50, 0x61, 0x42, 0x62, - 0x37, 0x72, 0x50, 0x4b, 0x73, 0x51, 0x73, 0x58, 0x50, 0x39, 0x6b, 0x68, 0x78, 0x72, 0x33, 0x54, 0x65, 0x79, - 0x2b, 0x52, 0x69, 0x6d, 0x7a, 0x56, 0x65, 0x4e, 0x78, 0x42, 0x68, 0x41, 0x4b, 0x41, 0x70, 0x34, 0x44, 0x6f, - 0x66, 0x78, 0x41, 0x49, 0x44, 0x4e, 0x69, 0x7a, 0x51, 0x7a, 0x49, 0x4b, 0x72, 0x48, 0x78, 0x6b, 0x37, 0x66, 0x0a, - 0x64, 0x59, 0x6b, 0x76, 0x6d, 0x44, 0x62, 0x2b, 0x58, 0x42, 0x6d, 0x71, 0x34, 0x30, 0x52, 0x69, 0x44, 0x41, - 0x43, 0x69, 0x6a, 0x77, 0x63, 0x41, 0x62, 0x46, 0x32, 0x57, 0x6f, 0x30, 0x66, 0x48, 0x6a, 0x59, 0x73, 0x4b, - 0x30, 0x39, 0x50, 0x75, 0x73, 0x39, 0x55, 0x39, 0x4e, 0x36, 0x57, 0x71, 0x2f, 0x66, 0x34, 0x77, 0x69, 0x54, - 0x49, 0x41, 0x75, 0x47, 0x67, 0x38, 0x34, 0x4c, 0x44, 0x74, 0x2b, 0x7a, 0x7a, 0x67, 0x2f, 0x53, 0x74, 0x79, 0x0a, - 0x72, 0x47, 0x72, 0x54, 0x39, 0x4b, 0x43, 0x6f, 0x44, 0x4b, 0x76, 0x61, 0x41, 0x74, 0x37, 0x76, 0x76, 0x6c, - 0x44, 0x74, 0x4d, 0x50, 0x6c, 0x2b, 0x66, 0x36, 0x69, 0x74, 0x56, 0x34, 0x33, 0x45, 0x47, 0x55, 0x43, 0x49, - 0x51, 0x38, 0x42, 0x2f, 0x63, 0x6e, 0x6d, 0x44, 0x6d, 0x52, 0x36, 0x63, 0x63, 0x6c, 0x31, 0x34, 0x49, 0x59, - 0x51, 0x7a, 0x4b, 0x2b, 0x59, 0x46, 0x2f, 0x4d, 0x62, 0x4b, 0x4b, 0x64, 0x66, 0x70, 0x50, 0x6a, 0x42, 0x74, 0x0a, - 0x2b, 0x6c, 0x44, 0x73, 0x46, 0x59, 0x70, 0x49, 0x49, 0x67, 0x30, 0x67, 0x35, 0x49, 0x7a, 0x2f, 0x48, 0x37, - 0x6a, 0x4c, 0x35, 0x62, 0x32, 0x46, 0x71, 0x52, 0x67, 0x6c, 0x43, 0x6f, 0x6c, 0x79, 0x73, 0x62, 0x51, 0x31, - 0x38, 0x68, 0x54, 0x30, 0x58, 0x5a, 0x67, 0x32, 0x6e, 0x59, 0x69, 0x6e, 0x50, 0x79, 0x54, 0x55, 0x41, 0x47, - 0x44, 0x61, 0x42, 0x2f, 0x54, 0x50, 0x77, 0x4a, 0x2b, 0x34, 0x76, 0x44, 0x66, 0x72, 0x77, 0x5a, 0x32, 0x72, 0x0a, - 0x46, 0x41, 0x6d, 0x49, 0x2b, 0x46, 0x6b, 0x78, 0x4c, 0x2b, 0x44, 0x4f, 0x61, 0x4f, 0x4c, 0x2f, 0x45, 0x30, - 0x78, 0x62, 0x54, 0x6f, 0x7a, 0x34, 0x49, 0x63, 0x45, 0x47, 0x41, 0x4e, 0x4d, 0x2b, 0x71, 0x43, 0x38, 0x42, - 0x58, 0x33, 0x46, 0x35, 0x62, 0x32, 0x50, 0x47, 0x52, 0x41, 0x49, 0x61, 0x45, 0x78, 0x42, 0x78, 0x73, 0x61, - 0x72, 0x4e, 0x50, 0x50, 0x6b, 0x6a, 0x62, 0x46, 0x6e, 0x2f, 0x46, 0x66, 0x4c, 0x37, 0x2b, 0x69, 0x64, 0x4a, 0x0a, - 0x2f, 0x4a, 0x42, 0x77, 0x41, 0x34, 0x42, 0x70, 0x48, 0x39, 0x67, 0x44, 0x57, 0x47, 0x34, 0x6f, 0x57, 0x69, - 0x44, 0x72, 0x77, 0x57, 0x2b, 0x75, 0x6e, 0x4e, 0x4c, 0x73, 0x67, 0x43, 0x69, 0x5a, 0x6e, 0x6e, 0x61, 0x66, - 0x33, 0x31, 0x77, 0x5a, 0x36, 0x63, 0x6d, 0x2f, 0x45, 0x39, 0x4e, 0x32, 0x45, 0x79, 0x64, 0x2b, 0x71, 0x41, - 0x45, 0x44, 0x67, 0x49, 0x74, 0x6d, 0x42, 0x6e, 0x37, 0x69, 0x38, 0x74, 0x36, 0x4d, 0x42, 0x37, 0x65, 0x74, 0x0a, - 0x7a, 0x48, 0x48, 0x56, 0x51, 0x70, 0x6d, 0x41, 0x69, 0x4d, 0x5a, 0x56, 0x43, 0x33, 0x31, 0x75, 0x63, 0x38, - 0x2f, 0x76, 0x42, 0x39, 0x4e, 0x57, 0x45, 0x7a, 0x50, 0x69, 0x50, 0x78, 0x4d, 0x31, 0x59, 0x51, 0x41, 0x68, - 0x6a, 0x67, 0x4b, 0x2f, 0x42, 0x2b, 0x78, 0x78, 0x65, 0x56, 0x50, 0x68, 0x7a, 0x45, 0x46, 0x6c, 0x44, 0x41, - 0x70, 0x58, 0x72, 0x6c, 0x2b, 0x53, 0x63, 0x7a, 0x33, 0x44, 0x72, 0x38, 0x41, 0x65, 0x54, 0x46, 0x73, 0x39, 0x0a, - 0x47, 0x6e, 0x65, 0x64, 0x34, 0x71, 0x52, 0x6d, 0x44, 0x43, 0x44, 0x6b, 0x6f, 0x49, 0x63, 0x77, 0x55, 0x79, - 0x6c, 0x76, 0x75, 0x64, 0x35, 0x6a, 0x38, 0x79, 0x4b, 0x66, 0x32, 0x31, 0x64, 0x71, 0x56, 0x79, 0x45, 0x78, - 0x4e, 0x31, 0x6b, 0x50, 0x62, 0x6c, 0x2b, 0x5a, 0x69, 0x35, 0x4c, 0x68, 0x42, 0x36, 0x5a, 0x74, 0x76, 0x6a, - 0x76, 0x64, 0x6c, 0x39, 0x53, 0x6e, 0x50, 0x39, 0x53, 0x51, 0x41, 0x63, 0x43, 0x30, 0x44, 0x2f, 0x49, 0x41, 0x0a, - 0x38, 0x4e, 0x73, 0x34, 0x4a, 0x41, 0x6f, 0x56, 0x36, 0x47, 0x6e, 0x33, 0x32, 0x58, 0x37, 0x35, 0x46, 0x4b, - 0x30, 0x4e, 0x63, 0x64, 0x5a, 0x4d, 0x31, 0x42, 0x4f, 0x74, 0x44, 0x62, 0x44, 0x39, 0x38, 0x73, 0x68, 0x6a, - 0x52, 0x34, 0x63, 0x78, 0x62, 0x66, 0x4d, 0x41, 0x4a, 0x46, 0x76, 0x38, 0x55, 0x47, 0x4d, 0x47, 0x41, 0x42, - 0x65, 0x5a, 0x77, 0x41, 0x65, 0x49, 0x45, 0x41, 0x6b, 0x73, 0x61, 0x51, 0x6e, 0x34, 0x38, 0x42, 0x72, 0x6c, 0x0a, - 0x43, 0x6f, 0x69, 0x4c, 0x57, 0x64, 0x70, 0x71, 0x32, 0x6f, 0x62, 0x6a, 0x71, 0x72, 0x34, 0x43, 0x62, 0x32, - 0x48, 0x61, 0x5a, 0x45, 0x32, 0x49, 0x48, 0x32, 0x72, 0x51, 0x41, 0x47, 0x44, 0x61, 0x42, 0x37, 0x73, 0x66, - 0x34, 0x37, 0x5a, 0x4f, 0x59, 0x77, 0x4a, 0x67, 0x39, 0x68, 0x50, 0x59, 0x76, 0x6e, 0x70, 0x4b, 0x69, 0x34, - 0x6a, 0x45, 0x75, 0x32, 0x7a, 0x73, 0x39, 0x4e, 0x6d, 0x2b, 0x32, 0x6e, 0x6b, 0x39, 0x66, 0x34, 0x45, 0x39, 0x0a, - 0x6d, 0x4c, 0x61, 0x34, 0x48, 0x32, 0x70, 0x44, 0x2f, 0x46, 0x43, 0x6a, 0x42, 0x67, 0x41, 0x58, 0x52, 0x51, - 0x49, 0x66, 0x77, 0x58, 0x46, 0x32, 0x41, 0x4d, 0x77, 0x4d, 0x77, 0x55, 0x33, 0x4c, 0x63, 0x6d, 0x78, 0x62, - 0x72, 0x6e, 0x47, 0x42, 0x4e, 0x4a, 0x50, 0x31, 0x59, 0x4e, 0x76, 0x79, 0x48, 0x44, 0x65, 0x35, 0x6e, 0x64, - 0x73, 0x58, 0x35, 0x69, 0x65, 0x59, 0x4e, 0x6c, 0x67, 0x7a, 0x54, 0x2f, 0x34, 0x43, 0x4e, 0x57, 0x73, 0x41, 0x0a, - 0x63, 0x4e, 0x48, 0x41, 0x34, 0x4d, 0x64, 0x77, 0x7a, 0x42, 0x4d, 0x6f, 0x73, 0x4b, 0x37, 0x44, 0x35, 0x36, - 0x36, 0x65, 0x4b, 0x52, 0x62, 0x72, 0x33, 0x49, 0x48, 0x55, 0x73, 0x61, 0x67, 0x6c, 0x34, 0x4b, 0x36, 0x65, - 0x4b, 0x64, 0x61, 0x35, 0x62, 0x65, 0x41, 0x5a, 0x5a, 0x69, 0x65, 0x68, 0x64, 0x66, 0x32, 0x31, 0x4a, 0x48, - 0x36, 0x6f, 0x63, 0x51, 0x4f, 0x41, 0x61, 0x52, 0x2f, 0x34, 0x55, 0x55, 0x77, 0x49, 0x35, 0x70, 0x51, 0x78, 0x0a, - 0x57, 0x4b, 0x43, 0x6a, 0x4b, 0x65, 0x42, 0x44, 0x6c, 0x30, 0x39, 0x46, 0x48, 0x66, 0x55, 0x56, 0x4e, 0x63, - 0x6a, 0x6d, 0x52, 0x54, 0x36, 0x2f, 0x63, 0x2f, 0x6c, 0x55, 0x4b, 0x63, 0x66, 0x51, 0x66, 0x77, 0x58, 0x54, - 0x35, 0x6f, 0x35, 0x43, 0x37, 0x59, 0x6b, 0x66, 0x6f, 0x43, 0x37, 0x47, 0x77, 0x67, 0x73, 0x66, 0x2f, 0x44, - 0x30, 0x62, 0x4a, 0x73, 0x46, 0x6b, 0x58, 0x66, 0x30, 0x53, 0x2b, 0x4c, 0x4c, 0x72, 0x66, 0x54, 0x4b, 0x65, 0x0a, - 0x6d, 0x66, 0x65, 0x39, 0x62, 0x4c, 0x37, 0x50, 0x63, 0x79, 0x65, 0x79, 0x6e, 0x4a, 0x39, 0x53, 0x76, 0x36, - 0x41, 0x65, 0x6d, 0x64, 0x63, 0x51, 0x73, 0x47, 0x31, 0x46, 0x72, 0x74, 0x53, 0x31, 0x49, 0x76, 0x38, 0x64, - 0x65, 0x41, 0x78, 0x71, 0x55, 0x2f, 0x67, 0x46, 0x61, 0x6a, 0x34, 0x43, 0x43, 0x42, 0x50, 0x36, 0x49, 0x68, - 0x37, 0x44, 0x63, 0x52, 0x56, 0x68, 0x6d, 0x47, 0x58, 0x7a, 0x41, 0x75, 0x35, 0x65, 0x4f, 0x36, 0x58, 0x73, 0x0a, - 0x77, 0x54, 0x72, 0x6b, 0x71, 0x6f, 0x55, 0x2b, 0x64, 0x36, 0x38, 0x74, 0x65, 0x61, 0x48, 0x59, 0x58, 0x64, - 0x53, 0x42, 0x2b, 0x4b, 0x48, 0x4f, 0x44, 0x41, 0x41, 0x75, 0x57, 0x6b, 0x56, 0x34, 0x41, 0x78, 0x46, 0x79, - 0x42, 0x63, 0x41, 0x73, 0x4a, 0x74, 0x72, 0x61, 0x6e, 0x65, 0x4e, 0x44, 0x70, 0x59, 0x57, 0x49, 0x49, 0x69, - 0x45, 0x55, 0x75, 0x6e, 0x68, 0x62, 0x75, 0x35, 0x31, 0x50, 0x36, 0x51, 0x31, 0x7a, 0x47, 0x4e, 0x4f, 0x6d, 0x0a, - 0x45, 0x72, 0x65, 0x71, 0x4c, 0x79, 0x70, 0x31, 0x5a, 0x77, 0x42, 0x77, 0x30, 0x58, 0x34, 0x43, 0x37, 0x38, - 0x64, 0x78, 0x65, 0x37, 0x45, 0x77, 0x53, 0x31, 0x73, 0x44, 0x50, 0x74, 0x49, 0x7a, 0x78, 0x58, 0x57, 0x4c, - 0x66, 0x63, 0x30, 0x55, 0x31, 0x43, 0x42, 0x5a, 0x44, 0x36, 0x35, 0x62, 0x37, 0x50, 0x4f, 0x52, 0x6e, 0x70, - 0x4c, 0x7a, 0x50, 0x6e, 0x5a, 0x68, 0x32, 0x6c, 0x4b, 0x69, 0x31, 0x76, 0x4f, 0x58, 0x53, 0x6c, 0x30, 0x61, 0x0a, - 0x41, 0x46, 0x77, 0x30, 0x51, 0x2f, 0x42, 0x62, 0x4f, 0x47, 0x34, 0x30, 0x47, 0x69, 0x62, 0x6a, 0x77, 0x5a, - 0x62, 0x46, 0x4f, 0x65, 0x35, 0x65, 0x4f, 0x38, 0x55, 0x56, 0x37, 0x6a, 0x75, 0x2f, 0x69, 0x69, 0x70, 0x78, - 0x78, 0x51, 0x49, 0x54, 0x37, 0x6d, 0x39, 0x5a, 0x48, 0x48, 0x6c, 0x36, 0x72, 0x38, 0x42, 0x44, 0x6d, 0x44, - 0x5a, 0x30, 0x43, 0x4f, 0x70, 0x48, 0x2f, 0x46, 0x41, 0x6e, 0x67, 0x34, 0x43, 0x7a, 0x55, 0x54, 0x51, 0x34, 0x0a, - 0x2b, 0x43, 0x6a, 0x77, 0x41, 0x76, 0x42, 0x74, 0x59, 0x48, 0x6d, 0x55, 0x2b, 0x37, 0x55, 0x31, 0x6d, 0x6a, - 0x33, 0x67, 0x72, 0x6c, 0x72, 0x6f, 0x38, 0x35, 0x50, 0x65, 0x4c, 0x47, 0x66, 0x47, 0x46, 0x42, 0x49, 0x6b, - 0x6b, 0x55, 0x55, 0x74, 0x41, 0x54, 0x66, 0x46, 0x63, 0x33, 0x7a, 0x63, 0x4b, 0x63, 0x77, 0x55, 0x33, 0x33, - 0x4e, 0x51, 0x58, 0x38, 0x49, 0x76, 0x55, 0x4c, 0x63, 0x52, 0x51, 0x4a, 0x69, 0x69, 0x4c, 0x63, 0x64, 0x76, 0x0a, - 0x6f, 0x6f, 0x51, 0x75, 0x41, 0x56, 0x78, 0x49, 0x46, 0x39, 0x32, 0x32, 0x33, 0x50, 0x6e, 0x30, 0x56, 0x31, - 0x46, 0x47, 0x4f, 0x70, 0x6f, 0x43, 0x74, 0x69, 0x33, 0x50, 0x78, 0x5a, 0x58, 0x6d, 0x76, 0x51, 0x76, 0x34, - 0x44, 0x39, 0x53, 0x78, 0x2b, 0x43, 0x45, 0x6c, 0x42, 0x67, 0x44, 0x78, 0x64, 0x67, 0x6b, 0x4b, 0x72, 0x4f, - 0x76, 0x77, 0x2b, 0x64, 0x32, 0x31, 0x55, 0x39, 0x79, 0x36, 0x50, 0x45, 0x64, 0x37, 0x6f, 0x34, 0x79, 0x67, 0x0a, - 0x57, 0x72, 0x51, 0x33, 0x6d, 0x68, 0x4f, 0x69, 0x66, 0x6e, 0x64, 0x74, 0x53, 0x51, 0x6b, 0x39, 0x59, 0x65, - 0x6f, 0x32, 0x35, 0x43, 0x2b, 0x6d, 0x72, 0x72, 0x73, 0x41, 0x78, 0x63, 0x7a, 0x51, 0x4a, 0x66, 0x68, 0x6e, - 0x34, 0x45, 0x6e, 0x67, 0x66, 0x56, 0x48, 0x76, 0x36, 0x57, 0x47, 0x4f, 0x4c, 0x46, 0x2f, 0x58, 0x34, 0x62, - 0x4e, 0x76, 0x49, 0x4d, 0x50, 0x72, 0x2f, 0x52, 0x6b, 0x47, 0x4a, 0x39, 0x51, 0x31, 0x71, 0x41, 0x51, 0x64, 0x0a, - 0x54, 0x51, 0x48, 0x58, 0x64, 0x50, 0x6d, 0x73, 0x37, 0x2f, 0x53, 0x6a, 0x72, 0x4e, 0x65, 0x66, 0x69, 0x58, - 0x2f, 0x44, 0x62, 0x4f, 0x43, 0x78, 0x46, 0x2b, 0x70, 0x62, 0x2b, 0x41, 0x56, 0x53, 0x45, 0x77, 0x47, 0x45, - 0x43, 0x58, 0x32, 0x78, 0x65, 0x34, 0x47, 0x62, 0x67, 0x53, 0x2b, 0x57, 0x65, 0x6b, 0x38, 0x50, 0x32, 0x4e, - 0x42, 0x70, 0x42, 0x70, 0x33, 0x75, 0x75, 0x43, 0x78, 0x48, 0x74, 0x31, 0x59, 0x61, 0x6c, 0x6f, 0x33, 0x75, 0x0a, - 0x31, 0x6f, 0x41, 0x37, 0x4c, 0x6a, 0x4f, 0x44, 0x73, 0x68, 0x76, 0x69, 0x45, 0x2f, 0x38, 0x58, 0x4d, 0x57, - 0x30, 0x68, 0x4e, 0x65, 0x4b, 0x48, 0x6c, 0x45, 0x55, 0x41, 0x59, 0x59, 0x71, 0x69, 0x67, 0x55, 0x38, 0x44, - 0x4f, 0x34, 0x43, 0x2f, 0x41, 0x50, 0x35, 0x6a, 0x71, 0x66, 0x64, 0x65, 0x33, 0x65, 0x61, 0x7a, 0x75, 0x73, - 0x32, 0x6e, 0x62, 0x38, 0x7a, 0x6a, 0x39, 0x66, 0x34, 0x4d, 0x68, 0x38, 0x35, 0x6c, 0x38, 0x4f, 0x55, 0x48, 0x0a, - 0x4a, 0x5a, 0x48, 0x78, 0x7a, 0x46, 0x34, 0x4f, 0x56, 0x33, 0x66, 0x35, 0x55, 0x5a, 0x66, 0x71, 0x7a, 0x73, - 0x62, 0x33, 0x4d, 0x64, 0x2f, 0x37, 0x69, 0x35, 0x41, 0x65, 0x34, 0x52, 0x64, 0x49, 0x72, 0x51, 0x45, 0x55, - 0x2b, 0x4d, 0x5a, 0x62, 0x6a, 0x51, 0x55, 0x54, 0x65, 0x42, 0x47, 0x34, 0x45, 0x2f, 0x67, 0x73, 0x38, 0x45, - 0x67, 0x63, 0x39, 0x31, 0x37, 0x53, 0x45, 0x6e, 0x44, 0x62, 0x69, 0x68, 0x7a, 0x6a, 0x75, 0x52, 0x78, 0x76, 0x0a, - 0x44, 0x32, 0x5a, 0x34, 0x61, 0x30, 0x44, 0x64, 0x41, 0x31, 0x63, 0x36, 0x6d, 0x67, 0x49, 0x32, 0x64, 0x50, - 0x70, 0x63, 0x32, 0x65, 0x48, 0x54, 0x6e, 0x49, 0x33, 0x39, 0x39, 0x67, 0x38, 0x52, 0x4f, 0x71, 0x49, 0x72, - 0x62, 0x65, 0x49, 0x48, 0x47, 0x51, 0x41, 0x77, 0x34, 0x39, 0x6a, 0x41, 0x64, 0x34, 0x44, 0x2f, 0x41, 0x58, - 0x77, 0x69, 0x6a, 0x76, 0x73, 0x33, 0x5a, 0x2b, 0x47, 0x61, 0x4c, 0x70, 0x39, 0x72, 0x75, 0x6e, 0x78, 0x36, 0x0a, - 0x52, 0x7a, 0x33, 0x32, 0x44, 0x32, 0x59, 0x34, 0x66, 0x43, 0x37, 0x44, 0x75, 0x4c, 0x59, 0x6f, 0x6e, 0x4a, - 0x48, 0x6d, 0x4c, 0x46, 0x7a, 0x65, 0x37, 0x76, 0x4e, 0x72, 0x48, 0x58, 0x36, 0x35, 0x75, 0x6c, 0x4a, 0x66, - 0x42, 0x2f, 0x36, 0x47, 0x47, 0x6c, 0x75, 0x37, 0x58, 0x77, 0x35, 0x6b, 0x41, 0x43, 0x46, 0x43, 0x30, 0x63, - 0x42, 0x2b, 0x34, 0x46, 0x35, 0x4d, 0x74, 0x2b, 0x42, 0x2b, 0x59, 0x48, 0x74, 0x63, 0x66, 0x36, 0x4f, 0x37, 0x0a, - 0x4e, 0x61, 0x43, 0x37, 0x4e, 0x63, 0x66, 0x4e, 0x79, 0x33, 0x49, 0x63, 0x47, 0x2f, 0x5a, 0x34, 0x35, 0x31, - 0x79, 0x47, 0x49, 0x2b, 0x63, 0x79, 0x54, 0x4b, 0x51, 0x38, 0x76, 0x36, 0x67, 0x70, 0x41, 0x36, 0x76, 0x62, - 0x66, 0x64, 0x61, 0x32, 0x2b, 0x31, 0x7a, 0x57, 0x46, 0x73, 0x54, 0x56, 0x72, 0x79, 0x39, 0x6d, 0x4a, 0x2f, - 0x41, 0x45, 0x38, 0x48, 0x54, 0x68, 0x46, 0x32, 0x6b, 0x57, 0x50, 0x38, 0x67, 0x41, 0x4c, 0x71, 0x49, 0x6f, 0x0a, - 0x47, 0x6e, 0x67, 0x36, 0x66, 0x2f, 0x30, 0x70, 0x78, 0x67, 0x68, 0x36, 0x34, 0x76, 0x6f, 0x37, 0x48, 0x75, - 0x61, 0x67, 0x69, 0x56, 0x56, 0x74, 0x4f, 0x66, 0x78, 0x6c, 0x4f, 0x59, 0x36, 0x50, 0x65, 0x42, 0x77, 0x66, - 0x79, 0x58, 0x42, 0x30, 0x78, 0x47, 0x4d, 0x6f, 0x4a, 0x64, 0x32, 0x45, 0x39, 0x73, 0x61, 0x41, 0x31, 0x57, - 0x30, 0x42, 0x4b, 0x2b, 0x66, 0x37, 0x72, 0x4a, 0x77, 0x66, 0x6c, 0x4a, 0x71, 0x74, 0x64, 0x79, 0x6b, 0x4f, 0x0a, - 0x59, 0x6f, 0x54, 0x2f, 0x74, 0x34, 0x56, 0x66, 0x70, 0x46, 0x33, 0x34, 0x42, 0x57, 0x51, 0x41, 0x73, 0x31, - 0x42, 0x6b, 0x42, 0x48, 0x38, 0x4c, 0x2f, 0x42, 0x33, 0x77, 0x49, 0x44, 0x47, 0x4e, 0x44, 0x34, 0x54, 0x4a, - 0x65, 0x42, 0x66, 0x4d, 0x34, 0x45, 0x5a, 0x67, 0x65, 0x4e, 0x4c, 0x6a, 0x36, 0x49, 0x6a, 0x48, 0x73, 0x57, - 0x47, 0x50, 0x55, 0x36, 0x4d, 0x5a, 0x78, 0x75, 0x71, 0x6b, 0x71, 0x39, 0x43, 0x53, 0x68, 0x61, 0x57, 0x74, 0x0a, - 0x50, 0x69, 0x76, 0x6d, 0x47, 0x2b, 0x46, 0x58, 0x4b, 0x48, 0x66, 0x69, 0x49, 0x65, 0x44, 0x7a, 0x67, 0x41, - 0x38, 0x53, 0x66, 0x6a, 0x45, 0x79, 0x67, 0x44, 0x6b, 0x49, 0x64, 0x51, 0x74, 0x38, 0x7a, 0x50, 0x6a, 0x41, - 0x34, 0x38, 0x41, 0x66, 0x41, 0x35, 0x38, 0x70, 0x31, 0x39, 0x39, 0x73, 0x61, 0x77, 0x7a, 0x59, 0x32, 0x42, - 0x6d, 0x77, 0x73, 0x52, 0x4d, 0x67, 0x78, 0x39, 0x43, 0x45, 0x52, 0x2b, 0x2b, 0x6f, 0x78, 0x36, 0x2f, 0x4f, 0x0a, - 0x65, 0x35, 0x77, 0x65, 0x38, 0x7a, 0x67, 0x37, 0x58, 0x68, 0x73, 0x52, 0x77, 0x73, 0x4c, 0x6d, 0x67, 0x4d, - 0x55, 0x74, 0x41, 0x63, 0x76, 0x6e, 0x42, 0x58, 0x53, 0x33, 0x42, 0x69, 0x79, 0x6f, 0x62, 0x4e, 0x62, 0x6b, - 0x35, 0x7a, 0x44, 0x48, 0x63, 0x66, 0x55, 0x58, 0x66, 0x69, 0x48, 0x78, 0x58, 0x34, 0x77, 0x4d, 0x77, 0x49, - 0x4b, 0x69, 0x61, 0x4b, 0x41, 0x66, 0x4d, 0x31, 0x50, 0x77, 0x4a, 0x65, 0x43, 0x54, 0x6d, 0x4b, 0x37, 0x42, 0x0a, - 0x73, 0x6e, 0x4c, 0x2b, 0x2f, 0x51, 0x56, 0x4e, 0x52, 0x6a, 0x78, 0x58, 0x64, 0x6c, 0x7a, 0x34, 0x33, 0x63, - 0x43, 0x34, 0x78, 0x37, 0x6c, 0x4a, 0x47, 0x4a, 0x72, 0x30, 0x47, 0x42, 0x6a, 0x33, 0x36, 0x42, 0x38, 0x33, - 0x58, 0x59, 0x64, 0x4b, 0x52, 0x77, 0x73, 0x74, 0x57, 0x56, 0x4f, 0x2f, 0x72, 0x75, 0x61, 0x41, 0x7a, 0x75, - 0x61, 0x41, 0x42, 0x59, 0x30, 0x42, 0x37, 0x59, 0x33, 0x51, 0x32, 0x56, 0x79, 0x56, 0x65, 0x63, 0x2b, 0x54, 0x0a, - 0x6d, 0x46, 0x44, 0x2f, 0x63, 0x53, 0x52, 0x38, 0x4b, 0x32, 0x51, 0x41, 0x44, 0x73, 0x78, 0x67, 0x42, 0x49, - 0x2f, 0x6d, 0x72, 0x2f, 0x73, 0x77, 0x52, 0x72, 0x43, 0x70, 0x55, 0x6e, 0x58, 0x70, 0x62, 0x41, 0x37, 0x6f, - 0x62, 0x41, 0x61, 0x59, 0x4c, 0x72, 0x51, 0x4a, 0x48, 0x34, 0x59, 0x6d, 0x50, 0x50, 0x72, 0x48, 0x50, 0x45, - 0x5a, 0x7a, 0x70, 0x6a, 0x73, 0x42, 0x35, 0x6e, 0x65, 0x46, 0x67, 0x63, 0x5a, 0x4a, 0x6e, 0x31, 0x6d, 0x6e, 0x0a, - 0x49, 0x78, 0x63, 0x32, 0x42, 0x39, 0x4f, 0x57, 0x50, 0x52, 0x65, 0x2f, 0x37, 0x6d, 0x6f, 0x4a, 0x79, 0x4f, - 0x62, 0x2f, 0x75, 0x36, 0x41, 0x70, 0x6f, 0x43, 0x6b, 0x5a, 0x71, 0x57, 0x52, 0x37, 0x4d, 0x63, 0x4c, 0x2f, - 0x61, 0x76, 0x69, 0x58, 0x45, 0x76, 0x37, 0x63, 0x79, 0x41, 0x41, 0x69, 0x45, 0x47, 0x35, 0x59, 0x65, 0x54, - 0x50, 0x34, 0x61, 0x76, 0x37, 0x36, 0x45, 0x4d, 0x59, 0x49, 0x37, 0x71, 0x78, 0x4b, 0x78, 0x54, 0x43, 0x6a, 0x0a, - 0x36, 0x59, 0x74, 0x62, 0x67, 0x72, 0x52, 0x73, 0x63, 0x4b, 0x70, 0x52, 0x2f, 0x52, 0x4c, 0x78, 0x67, 0x71, - 0x43, 0x30, 0x68, 0x76, 0x4c, 0x45, 0x4b, 0x2b, 0x4d, 0x78, 0x56, 0x61, 0x57, 0x75, 0x36, 0x41, 0x45, 0x2b, - 0x44, 0x76, 0x77, 0x42, 0x5a, 0x65, 0x34, 0x65, 0x70, 0x4a, 0x43, 0x54, 0x77, 0x4e, 0x65, 0x41, 0x62, 0x32, - 0x4a, 0x47, 0x39, 0x31, 0x50, 0x4e, 0x2f, 0x56, 0x75, 0x61, 0x53, 0x33, 0x70, 0x2f, 0x4d, 0x67, 0x4b, 0x34, 0x0a, - 0x2b, 0x75, 0x4d, 0x67, 0x38, 0x44, 0x42, 0x6d, 0x33, 0x34, 0x48, 0x66, 0x42, 0x70, 0x36, 0x71, 0x62, 0x6e, - 0x58, 0x71, 0x67, 0x71, 0x63, 0x77, 0x6e, 0x2b, 0x56, 0x79, 0x7a, 0x47, 0x65, 0x62, 0x65, 0x76, 0x48, 0x48, - 0x67, 0x62, 0x6f, 0x41, 0x35, 0x57, 0x64, 0x6e, 0x2f, 0x75, 0x72, 0x43, 0x64, 0x41, 0x30, 0x2b, 0x43, 0x76, - 0x78, 0x4f, 0x56, 0x57, 0x74, 0x55, 0x4f, 0x33, 0x77, 0x58, 0x6b, 0x35, 0x57, 0x35, 0x69, 0x39, 0x43, 0x67, 0x0a, - 0x6e, 0x6f, 0x67, 0x50, 0x47, 0x55, 0x44, 0x6c, 0x36, 0x41, 0x66, 0x2b, 0x49, 0x58, 0x38, 0x74, 0x41, 0x65, - 0x37, 0x49, 0x58, 0x39, 0x76, 0x7a, 0x72, 0x34, 0x58, 0x35, 0x6a, 0x4c, 0x34, 0x4c, 0x50, 0x4a, 0x4f, 0x2f, - 0x2b, 0x71, 0x70, 0x62, 0x6e, 0x66, 0x70, 0x48, 0x42, 0x6c, 0x41, 0x64, 0x2b, 0x72, 0x68, 0x67, 0x42, 0x6d, - 0x42, 0x6d, 0x44, 0x37, 0x5a, 0x6a, 0x49, 0x6f, 0x53, 0x62, 0x67, 0x66, 0x69, 0x58, 0x76, 0x53, 0x53, 0x54, 0x0a, - 0x48, 0x47, 0x61, 0x62, 0x74, 0x6d, 0x63, 0x78, 0x77, 0x6e, 0x2b, 0x31, 0x75, 0x74, 0x56, 0x4a, 0x48, 0x7a, - 0x4b, 0x41, 0x5a, 0x4c, 0x41, 0x33, 0x66, 0x2f, 0x31, 0x31, 0x2f, 0x76, 0x56, 0x57, 0x34, 0x42, 0x61, 0x4d, - 0x47, 0x57, 0x77, 0x46, 0x46, 0x6c, 0x65, 0x70, 0x58, 0x6e, 0x46, 0x7a, 0x47, 0x74, 0x69, 0x4e, 0x45, 0x66, - 0x33, 0x7a, 0x2b, 0x5a, 0x39, 0x46, 0x46, 0x5a, 0x45, 0x42, 0x4a, 0x4a, 0x50, 0x64, 0x2b, 0x61, 0x75, 0x77, 0x0a, - 0x55, 0x63, 0x6c, 0x36, 0x4c, 0x68, 0x6a, 0x43, 0x72, 0x77, 0x50, 0x58, 0x56, 0x4b, 0x6c, 0x65, 0x72, 0x72, - 0x77, 0x4f, 0x2f, 0x49, 0x77, 0x4c, 0x67, 0x74, 0x39, 0x58, 0x33, 0x65, 0x71, 0x49, 0x59, 0x6d, 0x51, 0x41, - 0x74, 0x63, 0x47, 0x2b, 0x2f, 0x50, 0x58, 0x31, 0x2f, 0x47, 0x73, 0x50, 0x75, 0x41, 0x6f, 0x7a, 0x33, 0x62, - 0x67, 0x75, 0x2f, 0x2f, 0x4f, 0x6d, 0x2f, 0x4d, 0x2b, 0x56, 0x6a, 0x68, 0x5a, 0x4f, 0x59, 0x34, 0x35, 0x69, 0x0a, - 0x32, 0x77, 0x75, 0x38, 0x6b, 0x66, 0x2f, 0x35, 0x59, 0x50, 0x37, 0x6e, 0x56, 0x43, 0x51, 0x6a, 0x31, 0x44, - 0x49, 0x79, 0x67, 0x4e, 0x6f, 0x6b, 0x41, 0x48, 0x36, 0x52, 0x76, 0x34, 0x72, 0x70, 0x78, 0x42, 0x6a, 0x42, - 0x74, 0x5a, 0x6a, 0x42, 0x78, 0x63, 0x49, 0x4b, 0x78, 0x6e, 0x56, 0x41, 0x49, 0x5a, 0x6d, 0x34, 0x44, 0x66, - 0x69, 0x31, 0x57, 0x65, 0x37, 0x39, 0x4f, 0x6a, 0x41, 0x52, 0x65, 0x72, 0x32, 0x33, 0x36, 0x50, 0x57, 0x72, 0x0a, - 0x2b, 0x64, 0x65, 0x76, 0x59, 0x73, 0x51, 0x2b, 0x34, 0x46, 0x35, 0x39, 0x6b, 0x52, 0x52, 0x6b, 0x41, 0x50, - 0x58, 0x48, 0x41, 0x50, 0x42, 0x79, 0x2f, 0x72, 0x6f, 0x55, 0x73, 0x36, 0x30, 0x6f, 0x30, 0x6c, 0x4d, 0x37, - 0x52, 0x63, 0x67, 0x41, 0x30, 0x6f, 0x75, 0x45, 0x4c, 0x70, 0x51, 0x4a, 0x4b, 0x45, 0x53, 0x61, 0x4b, 0x58, - 0x6b, 0x74, 0x67, 0x42, 0x43, 0x69, 0x64, 0x6c, 0x45, 0x45, 0x49, 0x45, 0x53, 0x4b, 0x6b, 0x51, 0x45, 0x49, 0x0a, - 0x6b, 0x57, 0x4a, 0x6b, 0x41, 0x45, 0x4b, 0x6b, 0x47, 0x42, 0x6d, 0x41, 0x45, 0x43, 0x6c, 0x47, 0x42, 0x69, - 0x42, 0x45, 0x69, 0x70, 0x45, 0x42, 0x43, 0x4a, 0x46, 0x69, 0x2f, 0x68, 0x30, 0x37, 0x77, 0x4f, 0x37, 0x35, - 0x36, 0x2f, 0x2b, 0x71, 0x74, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, - 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x31, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, - 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 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, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x43, 0x41, 0x59, 0x41, - 0x41, 0x41, 0x42, 0x7a, 0x65, 0x6e, 0x72, 0x30, 0x41, 0x41, 0x41, 0x42, 0x53, 0x45, 0x6c, 0x45, 0x51, 0x56, - 0x52, 0x59, 0x68, 0x65, 0x32, 0x57, 0x30, 0x57, 0x33, 0x43, 0x4d, 0x42, 0x43, 0x47, 0x76, 0x31, 0x53, 0x38, 0x0a, - 0x4e, 0x79, 0x4e, 0x55, 0x36, 0x67, 0x4b, 0x77, 0x51, 0x64, 0x6d, 0x6b, 0x33, 0x53, 0x42, 0x4d, 0x41, 0x45, - 0x78, 0x41, 0x6d, 0x51, 0x42, 0x31, 0x41, 0x74, 0x6f, 0x4a, 0x6d, 0x6b, 0x35, 0x51, 0x47, 0x41, 0x43, 0x4a, - 0x45, 0x63, 0x49, 0x45, 0x36, 0x59, 0x4d, 0x64, 0x39, 0x62, 0x42, 0x51, 0x66, 0x4f, 0x65, 0x6b, 0x53, 0x68, - 0x2f, 0x79, 0x50, 0x7a, 0x6d, 0x4f, 0x37, 0x66, 0x2f, 0x2f, 0x7a, 0x33, 0x65, 0x32, 0x73, 0x37, 0x71, 0x75, 0x0a, - 0x47, 0x52, 0x4a, 0x33, 0x67, 0x37, 0x4b, 0x50, 0x41, 0x6b, 0x59, 0x42, 0x2f, 0x30, 0x48, 0x41, 0x70, 0x4b, - 0x2b, 0x46, 0x54, 0x70, 0x66, 0x72, 0x37, 0x38, 0x64, 0x37, 0x33, 0x62, 0x7a, 0x4f, 0x45, 0x54, 0x68, 0x64, - 0x72, 0x73, 0x68, 0x58, 0x77, 0x4e, 0x51, 0x79, 0x58, 0x78, 0x57, 0x42, 0x30, 0x42, 0x30, 0x34, 0x68, 0x36, - 0x49, 0x2f, 0x42, 0x7a, 0x62, 0x41, 0x4d, 0x31, 0x44, 0x32, 0x4c, 0x73, 0x42, 0x6a, 0x41, 0x78, 0x77, 0x39, 0x0a, - 0x77, 0x54, 0x6b, 0x67, 0x2f, 0x38, 0x54, 0x6f, 0x50, 0x45, 0x56, 0x41, 0x44, 0x75, 0x78, 0x38, 0x2b, 0x2b, - 0x43, 0x46, 0x66, 0x50, 0x6d, 0x2b, 0x50, 0x49, 0x55, 0x63, 0x49, 0x4e, 0x50, 0x63, 0x42, 0x64, 0x37, 0x74, - 0x46, 0x50, 0x68, 0x57, 0x72, 0x44, 0x6b, 0x48, 0x79, 0x72, 0x39, 0x49, 0x77, 0x73, 0x5a, 0x31, 0x44, 0x44, - 0x6e, 0x63, 0x7a, 0x70, 0x74, 0x6b, 0x41, 0x63, 0x4c, 0x4e, 0x6d, 0x32, 0x4c, 0x34, 0x44, 0x69, 0x67, 0x61, 0x0a, - 0x45, 0x54, 0x45, 0x68, 0x71, 0x69, 0x31, 0x6f, 0x46, 0x76, 0x50, 0x51, 0x33, 0x74, 0x38, 0x6c, 0x73, 0x4d, - 0x42, 0x46, 0x44, 0x72, 0x68, 0x39, 0x4e, 0x71, 0x67, 0x69, 0x49, 0x4d, 0x67, 0x4c, 0x4a, 0x54, 0x6e, 0x41, - 0x45, 0x79, 0x35, 0x6e, 0x56, 0x72, 0x51, 0x6b, 0x71, 0x53, 0x55, 0x48, 0x48, 0x6f, 0x43, 0x6c, 0x59, 0x54, - 0x77, 0x34, 0x39, 0x31, 0x58, 0x62, 0x67, 0x47, 0x67, 0x5a, 0x43, 0x76, 0x66, 0x61, 0x63, 0x6a, 0x73, 0x44, 0x0a, - 0x37, 0x38, 0x44, 0x57, 0x74, 0x31, 0x75, 0x68, 0x50, 0x51, 0x63, 0x4b, 0x58, 0x45, 0x68, 0x6a, 0x4f, 0x41, - 0x41, 0x7a, 0x32, 0x52, 0x45, 0x72, 0x52, 0x38, 0x74, 0x42, 0x74, 0x42, 0x59, 0x6b, 0x46, 0x62, 0x38, 0x48, - 0x6b, 0x34, 0x7a, 0x4b, 0x68, 0x34, 0x59, 0x30, 0x52, 0x63, 0x42, 0x72, 0x79, 0x37, 0x2b, 0x39, 0x61, 0x4a, - 0x64, 0x36, 0x61, 0x67, 0x64, 0x31, 0x47, 0x59, 0x59, 0x49, 0x62, 0x73, 0x41, 0x6d, 0x4f, 0x54, 0x4f, 0x77, 0x0a, - 0x52, 0x53, 0x42, 0x5a, 0x51, 0x43, 0x42, 0x69, 0x6a, 0x39, 0x75, 0x4b, 0x75, 0x59, 0x55, 0x63, 0x4f, 0x72, - 0x34, 0x48, 0x42, 0x4e, 0x6b, 0x4c, 0x4c, 0x75, 0x76, 0x4e, 0x36, 0x4f, 0x74, 0x4a, 0x56, 0x75, 0x46, 0x4b, - 0x7a, 0x34, 0x78, 0x4f, 0x57, 0x39, 0x41, 0x48, 0x42, 0x6e, 0x2b, 0x55, 0x6a, 0x67, 0x4a, 0x47, 0x41, 0x54, - 0x2f, 0x6d, 0x2f, 0x46, 0x57, 0x39, 0x51, 0x77, 0x43, 0x69, 0x33, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x0a, - 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5d, 0x5d, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x73, - 0x70, 0x65, 0x65, 0x64, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x09, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0x30, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, - 0x28, 0x29, 0x20, 0x2a, 0x20, 0x36, 0x30, 0x30, 0x2c, 0x0a,0x0a, - 0x09, 0x09, 0x09, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, - 0x6d, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x69, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x72, 0x76, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, - 0x6d, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x69, 0x20, 0x2a, 0x20, 0x34, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, - 0x28, 0x29, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x2c, 0x0a, - 0x09, 0x09, 0x7d, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x6e, 0x75, - 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x73, 0x70, - 0x65, 0x65, 0x64, 0x29, 0x0a,0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x73, - 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x29, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x6d, 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x67, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 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, 0x41, 0x47, 0x58, 0x52, + 0x46, 0x57, 0x48, 0x52, 0x54, 0x62, 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x51, 0x42, 0x42, 0x5a, + 0x47, 0x39, 0x69, 0x5a, 0x53, 0x42, 0x4a, 0x5c, 0x0a, + 0x09, 0x09, 0x62, 0x57, 0x46, 0x6e, 0x5a, 0x56, 0x4a, 0x6c, 0x59, 0x57, 0x52, 0x35, 0x63, 0x63, 0x6c, 0x6c, + 0x50, 0x41, 0x41, 0x41, 0x41, 0x79, 0x42, 0x70, 0x56, 0x46, 0x68, 0x30, 0x57, 0x45, 0x31, 0x4d, 0x4f, 0x6d, + 0x4e, 0x76, 0x62, 0x53, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x34, 0x62, 0x58, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x77, 0x2f, 0x65, 0x48, 0x42, 0x68, 0x59, 0x32, 0x74, 0x6c, 0x64, 0x43, + 0x42, 0x69, 0x5a, 0x57, 0x64, 0x70, 0x5c, 0x0a, + 0x09, 0x09, 0x62, 0x6a, 0x30, 0x69, 0x37, 0x37, 0x75, 0x2f, 0x49, 0x69, 0x42, 0x70, 0x5a, 0x44, 0x30, 0x69, + 0x56, 0x7a, 0x56, 0x4e, 0x4d, 0x45, 0x31, 0x77, 0x51, 0x32, 0x56, 0x6f, 0x61, 0x55, 0x68, 0x36, 0x63, 0x6d, + 0x56, 0x54, 0x65, 0x6b, 0x35, 0x55, 0x59, 0x33, 0x70, 0x72, 0x59, 0x7a, 0x6c, 0x6b, 0x49, 0x6a, 0x38, 0x2b, + 0x49, 0x44, 0x78, 0x34, 0x4f, 0x6e, 0x68, 0x74, 0x63, 0x47, 0x31, 0x6c, 0x64, 0x47, 0x45, 0x67, 0x65, 0x47, + 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x5c, 0x0a, + 0x09, 0x09, 0x65, 0x44, 0x30, 0x69, 0x59, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x36, 0x62, 0x6e, 0x4d, 0x36, + 0x62, 0x57, 0x56, 0x30, 0x59, 0x53, 0x38, 0x69, 0x49, 0x48, 0x67, 0x36, 0x65, 0x47, 0x31, 0x77, 0x64, 0x47, + 0x73, 0x39, 0x49, 0x6b, 0x46, 0x6b, 0x62, 0x32, 0x4a, 0x6c, 0x49, 0x46, 0x68, 0x4e, 0x55, 0x43, 0x42, 0x44, + 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x44, 0x55, 0x75, 0x4d, 0x43, 0x31, 0x6a, 0x4d, 0x44, 0x59, 0x77, 0x49, 0x44, + 0x59, 0x78, 0x4c, 0x6a, 0x45, 0x7a, 0x5c, 0x0a, + 0x09, 0x09, 0x4e, 0x44, 0x63, 0x33, 0x4e, 0x79, 0x77, 0x67, 0x4d, 0x6a, 0x41, 0x78, 0x4d, 0x43, 0x38, 0x77, + 0x4d, 0x69, 0x38, 0x78, 0x4d, 0x69, 0x30, 0x78, 0x4e, 0x7a, 0x6f, 0x7a, 0x4d, 0x6a, 0x6f, 0x77, 0x4d, 0x43, + 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x6a, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, + 0x5a, 0x6a, 0x70, 0x53, 0x52, 0x45, 0x59, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x63, 0x6d, + 0x52, 0x6d, 0x50, 0x53, 0x4a, 0x6f, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x48, 0x52, 0x77, 0x4f, 0x69, 0x38, 0x76, 0x64, 0x33, 0x64, 0x33, 0x4c, 0x6e, 0x63, 0x7a, + 0x4c, 0x6d, 0x39, 0x79, 0x5a, 0x79, 0x38, 0x78, 0x4f, 0x54, 0x6b, 0x35, 0x4c, 0x7a, 0x41, 0x79, 0x4c, 0x7a, + 0x49, 0x79, 0x4c, 0x58, 0x4a, 0x6b, 0x5a, 0x69, 0x31, 0x7a, 0x65, 0x57, 0x35, 0x30, 0x59, 0x58, 0x67, 0x74, + 0x62, 0x6e, 0x4d, 0x6a, 0x49, 0x6a, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x45, 0x5a, 0x58, + 0x4e, 0x6a, 0x63, 0x6d, 0x6c, 0x77, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x47, 0x6c, 0x76, 0x62, 0x69, 0x42, 0x79, 0x5a, 0x47, 0x59, 0x36, 0x59, 0x57, 0x4a, 0x76, + 0x64, 0x58, 0x51, 0x39, 0x49, 0x69, 0x49, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x65, 0x47, + 0x31, 0x77, 0x50, 0x53, 0x4a, 0x6f, 0x64, 0x48, 0x52, 0x77, 0x4f, 0x69, 0x38, 0x76, 0x62, 0x6e, 0x4d, 0x75, + 0x59, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4c, 0x33, 0x68, 0x68, 0x63, 0x43, + 0x38, 0x78, 0x4c, 0x6a, 0x41, 0x76, 0x5c, 0x0a, + 0x09, 0x09, 0x49, 0x69, 0x42, 0x34, 0x62, 0x57, 0x78, 0x75, 0x63, 0x7a, 0x70, 0x34, 0x62, 0x58, 0x42, 0x4e, + 0x54, 0x54, 0x30, 0x69, 0x61, 0x48, 0x52, 0x30, 0x63, 0x44, 0x6f, 0x76, 0x4c, 0x32, 0x35, 0x7a, 0x4c, 0x6d, + 0x46, 0x6b, 0x62, 0x32, 0x4a, 0x6c, 0x4c, 0x6d, 0x4e, 0x76, 0x62, 0x53, 0x39, 0x34, 0x59, 0x58, 0x41, 0x76, + 0x4d, 0x53, 0x34, 0x77, 0x4c, 0x32, 0x31, 0x74, 0x4c, 0x79, 0x49, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, + 0x4d, 0x36, 0x63, 0x33, 0x52, 0x53, 0x5c, 0x0a, + 0x09, 0x09, 0x5a, 0x57, 0x59, 0x39, 0x49, 0x6d, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4c, 0x79, 0x39, 0x75, + 0x63, 0x79, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, 0x76, 0x65, 0x47, + 0x46, 0x77, 0x4c, 0x7a, 0x45, 0x75, 0x4d, 0x43, 0x39, 0x7a, 0x56, 0x48, 0x6c, 0x77, 0x5a, 0x53, 0x39, 0x53, + 0x5a, 0x58, 0x4e, 0x76, 0x64, 0x58, 0x4a, 0x6a, 0x5a, 0x56, 0x4a, 0x6c, 0x5a, 0x69, 0x4d, 0x69, 0x49, 0x48, + 0x68, 0x74, 0x63, 0x44, 0x70, 0x44, 0x5c, 0x0a, + 0x09, 0x09, 0x63, 0x6d, 0x56, 0x68, 0x64, 0x47, 0x39, 0x79, 0x56, 0x47, 0x39, 0x76, 0x62, 0x44, 0x30, 0x69, + 0x51, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x67, 0x55, 0x47, 0x68, 0x76, 0x64, 0x47, 0x39, 0x7a, 0x61, 0x47, + 0x39, 0x77, 0x49, 0x45, 0x4e, 0x54, 0x4e, 0x53, 0x42, 0x58, 0x61, 0x57, 0x35, 0x6b, 0x62, 0x33, 0x64, 0x7a, + 0x49, 0x69, 0x42, 0x34, 0x62, 0x58, 0x42, 0x4e, 0x54, 0x54, 0x70, 0x4a, 0x62, 0x6e, 0x4e, 0x30, 0x59, 0x57, + 0x35, 0x6a, 0x5a, 0x55, 0x6c, 0x45, 0x5c, 0x0a, + 0x09, 0x09, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x61, 0x57, 0x6c, 0x6b, 0x4f, 0x6a, 0x64, 0x43, + 0x51, 0x54, 0x59, 0x78, 0x52, 0x45, 0x59, 0x78, 0x4f, 0x55, 0x51, 0x35, 0x52, 0x44, 0x45, 0x78, 0x52, 0x54, + 0x42, 0x42, 0x4e, 0x6a, 0x59, 0x34, 0x52, 0x54, 0x63, 0x31, 0x4e, 0x45, 0x56, 0x45, 0x51, 0x54, 0x55, 0x31, + 0x4d, 0x45, 0x52, 0x44, 0x49, 0x69, 0x42, 0x34, 0x62, 0x58, 0x42, 0x4e, 0x54, 0x54, 0x70, 0x45, 0x62, 0x32, + 0x4e, 0x31, 0x62, 0x57, 0x56, 0x75, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x45, 0x6c, 0x45, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x5a, 0x47, 0x6c, 0x6b, + 0x4f, 0x6a, 0x64, 0x43, 0x51, 0x54, 0x59, 0x78, 0x52, 0x45, 0x59, 0x79, 0x4f, 0x55, 0x51, 0x35, 0x52, 0x44, + 0x45, 0x78, 0x52, 0x54, 0x42, 0x42, 0x4e, 0x6a, 0x59, 0x34, 0x52, 0x54, 0x63, 0x31, 0x4e, 0x45, 0x56, 0x45, + 0x51, 0x54, 0x55, 0x31, 0x4d, 0x45, 0x52, 0x44, 0x49, 0x6a, 0x34, 0x67, 0x50, 0x48, 0x68, 0x74, 0x63, 0x45, + 0x31, 0x4e, 0x4f, 0x6b, 0x52, 0x6c, 0x5c, 0x0a, + 0x09, 0x09, 0x63, 0x6d, 0x6c, 0x32, 0x5a, 0x57, 0x52, 0x47, 0x63, 0x6d, 0x39, 0x74, 0x49, 0x48, 0x4e, 0x30, + 0x55, 0x6d, 0x56, 0x6d, 0x4f, 0x6d, 0x6c, 0x75, 0x63, 0x33, 0x52, 0x68, 0x62, 0x6d, 0x4e, 0x6c, 0x53, 0x55, + 0x51, 0x39, 0x49, 0x6e, 0x68, 0x74, 0x63, 0x43, 0x35, 0x70, 0x61, 0x57, 0x51, 0x36, 0x4e, 0x30, 0x4a, 0x42, + 0x4e, 0x6a, 0x46, 0x45, 0x52, 0x55, 0x59, 0x35, 0x52, 0x44, 0x6c, 0x45, 0x4d, 0x54, 0x46, 0x46, 0x4d, 0x45, + 0x45, 0x32, 0x4e, 0x6a, 0x68, 0x46, 0x5c, 0x0a, + 0x09, 0x09, 0x4e, 0x7a, 0x55, 0x30, 0x52, 0x55, 0x52, 0x42, 0x4e, 0x54, 0x55, 0x77, 0x52, 0x45, 0x4d, 0x69, + 0x49, 0x48, 0x4e, 0x30, 0x55, 0x6d, 0x56, 0x6d, 0x4f, 0x6d, 0x52, 0x76, 0x59, 0x33, 0x56, 0x74, 0x5a, 0x57, + 0x35, 0x30, 0x53, 0x55, 0x51, 0x39, 0x49, 0x6e, 0x68, 0x74, 0x63, 0x43, 0x35, 0x6b, 0x61, 0x57, 0x51, 0x36, + 0x4e, 0x30, 0x4a, 0x42, 0x4e, 0x6a, 0x46, 0x45, 0x52, 0x6a, 0x41, 0x35, 0x52, 0x44, 0x6c, 0x45, 0x4d, 0x54, + 0x46, 0x46, 0x4d, 0x45, 0x45, 0x32, 0x5c, 0x0a, + 0x09, 0x09, 0x4e, 0x6a, 0x68, 0x46, 0x4e, 0x7a, 0x55, 0x30, 0x52, 0x55, 0x52, 0x42, 0x4e, 0x54, 0x55, 0x77, + 0x52, 0x45, 0x4d, 0x69, 0x4c, 0x7a, 0x34, 0x67, 0x50, 0x43, 0x39, 0x79, 0x5a, 0x47, 0x59, 0x36, 0x52, 0x47, + 0x56, 0x7a, 0x59, 0x33, 0x4a, 0x70, 0x63, 0x48, 0x52, 0x70, 0x62, 0x32, 0x34, 0x2b, 0x49, 0x44, 0x77, 0x76, + 0x63, 0x6d, 0x52, 0x6d, 0x4f, 0x6c, 0x4a, 0x45, 0x52, 0x6a, 0x34, 0x67, 0x50, 0x43, 0x39, 0x34, 0x4f, 0x6e, + 0x68, 0x74, 0x63, 0x47, 0x31, 0x6c, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x47, 0x45, 0x2b, 0x49, 0x44, 0x77, 0x2f, 0x65, 0x48, 0x42, 0x68, 0x59, 0x32, 0x74, 0x6c, + 0x64, 0x43, 0x42, 0x6c, 0x62, 0x6d, 0x51, 0x39, 0x49, 0x6e, 0x49, 0x69, 0x50, 0x7a, 0x36, 0x67, 0x52, 0x47, + 0x75, 0x7a, 0x41, 0x41, 0x41, 0x59, 0x58, 0x6b, 0x6c, 0x45, 0x51, 0x56, 0x52, 0x34, 0x32, 0x75, 0x79, 0x64, + 0x58, 0x32, 0x68, 0x63, 0x56, 0x33, 0x37, 0x48, 0x7a, 0x34, 0x78, 0x6b, 0x65, 0x54, 0x64, 0x78, 0x4e, 0x72, + 0x49, 0x54, 0x6b, 0x70, 0x42, 0x6b, 0x5c, 0x0a, + 0x09, 0x09, 0x30, 0x2f, 0x45, 0x6d, 0x67, 0x57, 0x78, 0x4c, 0x62, 0x4b, 0x6c, 0x68, 0x79, 0x5a, 0x5a, 0x43, + 0x50, 0x59, 0x4a, 0x74, 0x53, 0x77, 0x33, 0x46, 0x55, 0x70, 0x65, 0x2b, 0x46, 0x54, 0x7a, 0x7a, 0x73, 0x47, + 0x39, 0x4c, 0x4c, 0x64, 0x46, 0x43, 0x48, 0x32, 0x57, 0x39, 0x46, 0x7a, 0x77, 0x75, 0x66, 0x65, 0x75, 0x44, + 0x52, 0x74, 0x44, 0x58, 0x34, 0x74, 0x47, 0x4c, 0x53, 0x30, 0x74, 0x42, 0x6f, 0x30, 0x49, 0x70, 0x53, 0x31, + 0x73, 0x38, 0x54, 0x6d, 0x6b, 0x33, 0x5c, 0x0a, + 0x09, 0x09, 0x53, 0x39, 0x78, 0x34, 0x6b, 0x6e, 0x69, 0x58, 0x65, 0x4d, 0x6e, 0x4b, 0x6b, 0x37, 0x2f, 0x65, + 0x57, 0x4c, 0x4c, 0x55, 0x38, 0x37, 0x76, 0x7a, 0x75, 0x39, 0x4c, 0x56, 0x2f, 0x4c, 0x2f, 0x33, 0x6e, 0x6e, + 0x50, 0x76, 0x37, 0x39, 0x7a, 0x37, 0x2f, 0x63, 0x42, 0x6c, 0x46, 0x45, 0x63, 0x6a, 0x6a, 0x63, 0x34, 0x35, + 0x76, 0x2b, 0x2f, 0x35, 0x2f, 0x73, 0x37, 0x66, 0x77, 0x73, 0x48, 0x42, 0x67, 0x51, 0x49, 0x41, 0x35, 0x4a, + 0x4d, 0x69, 0x69, 0x67, 0x41, 0x41, 0x5c, 0x0a, + 0x09, 0x09, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, + 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x49, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x49, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x49, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x49, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, + 0x41, 0x44, 0x44, 0x42, 0x64, 0x4e, 0x67, 0x33, 0x46, 0x41, 0x6f, 0x46, 0x61, 0x78, 0x2b, 0x6d, 0x38, 0x39, + 0x66, 0x2f, 0x58, 0x4e, 0x59, 0x76, 0x5c, 0x0a, + 0x09, 0x09, 0x39, 0x4a, 0x7a, 0x58, 0x7a, 0x36, 0x78, 0x2b, 0x35, 0x76, 0x69, 0x56, 0x61, 0x50, 0x4a, 0x72, + 0x53, 0x7a, 0x38, 0x66, 0x30, 0x4f, 0x76, 0x73, 0x58, 0x2f, 0x35, 0x42, 0x45, 0x31, 0x55, 0x49, 0x51, 0x44, + 0x2b, 0x54, 0x33, 0x76, 0x6c, 0x5a, 0x43, 0x48, 0x73, 0x35, 0x71, 0x47, 0x6b, 0x42, 0x30, 0x45, 0x46, 0x50, + 0x41, 0x62, 0x36, 0x73, 0x6e, 0x38, 0x76, 0x36, 0x4b, 0x59, 0x56, 0x39, 0x4f, 0x77, 0x76, 0x44, 0x70, 0x6e, + 0x34, 0x61, 0x57, 0x68, 0x41, 0x36, 0x5c, 0x0a, + 0x09, 0x09, 0x71, 0x48, 0x6f, 0x41, 0x48, 0x42, 0x45, 0x41, 0x48, 0x66, 0x77, 0x55, 0x2b, 0x4b, 0x75, 0x42, + 0x58, 0x6a, 0x34, 0x75, 0x44, 0x66, 0x31, 0x73, 0x61, 0x43, 0x46, 0x6f, 0x6f, 0x41, 0x6b, 0x41, 0x43, 0x49, + 0x42, 0x51, 0x41, 0x65, 0x42, 0x65, 0x2f, 0x77, 0x62, 0x62, 0x66, 0x52, 0x75, 0x30, 0x39, 0x58, 0x4e, 0x64, + 0x50, 0x33, 0x57, 0x34, 0x41, 0x67, 0x41, 0x42, 0x45, 0x43, 0x51, 0x41, 0x48, 0x50, 0x78, 0x62, 0x6e, 0x4e, + 0x2f, 0x62, 0x70, 0x73, 0x4e, 0x43, 0x5c, 0x0a, + 0x09, 0x09, 0x55, 0x49, 0x4d, 0x51, 0x41, 0x41, 0x68, 0x41, 0x50, 0x34, 0x6e, 0x4f, 0x41, 0x69, 0x51, 0x63, + 0x2f, 0x49, 0x70, 0x54, 0x43, 0x30, 0x6f, 0x78, 0x37, 0x75, 0x72, 0x66, 0x66, 0x52, 0x58, 0x4e, 0x41, 0x6f, + 0x41, 0x55, 0x48, 0x59, 0x41, 0x4f, 0x77, 0x69, 0x32, 0x4c, 0x74, 0x6e, 0x2f, 0x53, 0x31, 0x47, 0x41, 0x46, + 0x59, 0x77, 0x51, 0x67, 0x4c, 0x58, 0x69, 0x6d, 0x69, 0x32, 0x6a, 0x5a, 0x64, 0x4b, 0x58, 0x69, 0x55, 0x67, + 0x44, 0x75, 0x67, 0x56, 0x65, 0x46, 0x5c, 0x0a, + 0x09, 0x09, 0x31, 0x45, 0x4e, 0x54, 0x50, 0x31, 0x56, 0x64, 0x41, 0x57, 0x30, 0x30, 0x53, 0x57, 0x41, 0x67, + 0x71, 0x4d, 0x6e, 0x52, 0x6c, 0x74, 0x6a, 0x5a, 0x50, 0x68, 0x31, 0x77, 0x75, 0x4d, 0x46, 0x70, 0x37, 0x48, + 0x47, 0x30, 0x4f, 0x47, 0x58, 0x31, 0x70, 0x37, 0x6d, 0x62, 0x75, 0x6e, 0x32, 0x32, 0x4d, 0x69, 0x45, 0x41, + 0x72, 0x48, 0x70, 0x62, 0x41, 0x75, 0x74, 0x75, 0x54, 0x52, 0x63, 0x79, 0x55, 0x67, 0x4d, 0x51, 0x4a, 0x6f, + 0x57, 0x64, 0x55, 0x30, 0x64, 0x72, 0x5c, 0x0a, + 0x09, 0x09, 0x56, 0x55, 0x71, 0x57, 0x30, 0x39, 0x6e, 0x49, 0x30, 0x39, 0x7a, 0x53, 0x42, 0x4f, 0x42, 0x57, + 0x67, 0x6e, 0x6c, 0x2f, 0x57, 0x46, 0x72, 0x73, 0x42, 0x6c, 0x70, 0x6f, 0x34, 0x71, 0x43, 0x6e, 0x33, 0x5a, + 0x59, 0x34, 0x32, 0x43, 0x39, 0x77, 0x2b, 0x30, 0x32, 0x7a, 0x44, 0x56, 0x50, 0x77, 0x4e, 0x37, 0x6a, 0x54, + 0x61, 0x6a, 0x73, 0x6a, 0x41, 0x4c, 0x6f, 0x51, 0x4b, 0x2f, 0x70, 0x6c, 0x33, 0x59, 0x48, 0x36, 0x68, 0x68, + 0x74, 0x41, 0x77, 0x46, 0x4d, 0x50, 0x5c, 0x0a, + 0x09, 0x09, 0x76, 0x38, 0x67, 0x42, 0x58, 0x31, 0x62, 0x68, 0x46, 0x36, 0x59, 0x6c, 0x52, 0x59, 0x33, 0x62, + 0x61, 0x38, 0x63, 0x46, 0x41, 0x62, 0x67, 0x72, 0x75, 0x43, 0x41, 0x48, 0x75, 0x59, 0x45, 0x6c, 0x6c, 0x38, + 0x63, 0x47, 0x64, 0x69, 0x37, 0x57, 0x5a, 0x67, 0x66, 0x30, 0x56, 0x4f, 0x57, 0x59, 0x50, 0x55, 0x2f, 0x51, + 0x48, 0x58, 0x58, 0x4f, 0x33, 0x46, 0x78, 0x75, 0x5a, 0x53, 0x6a, 0x6f, 0x35, 0x7a, 0x6a, 0x6f, 0x4c, 0x77, + 0x6c, 0x32, 0x71, 0x59, 0x4e, 0x6f, 0x5c, 0x0a, + 0x09, 0x09, 0x73, 0x33, 0x4e, 0x74, 0x69, 0x68, 0x55, 0x41, 0x68, 0x33, 0x72, 0x2f, 0x33, 0x67, 0x5a, 0x66, + 0x6c, 0x54, 0x68, 0x54, 0x6f, 0x49, 0x50, 0x62, 0x48, 0x31, 0x54, 0x79, 0x58, 0x2f, 0x30, 0x39, 0x45, 0x37, + 0x4d, 0x70, 0x4e, 0x64, 0x36, 0x67, 0x4f, 0x4e, 0x44, 0x72, 0x70, 0x79, 0x6f, 0x77, 0x6d, 0x4b, 0x57, 0x46, + 0x6f, 0x69, 0x4d, 0x34, 0x36, 0x43, 0x39, 0x7a, 0x34, 0x4a, 0x65, 0x55, 0x32, 0x31, 0x42, 0x62, 0x72, 0x55, + 0x73, 0x56, 0x67, 0x4c, 0x73, 0x4f, 0x5c, 0x0a, + 0x09, 0x09, 0x46, 0x7a, 0x41, 0x74, 0x48, 0x6c, 0x70, 0x4a, 0x4b, 0x64, 0x42, 0x39, 0x2b, 0x31, 0x6c, 0x69, + 0x4f, 0x31, 0x70, 0x79, 0x75, 0x42, 0x79, 0x62, 0x4c, 0x41, 0x69, 0x33, 0x57, 0x52, 0x78, 0x49, 0x47, 0x4e, + 0x6f, 0x49, 0x65, 0x72, 0x73, 0x69, 0x6b, 0x4c, 0x6f, 0x41, 0x43, 0x42, 0x37, 0x35, 0x44, 0x35, 0x73, 0x53, + 0x4c, 0x4e, 0x69, 0x63, 0x72, 0x2b, 0x56, 0x67, 0x6e, 0x2b, 0x50, 0x65, 0x50, 0x4f, 0x32, 0x42, 0x70, 0x71, + 0x53, 0x46, 0x6f, 0x65, 0x55, 0x4c, 0x5c, 0x0a, + 0x09, 0x09, 0x67, 0x34, 0x32, 0x30, 0x67, 0x67, 0x66, 0x78, 0x72, 0x6d, 0x51, 0x30, 0x36, 0x48, 0x75, 0x5a, + 0x44, 0x77, 0x35, 0x6b, 0x53, 0x78, 0x41, 0x41, 0x73, 0x76, 0x36, 0x56, 0x4c, 0x4b, 0x53, 0x4a, 0x4c, 0x41, + 0x49, 0x74, 0x41, 0x38, 0x45, 0x2b, 0x71, 0x34, 0x35, 0x47, 0x6c, 0x63, 0x73, 0x35, 0x43, 0x76, 0x59, 0x77, + 0x36, 0x63, 0x51, 0x32, 0x69, 0x59, 0x4d, 0x57, 0x68, 0x47, 0x62, 0x45, 0x6f, 0x50, 0x63, 0x48, 0x38, 0x71, + 0x37, 0x6b, 0x72, 0x48, 0x7a, 0x62, 0x5c, 0x0a, + 0x09, 0x09, 0x75, 0x6f, 0x32, 0x65, 0x6c, 0x53, 0x51, 0x41, 0x44, 0x35, 0x53, 0x35, 0x58, 0x58, 0x34, 0x53, + 0x47, 0x75, 0x66, 0x4b, 0x6f, 0x46, 0x77, 0x4c, 0x41, 0x57, 0x2f, 0x64, 0x4a, 0x57, 0x79, 0x79, 0x49, 0x4c, + 0x51, 0x6d, 0x44, 0x48, 0x36, 0x62, 0x6d, 0x38, 0x79, 0x6b, 0x63, 0x7a, 0x69, 0x54, 0x6c, 0x61, 0x6f, 0x41, + 0x36, 0x49, 0x70, 0x59, 0x35, 0x49, 0x72, 0x49, 0x56, 0x47, 0x50, 0x55, 0x68, 0x62, 0x73, 0x77, 0x51, 0x64, + 0x44, 0x37, 0x43, 0x30, 0x55, 0x75, 0x5c, 0x0a, + 0x09, 0x09, 0x35, 0x62, 0x67, 0x68, 0x32, 0x68, 0x4c, 0x68, 0x42, 0x6a, 0x75, 0x45, 0x78, 0x71, 0x67, 0x42, + 0x78, 0x6f, 0x44, 0x31, 0x72, 0x32, 0x53, 0x6f, 0x45, 0x35, 0x71, 0x6f, 0x6a, 0x48, 0x51, 0x62, 0x50, 0x53, + 0x31, 0x42, 0x41, 0x4c, 0x4a, 0x69, 0x2f, 0x34, 0x6d, 0x36, 0x47, 0x72, 0x50, 0x34, 0x67, 0x6f, 0x4d, 0x2b, + 0x71, 0x77, 0x4e, 0x4d, 0x55, 0x6d, 0x6b, 0x45, 0x33, 0x45, 0x46, 0x37, 0x52, 0x46, 0x75, 0x73, 0x63, 0x4e, + 0x33, 0x6b, 0x52, 0x59, 0x79, 0x39, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x63, 0x47, 0x30, 0x42, 0x63, 0x42, 0x31, 0x2b, 0x2b, 0x39, 0x76, 0x49, 0x36, 0x34, 0x50, + 0x43, 0x33, 0x77, 0x45, 0x76, 0x62, 0x68, 0x55, 0x59, 0x57, 0x4f, 0x55, 0x4d, 0x2b, 0x42, 0x5a, 0x67, 0x43, + 0x73, 0x5a, 0x36, 0x70, 0x69, 0x47, 0x43, 0x71, 0x4e, 0x75, 0x73, 0x30, 0x75, 0x70, 0x43, 0x51, 0x41, 0x58, + 0x39, 0x43, 0x33, 0x48, 0x41, 0x33, 0x2f, 0x67, 0x2b, 0x51, 0x45, 0x36, 0x36, 0x45, 0x76, 0x71, 0x61, 0x49, + 0x41, 0x4a, 0x51, 0x53, 0x2f, 0x58, 0x5c, 0x0a, + 0x09, 0x09, 0x47, 0x57, 0x78, 0x6f, 0x49, 0x57, 0x69, 0x4d, 0x53, 0x41, 0x38, 0x71, 0x58, 0x49, 0x65, 0x5a, + 0x54, 0x41, 0x39, 0x30, 0x32, 0x79, 0x32, 0x6b, 0x4b, 0x51, 0x42, 0x30, 0x7a, 0x4e, 0x65, 0x31, 0x6a, 0x41, + 0x58, 0x2b, 0x59, 0x71, 0x43, 0x33, 0x42, 0x2b, 0x37, 0x55, 0x4b, 0x61, 0x56, 0x76, 0x31, 0x77, 0x65, 0x6c, + 0x43, 0x44, 0x48, 0x50, 0x6f, 0x70, 0x54, 0x4f, 0x77, 0x74, 0x4e, 0x2f, 0x38, 0x66, 0x76, 0x4e, 0x74, 0x41, + 0x54, 0x41, 0x70, 0x66, 0x78, 0x2f, 0x5c, 0x0a, + 0x09, 0x09, 0x61, 0x4f, 0x42, 0x7a, 0x62, 0x31, 0x2f, 0x4a, 0x61, 0x41, 0x50, 0x4a, 0x5a, 0x59, 0x71, 0x67, + 0x68, 0x61, 0x41, 0x2b, 0x59, 0x70, 0x78, 0x67, 0x4e, 0x55, 0x50, 0x31, 0x76, 0x4b, 0x49, 0x46, 0x6f, 0x4a, + 0x61, 0x57, 0x41, 0x45, 0x6a, 0x65, 0x2b, 0x54, 0x64, 0x4a, 0x34, 0x4a, 0x63, 0x35, 0x36, 0x43, 0x75, 0x49, + 0x6d, 0x38, 0x7a, 0x52, 0x35, 0x72, 0x47, 0x43, 0x32, 0x71, 0x43, 0x78, 0x67, 0x67, 0x77, 0x4a, 0x51, 0x55, + 0x30, 0x4c, 0x77, 0x45, 0x70, 0x61, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x6e, 0x44, 0x67, 0x63, 0x4f, 0x42, 0x54, 0x35, 0x5a, 0x63, 0x52, 0x4a, 0x37, 0x6c, 0x49, + 0x44, 0x37, 0x79, 0x74, 0x74, 0x55, 0x50, 0x53, 0x67, 0x77, 0x71, 0x6e, 0x73, 0x61, 0x36, 0x4f, 0x45, 0x54, + 0x53, 0x31, 0x41, 0x43, 0x77, 0x6b, 0x4c, 0x67, 0x44, 0x43, 0x6c, 0x2f, 0x38, 0x4f, 0x33, 0x45, 0x4b, 0x70, + 0x41, 0x7a, 0x39, 0x72, 0x39, 0x67, 0x2b, 0x45, 0x6f, 0x7a, 0x35, 0x49, 0x43, 0x41, 0x4a, 0x6a, 0x42, 0x43, + 0x34, 0x4f, 0x46, 0x71, 0x59, 0x6d, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x42, 0x52, 0x4d, 0x36, 0x78, 0x49, 0x72, 0x75, 0x48, 0x63, 0x36, 0x44, 0x34, 0x45, 0x50, + 0x51, 0x67, 0x72, 0x42, 0x61, 0x68, 0x59, 0x46, 0x59, 0x4e, 0x72, 0x77, 0x4c, 0x35, 0x59, 0x55, 0x54, 0x45, + 0x33, 0x56, 0x58, 0x62, 0x37, 0x62, 0x47, 0x6d, 0x44, 0x31, 0x72, 0x79, 0x6b, 0x73, 0x79, 0x77, 0x58, 0x48, + 0x6f, 0x51, 0x36, 0x68, 0x6f, 0x74, 0x76, 0x48, 0x4d, 0x53, 0x46, 0x67, 0x78, 0x33, 0x68, 0x56, 0x43, 0x30, + 0x47, 0x64, 0x52, 0x61, 0x43, 0x53, 0x5c, 0x0a, + 0x09, 0x09, 0x70, 0x54, 0x2f, 0x61, 0x74, 0x41, 0x4e, 0x49, 0x2b, 0x39, 0x52, 0x66, 0x67, 0x69, 0x71, 0x75, + 0x37, 0x36, 0x41, 0x45, 0x35, 0x50, 0x67, 0x67, 0x4a, 0x47, 0x74, 0x71, 0x77, 0x47, 0x41, 0x68, 0x70, 0x37, + 0x6e, 0x53, 0x4f, 0x35, 0x43, 0x4a, 0x48, 0x55, 0x43, 0x57, 0x62, 0x67, 0x66, 0x32, 0x4e, 0x2b, 0x79, 0x63, + 0x44, 0x51, 0x59, 0x2f, 0x54, 0x65, 0x66, 0x70, 0x5a, 0x35, 0x33, 0x48, 0x4a, 0x68, 0x44, 0x38, 0x59, 0x46, + 0x4b, 0x38, 0x2b, 0x79, 0x51, 0x34, 0x5c, 0x0a, + 0x09, 0x09, 0x56, 0x54, 0x79, 0x45, 0x32, 0x70, 0x5a, 0x2b, 0x35, 0x71, 0x6d, 0x54, 0x34, 0x54, 0x62, 0x6e, + 0x4e, 0x4b, 0x59, 0x46, 0x49, 0x4b, 0x30, 0x41, 0x49, 0x33, 0x74, 0x47, 0x67, 0x56, 0x2f, 0x72, 0x36, 0x66, + 0x57, 0x76, 0x71, 0x75, 0x36, 0x71, 0x78, 0x41, 0x72, 0x61, 0x4d, 0x34, 0x67, 0x41, 0x35, 0x66, 0x2f, 0x72, + 0x75, 0x68, 0x33, 0x64, 0x59, 0x67, 0x63, 0x5a, 0x46, 0x41, 0x4b, 0x76, 0x7a, 0x61, 0x6e, 0x75, 0x34, 0x4c, + 0x4b, 0x7a, 0x54, 0x44, 0x74, 0x65, 0x5c, 0x0a, + 0x09, 0x09, 0x51, 0x61, 0x50, 0x73, 0x2f, 0x72, 0x72, 0x43, 0x41, 0x42, 0x38, 0x77, 0x41, 0x39, 0x6e, 0x39, + 0x4c, 0x52, 0x34, 0x66, 0x57, 0x50, 0x48, 0x54, 0x41, 0x68, 0x34, 0x66, 0x57, 0x4e, 0x46, 0x70, 0x77, 0x61, + 0x61, 0x77, 0x74, 0x4b, 0x43, 0x64, 0x75, 0x41, 0x50, 0x67, 0x4e, 0x64, 0x5a, 0x4a, 0x55, 0x68, 0x74, 0x67, + 0x39, 0x32, 0x66, 0x31, 0x63, 0x34, 0x33, 0x74, 0x50, 0x6f, 0x49, 0x66, 0x6d, 0x4b, 0x62, 0x43, 0x61, 0x63, + 0x48, 0x69, 0x6b, 0x4c, 0x52, 0x67, 0x5c, 0x0a, + 0x09, 0x09, 0x54, 0x63, 0x6a, 0x6e, 0x2f, 0x43, 0x43, 0x4e, 0x46, 0x43, 0x43, 0x70, 0x67, 0x50, 0x4e, 0x50, + 0x36, 0x46, 0x6e, 0x70, 0x36, 0x66, 0x57, 0x70, 0x55, 0x75, 0x67, 0x4d, 0x77, 0x6d, 0x57, 0x30, 0x55, 0x32, + 0x41, 0x35, 0x4c, 0x62, 0x69, 0x68, 0x32, 0x39, 0x73, 0x4e, 0x50, 0x76, 0x41, 0x6c, 0x4b, 0x41, 0x53, 0x55, + 0x63, 0x73, 0x36, 0x48, 0x36, 0x59, 0x45, 0x7a, 0x34, 0x77, 0x41, 0x53, 0x67, 0x71, 0x62, 0x30, 0x35, 0x6f, + 0x66, 0x30, 0x2b, 0x6a, 0x64, 0x55, 0x5c, 0x0a, + 0x09, 0x09, 0x76, 0x67, 0x35, 0x2f, 0x41, 0x4f, 0x6d, 0x79, 0x4f, 0x4d, 0x51, 0x4e, 0x74, 0x46, 0x67, 0x45, + 0x47, 0x68, 0x41, 0x41, 0x73, 0x39, 0x53, 0x35, 0x35, 0x32, 0x2f, 0x33, 0x35, 0x50, 0x71, 0x33, 0x30, 0x4f, + 0x73, 0x44, 0x53, 0x57, 0x36, 0x41, 0x78, 0x67, 0x5a, 0x6f, 0x54, 0x33, 0x35, 0x61, 0x4b, 0x63, 0x47, 0x77, + 0x75, 0x77, 0x4a, 0x73, 0x43, 0x30, 0x44, 0x5a, 0x34, 0x74, 0x39, 0x45, 0x30, 0x33, 0x76, 0x56, 0x34, 0x44, + 0x4a, 0x65, 0x48, 0x75, 0x46, 0x48, 0x5c, 0x0a, + 0x09, 0x09, 0x72, 0x67, 0x2b, 0x6b, 0x75, 0x49, 0x46, 0x62, 0x66, 0x45, 0x68, 0x4d, 0x62, 0x30, 0x71, 0x51, + 0x39, 0x48, 0x52, 0x68, 0x71, 0x50, 0x52, 0x44, 0x75, 0x67, 0x50, 0x77, 0x38, 0x2f, 0x31, 0x61, 0x6a, 0x2b, + 0x57, 0x6e, 0x77, 0x46, 0x39, 0x46, 0x75, 0x77, 0x4f, 0x43, 0x4b, 0x4c, 0x45, 0x49, 0x4c, 0x50, 0x65, 0x49, + 0x67, 0x4f, 0x64, 0x63, 0x45, 0x78, 0x53, 0x42, 0x56, 0x6c, 0x59, 0x45, 0x77, 0x44, 0x2b, 0x54, 0x50, 0x35, + 0x6a, 0x76, 0x6b, 0x38, 0x4c, 0x65, 0x5c, 0x0a, + 0x09, 0x09, 0x56, 0x56, 0x6a, 0x51, 0x41, 0x2b, 0x52, 0x79, 0x6a, 0x52, 0x61, 0x65, 0x39, 0x61, 0x51, 0x45, + 0x4c, 0x52, 0x61, 0x42, 0x64, 0x67, 0x4b, 0x2f, 0x66, 0x7a, 0x73, 0x4c, 0x41, 0x75, 0x41, 0x48, 0x66, 0x79, + 0x73, 0x51, 0x2f, 0x42, 0x58, 0x4f, 0x39, 0x7a, 0x48, 0x51, 0x42, 0x36, 0x52, 0x44, 0x62, 0x58, 0x57, 0x4c, + 0x44, 0x35, 0x55, 0x4a, 0x69, 0x73, 0x42, 0x38, 0x32, 0x42, 0x34, 0x36, 0x41, 0x6b, 0x33, 0x58, 0x42, 0x59, + 0x41, 0x4f, 0x34, 0x70, 0x7a, 0x76, 0x5c, 0x0a, + 0x09, 0x09, 0x79, 0x66, 0x64, 0x70, 0x55, 0x63, 0x38, 0x36, 0x32, 0x68, 0x56, 0x77, 0x69, 0x44, 0x6c, 0x4f, + 0x43, 0x63, 0x6f, 0x42, 0x45, 0x65, 0x69, 0x77, 0x45, 0x37, 0x41, 0x6c, 0x41, 0x70, 0x32, 0x77, 0x46, 0x39, + 0x67, 0x55, 0x42, 0x51, 0x5a, 0x2f, 0x74, 0x53, 0x66, 0x66, 0x76, 0x36, 0x47, 0x77, 0x6c, 0x42, 0x65, 0x34, + 0x79, 0x53, 0x77, 0x37, 0x67, 0x55, 0x70, 0x43, 0x49, 0x74, 0x41, 0x4d, 0x2b, 0x77, 0x5a, 0x4a, 0x41, 0x72, + 0x44, 0x57, 0x47, 0x2f, 0x79, 0x71, 0x5c, 0x0a, + 0x09, 0x09, 0x4f, 0x38, 0x71, 0x50, 0x67, 0x7a, 0x69, 0x42, 0x36, 0x36, 0x7a, 0x7a, 0x72, 0x4a, 0x56, 0x74, + 0x45, 0x64, 0x68, 0x32, 0x56, 0x51, 0x43, 0x71, 0x2f, 0x70, 0x56, 0x47, 0x48, 0x50, 0x78, 0x7a, 0x48, 0x50, + 0x7a, 0x59, 0x73, 0x77, 0x2b, 0x79, 0x77, 0x69, 0x71, 0x6e, 0x73, 0x6a, 0x5a, 0x46, 0x6f, 0x4f, 0x47, 0x69, + 0x41, 0x42, 0x79, 0x37, 0x32, 0x68, 0x6a, 0x42, 0x44, 0x7a, 0x4a, 0x4d, 0x78, 0x61, 0x49, 0x49, 0x74, 0x45, + 0x62, 0x64, 0x58, 0x69, 0x56, 0x56, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x49, 0x59, 0x46, 0x50, 0x30, 0x62, 0x36, 0x41, 0x55, 0x51, 0x67, 0x48, 0x42, 0x74, 0x52, + 0x33, 0x6c, 0x52, 0x45, 0x38, 0x41, 0x4f, 0x51, 0x43, 0x52, 0x46, 0x6f, 0x75, 0x43, 0x51, 0x41, 0x64, 0x51, + 0x51, 0x2f, 0x67, 0x41, 0x67, 0x59, 0x45, 0x34, 0x46, 0x49, 0x39, 0x6a, 0x38, 0x74, 0x41, 0x65, 0x69, 0x64, + 0x36, 0x6b, 0x50, 0x77, 0x41, 0x34, 0x6a, 0x41, 0x6b, 0x51, 0x6a, 0x51, 0x4a, 0x71, 0x4b, 0x77, 0x79, 0x34, + 0x59, 0x33, 0x6f, 0x6e, 0x36, 0x41, 0x5c, 0x0a, + 0x09, 0x09, 0x70, 0x41, 0x57, 0x67, 0x4f, 0x57, 0x43, 0x71, 0x44, 0x39, 0x74, 0x34, 0x41, 0x55, 0x54, 0x67, + 0x53, 0x41, 0x54, 0x61, 0x4b, 0x76, 0x7a, 0x65, 0x67, 0x59, 0x59, 0x45, 0x41, 0x52, 0x68, 0x6e, 0x51, 0x56, + 0x71, 0x73, 0x62, 0x73, 0x48, 0x67, 0x78, 0x32, 0x34, 0x2b, 0x41, 0x4c, 0x6f, 0x69, 0x73, 0x42, 0x77, 0x51, + 0x67, 0x57, 0x4f, 0x78, 0x4d, 0x69, 0x37, 0x34, 0x6f, 0x39, 0x72, 0x2f, 0x4a, 0x41, 0x57, 0x41, 0x31, 0x4b, + 0x7a, 0x61, 0x63, 0x79, 0x73, 0x50, 0x5c, 0x0a, + 0x09, 0x09, 0x39, 0x66, 0x79, 0x59, 0x36, 0x67, 0x4f, 0x67, 0x79, 0x37, 0x57, 0x65, 0x46, 0x59, 0x4e, 0x4e, + 0x31, 0x64, 0x31, 0x4b, 0x62, 0x4d, 0x33, 0x2b, 0x4a, 0x35, 0x6b, 0x43, 0x56, 0x48, 0x73, 0x32, 0x39, 0x70, + 0x44, 0x6c, 0x4b, 0x61, 0x50, 0x4f, 0x41, 0x65, 0x67, 0x54, 0x67, 0x62, 0x6d, 0x41, 0x43, 0x4e, 0x54, 0x56, + 0x36, 0x46, 0x4f, 0x48, 0x32, 0x2f, 0x70, 0x37, 0x47, 0x74, 0x49, 0x46, 0x6f, 0x42, 0x62, 0x38, 0x6b, 0x4b, + 0x78, 0x79, 0x46, 0x64, 0x51, 0x31, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x48, 0x33, 0x34, 0x65, 0x77, 0x65, 0x43, 0x57, 0x34, 0x6e, 0x70, 0x37, 0x4d, 0x75, 0x6d, + 0x6a, 0x64, 0x34, 0x2f, 0x69, 0x52, 0x53, 0x67, 0x46, 0x54, 0x79, 0x38, 0x6b, 0x39, 0x55, 0x4e, 0x75, 0x2f, + 0x6f, 0x41, 0x47, 0x43, 0x4d, 0x43, 0x50, 0x66, 0x2b, 0x32, 0x4e, 0x43, 0x53, 0x2b, 0x61, 0x6d, 0x49, 0x45, + 0x59, 0x4d, 0x42, 0x41, 0x52, 0x43, 0x65, 0x59, 0x77, 0x77, 0x52, 0x47, 0x2f, 0x41, 0x45, 0x41, 0x6f, 0x35, + 0x6e, 0x6a, 0x67, 0x32, 0x37, 0x39, 0x5c, 0x0a, + 0x09, 0x09, 0x32, 0x50, 0x4b, 0x6e, 0x42, 0x34, 0x50, 0x55, 0x65, 0x32, 0x2b, 0x36, 0x6c, 0x70, 0x59, 0x43, + 0x72, 0x50, 0x58, 0x73, 0x54, 0x63, 0x5a, 0x46, 0x48, 0x51, 0x42, 0x4d, 0x7a, 0x6e, 0x4c, 0x77, 0x78, 0x47, + 0x47, 0x4f, 0x70, 0x65, 0x42, 0x52, 0x2b, 0x45, 0x59, 0x4f, 0x48, 0x44, 0x55, 0x74, 0x41, 0x4f, 0x32, 0x41, + 0x39, 0x51, 0x2b, 0x65, 0x34, 0x30, 0x64, 0x54, 0x48, 0x4e, 0x6a, 0x57, 0x43, 0x30, 0x41, 0x34, 0x65, 0x6f, + 0x38, 0x57, 0x71, 0x2f, 0x46, 0x34, 0x5c, 0x0a, + 0x09, 0x09, 0x51, 0x44, 0x33, 0x4f, 0x31, 0x46, 0x2b, 0x51, 0x61, 0x51, 0x73, 0x43, 0x55, 0x41, 0x6f, 0x71, + 0x46, 0x52, 0x2b, 0x4c, 0x68, 0x41, 0x4d, 0x38, 0x41, 0x59, 0x67, 0x32, 0x48, 0x6b, 0x42, 0x70, 0x63, 0x2f, + 0x43, 0x6d, 0x33, 0x36, 0x72, 0x4a, 0x58, 0x32, 0x44, 0x61, 0x41, 0x58, 0x52, 0x59, 0x6e, 0x5a, 0x71, 0x42, + 0x66, 0x38, 0x4e, 0x4b, 0x50, 0x77, 0x43, 0x69, 0x55, 0x2b, 0x35, 0x5a, 0x4a, 0x4e, 0x51, 0x32, 0x31, 0x66, + 0x76, 0x62, 0x45, 0x49, 0x44, 0x62, 0x5c, 0x0a, + 0x09, 0x09, 0x77, 0x64, 0x79, 0x45, 0x50, 0x7a, 0x67, 0x57, 0x2b, 0x77, 0x41, 0x51, 0x6a, 0x39, 0x58, 0x67, + 0x41, 0x61, 0x4d, 0x6d, 0x4b, 0x52, 0x77, 0x63, 0x48, 0x49, 0x52, 0x37, 0x51, 0x36, 0x45, 0x77, 0x30, 0x66, + 0x66, 0x78, 0x42, 0x38, 0x59, 0x70, 0x76, 0x67, 0x43, 0x59, 0x6f, 0x58, 0x48, 0x6d, 0x35, 0x76, 0x4b, 0x6b, + 0x79, 0x34, 0x50, 0x56, 0x70, 0x48, 0x46, 0x74, 0x63, 0x78, 0x62, 0x67, 0x47, 0x6f, 0x49, 0x66, 0x41, 0x47, + 0x4d, 0x73, 0x42, 0x6b, 0x38, 0x59, 0x5c, 0x0a, + 0x09, 0x09, 0x6c, 0x70, 0x6f, 0x43, 0x2b, 0x4c, 0x30, 0x2f, 0x66, 0x56, 0x43, 0x4d, 0x2b, 0x67, 0x4e, 0x67, + 0x6c, 0x6e, 0x55, 0x6e, 0x42, 0x45, 0x42, 0x68, 0x74, 0x52, 0x38, 0x41, 0x4e, 0x69, 0x67, 0x46, 0x54, 0x78, + 0x63, 0x57, 0x4b, 0x51, 0x43, 0x38, 0x31, 0x72, 0x2b, 0x45, 0x75, 0x67, 0x4c, 0x41, 0x43, 0x6c, 0x65, 0x43, + 0x61, 0x77, 0x4d, 0x6b, 0x4f, 0x67, 0x44, 0x4d, 0x2b, 0x51, 0x4e, 0x67, 0x44, 0x77, 0x72, 0x2b, 0x5a, 0x5a, + 0x45, 0x43, 0x67, 0x4e, 0x34, 0x66, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x4c, 0x64, 0x63, 0x67, 0x47, 0x6b, 0x48, 0x67, 0x4e, 0x34, 0x66, 0x41, 0x49, 0x64, 0x63, + 0x67, 0x44, 0x45, 0x42, 0x51, 0x4f, 0x38, 0x50, 0x67, 0x48, 0x73, 0x75, 0x77, 0x4b, 0x51, 0x44, 0x51, 0x4f, + 0x38, 0x50, 0x51, 0x4c, 0x49, 0x75, 0x6f, 0x43, 0x4a, 0x43, 0x41, 0x48, 0x6a, 0x65, 0x48, 0x37, 0x30, 0x2f, + 0x41, 0x41, 0x6d, 0x37, 0x41, 0x43, 0x6b, 0x4f, 0x34, 0x41, 0x72, 0x71, 0x41, 0x6f, 0x44, 0x45, 0x4b, 0x51, + 0x58, 0x50, 0x44, 0x45, 0x68, 0x46, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x48, 0x6a, 0x4e, 0x50, 0x31, 0x62, 0x39, 0x41, 0x5a, 0x41, 0x4f, 0x6c, 0x39, 0x4e, 0x32, + 0x41, 0x41, 0x68, 0x2b, 0x41, 0x4e, 0x4a, 0x6a, 0x4d, 0x63, 0x35, 0x67, 0x6f, 0x41, 0x6b, 0x42, 0x75, 0x49, + 0x77, 0x36, 0x41, 0x43, 0x42, 0x56, 0x4b, 0x71, 0x6b, 0x49, 0x41, 0x4e, 0x74, 0x2f, 0x37, 0x50, 0x63, 0x48, + 0x77, 0x4e, 0x45, 0x30, 0x49, 0x4b, 0x34, 0x44, 0x67, 0x50, 0x30, 0x48, 0x49, 0x48, 0x33, 0x6d, 0x6f, 0x68, + 0x34, 0x59, 0x45, 0x6c, 0x63, 0x41, 0x5c, 0x0a, + 0x09, 0x09, 0x59, 0x50, 0x38, 0x42, 0x6b, 0x45, 0x45, 0x35, 0x55, 0x51, 0x48, 0x67, 0x67, 0x51, 0x66, 0x59, + 0x66, 0x77, 0x42, 0x6b, 0x63, 0x43, 0x6c, 0x70, 0x42, 0x77, 0x44, 0x37, 0x44, 0x30, 0x42, 0x65, 0x48, 0x59, + 0x44, 0x6d, 0x41, 0x73, 0x6f, 0x63, 0x41, 0x44, 0x48, 0x4d, 0x52, 0x6a, 0x6b, 0x79, 0x4c, 0x49, 0x34, 0x41, + 0x6c, 0x46, 0x48, 0x6d, 0x41, 0x4c, 0x6a, 0x74, 0x41, 0x69, 0x49, 0x4a, 0x41, 0x4f, 0x66, 0x2f, 0x4a, 0x5a, + 0x51, 0x33, 0x41, 0x4b, 0x49, 0x34, 0x5c, 0x0a, + 0x09, 0x09, 0x6e, 0x35, 0x51, 0x44, 0x77, 0x4f, 0x41, 0x66, 0x41, 0x50, 0x4b, 0x59, 0x53, 0x30, 0x6f, 0x41, + 0x59, 0x50, 0x38, 0x42, 0x6b, 0x45, 0x63, 0x70, 0x37, 0x4c, 0x4c, 0x67, 0x71, 0x41, 0x4a, 0x77, 0x48, 0x6d, + 0x55, 0x4e, 0x67, 0x50, 0x73, 0x75, 0x49, 0x4b, 0x6f, 0x41, 0x34, 0x4d, 0x49, 0x50, 0x41, 0x48, 0x49, 0x73, + 0x41, 0x45, 0x67, 0x42, 0x41, 0x4a, 0x43, 0x4a, 0x33, 0x52, 0x54, 0x41, 0x35, 0x4a, 0x6e, 0x6b, 0x41, 0x41, + 0x44, 0x6a, 0x58, 0x4c, 0x41, 0x71, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x41, 0x6f, 0x7a, 0x41, 0x41, 0x42, 0x6b, 0x68, 0x69, 0x4b, 0x4b, 0x41, 0x41, 0x43, 0x4d, + 0x41, 0x59, 0x53, 0x68, 0x68, 0x44, 0x49, 0x47, 0x49, 0x4b, 0x64, 0x6a, 0x41, 0x42, 0x41, 0x41, 0x41, 0x4a, + 0x41, 0x43, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x51, 0x41, 0x78, 0x68, + 0x74, 0x67, 0x56, 0x44, 0x41, 0x41, 0x43, 0x41, 0x41, 0x77, 0x41, 0x41, 0x5a, 0x49, 0x67, 0x57, 0x42, 0x41, + 0x43, 0x41, 0x6e, 0x48, 0x4c, 0x6d, 0x5c, 0x0a, + 0x09, 0x09, 0x35, 0x6e, 0x49, 0x48, 0x41, 0x67, 0x41, 0x41, 0x73, 0x43, 0x49, 0x41, 0x48, 0x52, 0x51, 0x62, + 0x41, 0x50, 0x6b, 0x56, 0x67, 0x42, 0x61, 0x4b, 0x44, 0x59, 0x44, 0x38, 0x43, 0x67, 0x41, 0x41, 0x51, 0x43, + 0x35, 0x4e, 0x32, 0x77, 0x4c, 0x51, 0x52, 0x68, 0x6b, 0x44, 0x6b, 0x46, 0x4d, 0x48, 0x63, 0x4f, 0x62, 0x6d, + 0x4d, 0x67, 0x51, 0x41, 0x41, 0x4c, 0x6d, 0x45, 0x53, 0x74, 0x47, 0x6e, 0x49, 0x2f, 0x34, 0x53, 0x45, 0x6f, + 0x45, 0x53, 0x79, 0x74, 0x6f, 0x64, 0x5c, 0x0a, + 0x09, 0x09, 0x43, 0x71, 0x65, 0x66, 0x55, 0x49, 0x57, 0x5a, 0x71, 0x65, 0x50, 0x2f, 0x39, 0x75, 0x52, 0x4a, + 0x56, 0x54, 0x68, 0x31, 0x63, 0x75, 0x68, 0x37, 0x39, 0x75, 0x39, 0x2f, 0x31, 0x76, 0x39, 0x76, 0x44, 0x37, + 0x35, 0x53, 0x36, 0x74, 0x46, 0x6a, 0x46, 0x4b, 0x68, 0x63, 0x50, 0x6f, 0x55, 0x41, 0x35, 0x4d, 0x33, 0x47, + 0x50, 0x66, 0x2b, 0x55, 0x55, 0x69, 0x65, 0x6d, 0x56, 0x66, 0x48, 0x4d, 0x45, 0x2f, 0x70, 0x31, 0x79, 0x67, + 0x74, 0x32, 0x37, 0x39, 0x2f, 0x70, 0x5c, 0x0a, + 0x09, 0x09, 0x74, 0x53, 0x66, 0x6f, 0x77, 0x7a, 0x44, 0x31, 0x35, 0x6f, 0x73, 0x6a, 0x2f, 0x2f, 0x2b, 0x42, + 0x46, 0x6f, 0x4d, 0x44, 0x45, 0x6f, 0x50, 0x64, 0x50, 0x66, 0x33, 0x31, 0x51, 0x2f, 0x33, 0x31, 0x58, 0x76, + 0x66, 0x66, 0x76, 0x6e, 0x69, 0x6b, 0x44, 0x72, 0x37, 0x38, 0x47, 0x68, 0x58, 0x6a, 0x77, 0x42, 0x68, 0x41, + 0x56, 0x41, 0x48, 0x59, 0x56, 0x6a, 0x67, 0x58, 0x4d, 0x4a, 0x56, 0x41, 0x39, 0x33, 0x70, 0x74, 0x36, 0x73, + 0x33, 0x31, 0x45, 0x7a, 0x66, 0x41, 0x5c, 0x0a, + 0x09, 0x09, 0x6a, 0x62, 0x67, 0x4b, 0x2f, 0x7a, 0x39, 0x65, 0x50, 0x6a, 0x31, 0x59, 0x49, 0x4c, 0x51, 0x51, + 0x6b, 0x44, 0x69, 0x51, 0x6d, 0x34, 0x42, 0x37, 0x53, 0x49, 0x52, 0x32, 0x45, 0x67, 0x4b, 0x41, 0x63, 0x51, + 0x44, 0x62, 0x77, 0x63, 0x57, 0x42, 0x37, 0x67, 0x55, 0x39, 0x76, 0x7a, 0x71, 0x5a, 0x64, 0x70, 0x42, 0x49, + 0x61, 0x58, 0x48, 0x77, 0x33, 0x55, 0x52, 0x58, 0x45, 0x4c, 0x37, 0x53, 0x67, 0x76, 0x43, 0x35, 0x39, 0x39, + 0x44, 0x58, 0x77, 0x42, 0x78, 0x68, 0x5c, 0x0a, + 0x09, 0x09, 0x78, 0x2b, 0x69, 0x69, 0x43, 0x67, 0x44, 0x57, 0x41, 0x74, 0x6a, 0x6f, 0x34, 0x58, 0x57, 0x67, + 0x55, 0x4b, 0x44, 0x37, 0x51, 0x5a, 0x39, 0x5a, 0x59, 0x64, 0x4e, 0x50, 0x30, 0x58, 0x63, 0x4d, 0x32, 0x68, + 0x48, 0x73, 0x2f, 0x2f, 0x4b, 0x7a, 0x72, 0x69, 0x42, 0x38, 0x31, 0x45, 0x48, 0x71, 0x6b, 0x4b, 0x44, 0x39, + 0x6a, 0x79, 0x77, 0x41, 0x57, 0x6d, 0x56, 0x61, 0x4f, 0x78, 0x64, 0x72, 0x74, 0x43, 0x4c, 0x51, 0x36, 0x67, + 0x6e, 0x42, 0x44, 0x2f, 0x63, 0x66, 0x5c, 0x0a, + 0x09, 0x09, 0x71, 0x5a, 0x39, 0x38, 0x65, 0x55, 0x63, 0x2f, 0x2f, 0x36, 0x66, 0x75, 0x50, 0x64, 0x6f, 0x35, + 0x2f, 0x68, 0x6d, 0x6d, 0x54, 0x36, 0x6c, 0x7a, 0x33, 0x33, 0x78, 0x46, 0x76, 0x66, 0x33, 0x6b, 0x71, 0x2b, + 0x72, 0x6c, 0x6d, 0x54, 0x4e, 0x75, 0x56, 0x70, 0x65, 0x32, 0x37, 0x31, 0x4d, 0x55, 0x39, 0x4e, 0x2b, 0x65, + 0x50, 0x51, 0x71, 0x49, 0x76, 0x4b, 0x48, 0x4c, 0x77, 0x42, 0x4d, 0x2b, 0x2b, 0x76, 0x76, 0x66, 0x65, 0x73, + 0x55, 0x54, 0x41, 0x42, 0x4b, 0x43, 0x5c, 0x0a, + 0x09, 0x09, 0x78, 0x2b, 0x39, 0x2f, 0x34, 0x71, 0x51, 0x37, 0x6f, 0x44, 0x62, 0x37, 0x7a, 0x73, 0x4d, 0x50, + 0x76, 0x54, 0x62, 0x37, 0x33, 0x71, 0x38, 0x2f, 0x37, 0x6d, 0x75, 0x7a, 0x72, 0x35, 0x39, 0x38, 0x51, 0x62, + 0x31, 0x39, 0x36, 0x6c, 0x58, 0x76, 0x31, 0x51, 0x4c, 0x62, 0x69, 0x51, 0x68, 0x41, 0x51, 0x47, 0x30, 0x57, + 0x62, 0x52, 0x58, 0x6b, 0x50, 0x33, 0x35, 0x36, 0x57, 0x32, 0x31, 0x39, 0x2f, 0x72, 0x39, 0x65, 0x67, 0x51, + 0x35, 0x69, 0x5a, 0x2b, 0x38, 0x4c, 0x5c, 0x0a, + 0x09, 0x09, 0x31, 0x64, 0x54, 0x2f, 0x6e, 0x35, 0x36, 0x33, 0x6e, 0x33, 0x78, 0x4e, 0x2f, 0x66, 0x44, 0x30, + 0x39, 0x39, 0x51, 0x33, 0x69, 0x7a, 0x4d, 0x49, 0x2b, 0x67, 0x77, 0x34, 0x68, 0x4b, 0x6b, 0x33, 0x6e, 0x76, + 0x65, 0x65, 0x51, 0x7a, 0x46, 0x34, 0x39, 0x37, 0x34, 0x54, 0x7a, 0x6f, 0x41, 0x43, 0x2f, 0x2b, 0x39, 0x2f, + 0x39, 0x57, 0x38, 0x6a, 0x32, 0x2b, 0x78, 0x50, 0x39, 0x75, 0x35, 0x34, 0x6e, 0x64, 0x72, 0x72, 0x33, 0x33, + 0x68, 0x42, 0x2f, 0x63, 0x6e, 0x73, 0x5c, 0x0a, + 0x09, 0x09, 0x39, 0x30, 0x78, 0x33, 0x58, 0x71, 0x30, 0x6b, 0x42, 0x57, 0x44, 0x62, 0x68, 0x67, 0x42, 0x51, + 0x34, 0x66, 0x33, 0x4e, 0x4c, 0x2f, 0x2b, 0x70, 0x72, 0x38, 0x63, 0x66, 0x42, 0x52, 0x55, 0x6f, 0x46, 0x66, + 0x36, 0x66, 0x50, 0x2f, 0x65, 0x48, 0x59, 0x74, 0x30, 0x41, 0x57, 0x58, 0x71, 0x76, 0x59, 0x56, 0x50, 0x51, + 0x70, 0x7a, 0x68, 0x77, 0x35, 0x36, 0x77, 0x59, 0x61, 0x44, 0x64, 0x41, 0x51, 0x6b, 0x44, 0x4f, 0x51, 0x43, + 0x49, 0x55, 0x2b, 0x4e, 0x51, 0x4f, 0x5c, 0x0a, + 0x09, 0x09, 0x4a, 0x34, 0x58, 0x63, 0x41, 0x62, 0x56, 0x7a, 0x36, 0x72, 0x69, 0x6f, 0x41, 0x30, 0x73, 0x72, + 0x42, 0x53, 0x67, 0x6d, 0x2b, 0x63, 0x73, 0x6d, 0x49, 0x57, 0x7a, 0x77, 0x39, 0x77, 0x6f, 0x48, 0x71, 0x61, + 0x77, 0x6b, 0x70, 0x72, 0x37, 0x7a, 0x72, 0x44, 0x72, 0x78, 0x67, 0x7a, 0x66, 0x55, 0x7a, 0x4d, 0x58, 0x66, + 0x38, 0x72, 0x35, 0x47, 0x38, 0x45, 0x63, 0x58, 0x30, 0x4f, 0x6e, 0x66, 0x4f, 0x61, 0x74, 0x4f, 0x2f, 0x75, + 0x6c, 0x76, 0x71, 0x2b, 0x6c, 0x7a, 0x5c, 0x0a, + 0x09, 0x09, 0x4c, 0x33, 0x6e, 0x69, 0x34, 0x47, 0x72, 0x77, 0x42, 0x39, 0x73, 0x73, 0x76, 0x5a, 0x63, 0x36, + 0x4c, 0x78, 0x4f, 0x39, 0x66, 0x35, 0x68, 0x74, 0x77, 0x4c, 0x45, 0x46, 0x67, 0x4d, 0x59, 0x42, 0x6c, 0x4f, + 0x48, 0x5a, 0x67, 0x48, 0x39, 0x34, 0x38, 0x42, 0x2b, 0x52, 0x67, 0x6a, 0x39, 0x59, 0x6f, 0x48, 0x2f, 0x33, + 0x79, 0x5a, 0x61, 0x59, 0x77, 0x4a, 0x39, 0x5a, 0x50, 0x4f, 0x63, 0x31, 0x57, 0x68, 0x64, 0x48, 0x38, 0x45, + 0x57, 0x6e, 0x55, 0x47, 0x2b, 0x2b, 0x5c, 0x0a, + 0x09, 0x09, 0x65, 0x46, 0x69, 0x32, 0x61, 0x51, 0x74, 0x42, 0x4e, 0x39, 0x2b, 0x2f, 0x45, 0x31, 0x74, 0x41, + 0x68, 0x71, 0x55, 0x4e, 0x49, 0x64, 0x69, 0x4d, 0x38, 0x71, 0x61, 0x34, 0x6d, 0x34, 0x47, 0x4d, 0x75, 0x51, + 0x41, 0x2f, 0x70, 0x34, 0x38, 0x4c, 0x43, 0x55, 0x6a, 0x63, 0x43, 0x6a, 0x45, 0x56, 0x2b, 0x4a, 0x4a, 0x36, + 0x71, 0x53, 0x77, 0x53, 0x4c, 0x4f, 0x75, 0x30, 0x6e, 0x42, 0x56, 0x31, 0x57, 0x69, 0x62, 0x53, 0x58, 0x67, + 0x4d, 0x2f, 0x70, 0x35, 0x47, 0x47, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x47, 0x79, 0x61, 0x4b, 0x73, 0x69, 0x74, 0x7a, 0x33, 0x39, 0x71, 0x72, 0x46, 0x4b, 0x61, + 0x42, 0x6e, 0x39, 0x57, 0x47, 0x49, 0x74, 0x4b, 0x56, 0x68, 0x2b, 0x42, 0x6e, 0x34, 0x34, 0x51, 0x6e, 0x4c, + 0x78, 0x30, 0x33, 0x6b, 0x73, 0x4e, 0x6b, 0x6f, 0x51, 0x36, 0x47, 0x6c, 0x4d, 0x70, 0x4a, 0x2f, 0x32, 0x73, + 0x47, 0x43, 0x36, 0x67, 0x7a, 0x59, 0x34, 0x38, 0x57, 0x51, 0x48, 0x51, 0x76, 0x35, 0x52, 0x55, 0x78, 0x38, + 0x67, 0x42, 0x49, 0x59, 0x62, 0x79, 0x5c, 0x0a, + 0x09, 0x09, 0x6f, 0x45, 0x4d, 0x58, 0x6b, 0x4e, 0x68, 0x59, 0x67, 0x4f, 0x35, 0x35, 0x70, 0x74, 0x39, 0x36, + 0x78, 0x63, 0x76, 0x78, 0x59, 0x66, 0x56, 0x6c, 0x70, 0x41, 0x5a, 0x4a, 0x31, 0x63, 0x4e, 0x37, 0x76, 0x37, + 0x35, 0x76, 0x50, 0x4a, 0x31, 0x49, 0x73, 0x76, 0x63, 0x33, 0x34, 0x51, 0x43, 0x49, 0x75, 0x71, 0x6b, 0x55, + 0x77, 0x43, 0x54, 0x33, 0x64, 0x6e, 0x65, 0x73, 0x4e, 0x77, 0x42, 0x71, 0x61, 0x4e, 0x37, 0x67, 0x33, 0x68, + 0x76, 0x50, 0x49, 0x77, 0x43, 0x46, 0x5c, 0x0a, + 0x09, 0x09, 0x51, 0x4f, 0x37, 0x4c, 0x63, 0x32, 0x4a, 0x61, 0x6c, 0x4b, 0x30, 0x4c, 0x77, 0x4e, 0x63, 0x66, + 0x47, 0x2f, 0x31, 0x35, 0x4f, 0x33, 0x74, 0x66, 0x52, 0x6e, 0x33, 0x72, 0x52, 0x70, 0x6f, 0x43, 0x73, 0x43, + 0x47, 0x74, 0x49, 0x49, 0x6d, 0x66, 0x50, 0x33, 0x70, 0x67, 0x74, 0x66, 0x4c, 0x4a, 0x62, 0x6c, 0x4a, 0x44, + 0x67, 0x39, 0x30, 0x58, 0x6d, 0x68, 0x5a, 0x6f, 0x55, 0x53, 0x5a, 0x78, 0x74, 0x6c, 0x6b, 0x2f, 0x78, 0x6a, + 0x75, 0x74, 0x61, 0x41, 0x50, 0x67, 0x5c, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x6a, 0x32, 0x33, 0x34, 0x67, 0x41, 0x38, 0x43, 0x2f, 0x50, 0x7a, 0x39, 0x4a, 0x67, + 0x62, 0x54, 0x56, 0x50, 0x58, 0x48, 0x68, 0x74, 0x37, 0x45, 0x34, 0x35, 0x49, 0x4d, 0x41, 0x4e, 0x6e, 0x48, + 0x37, 0x43, 0x71, 0x64, 0x54, 0x73, 0x34, 0x55, 0x47, 0x6b, 0x4d, 0x59, 0x44, 0x72, 0x73, 0x56, 0x79, 0x73, + 0x6f, 0x63, 0x38, 0x65, 0x36, 0x30, 0x4f, 0x38, 0x66, 0x4d, 0x4c, 0x38, 0x34, 0x70, 0x30, 0x7a, 0x30, 0x30, + 0x39, 0x61, 0x43, 0x66, 0x34, 0x5a, 0x5c, 0x0a, + 0x09, 0x09, 0x33, 0x65, 0x74, 0x6a, 0x42, 0x5a, 0x39, 0x6a, 0x67, 0x71, 0x33, 0x72, 0x7a, 0x46, 0x75, 0x44, + 0x59, 0x62, 0x79, 0x4e, 0x6e, 0x54, 0x4c, 0x36, 0x38, 0x79, 0x49, 0x73, 0x44, 0x2b, 0x37, 0x45, 0x79, 0x66, + 0x39, 0x4e, 0x43, 0x6b, 0x43, 0x73, 0x77, 0x55, 0x42, 0x61, 0x77, 0x6d, 0x74, 0x36, 0x47, 0x65, 0x39, 0x4c, + 0x70, 0x6b, 0x57, 0x46, 0x67, 0x7a, 0x2b, 0x72, 0x6d, 0x33, 0x53, 0x79, 0x44, 0x73, 0x33, 0x4f, 0x6d, 0x42, + 0x59, 0x42, 0x30, 0x78, 0x31, 0x58, 0x5c, 0x0a, + 0x09, 0x09, 0x68, 0x45, 0x36, 0x72, 0x45, 0x57, 0x58, 0x78, 0x6a, 0x33, 0x45, 0x42, 0x34, 0x41, 0x38, 0x52, + 0x79, 0x77, 0x58, 0x51, 0x78, 0x68, 0x36, 0x54, 0x79, 0x6d, 0x78, 0x30, 0x53, 0x54, 0x43, 0x43, 0x48, 0x79, + 0x49, 0x77, 0x71, 0x4d, 0x66, 0x2b, 0x68, 0x74, 0x6e, 0x42, 0x33, 0x77, 0x67, 0x4f, 0x59, 0x43, 0x33, 0x75, + 0x37, 0x7a, 0x52, 0x35, 0x4b, 0x6e, 0x41, 0x39, 0x7a, 0x70, 0x74, 0x70, 0x68, 0x35, 0x51, 0x70, 0x76, 0x6d, + 0x39, 0x75, 0x62, 0x62, 0x58, 0x48, 0x5c, 0x0a, + 0x09, 0x09, 0x43, 0x5a, 0x72, 0x62, 0x52, 0x2f, 0x42, 0x6e, 0x51, 0x77, 0x54, 0x65, 0x65, 0x73, 0x56, 0x59, + 0x58, 0x64, 0x49, 0x61, 0x66, 0x6c, 0x50, 0x4f, 0x6c, 0x54, 0x59, 0x48, 0x68, 0x55, 0x77, 0x70, 0x36, 0x69, + 0x62, 0x4f, 0x35, 0x7a, 0x51, 0x6d, 0x41, 0x50, 0x78, 0x68, 0x49, 0x6f, 0x73, 0x41, 0x71, 0x5a, 0x38, 0x4a, + 0x46, 0x30, 0x43, 0x46, 0x57, 0x48, 0x37, 0x71, 0x75, 0x2b, 0x59, 0x61, 0x7a, 0x4c, 0x6d, 0x58, 0x6b, 0x50, + 0x4e, 0x6e, 0x62, 0x55, 0x7a, 0x67, 0x5c, 0x0a, + 0x09, 0x09, 0x77, 0x6d, 0x74, 0x47, 0x56, 0x67, 0x35, 0x53, 0x38, 0x43, 0x38, 0x38, 0x39, 0x5a, 0x74, 0x47, + 0x50, 0x68, 0x62, 0x74, 0x44, 0x41, 0x7a, 0x4a, 0x68, 0x6f, 0x6e, 0x66, 0x61, 0x2f, 0x70, 0x65, 0x67, 0x46, + 0x69, 0x57, 0x35, 0x4d, 0x2b, 0x65, 0x2b, 0x64, 0x33, 0x59, 0x69, 0x6d, 0x72, 0x69, 0x5a, 0x2f, 0x68, 0x34, + 0x4f, 0x2f, 0x67, 0x77, 0x32, 0x70, 0x38, 0x35, 0x61, 0x47, 0x70, 0x77, 0x2b, 0x6b, 0x30, 0x7a, 0x71, 0x77, + 0x62, 0x2f, 0x36, 0x4f, 0x6e, 0x7a, 0x5c, 0x0a, + 0x09, 0x09, 0x58, 0x75, 0x38, 0x64, 0x42, 0x39, 0x6f, 0x52, 0x47, 0x44, 0x4a, 0x6c, 0x70, 0x64, 0x79, 0x2f, + 0x4b, 0x55, 0x34, 0x41, 0x32, 0x41, 0x58, 0x55, 0x34, 0x69, 0x67, 0x71, 0x62, 0x65, 0x6d, 0x4e, 0x47, 0x73, + 0x41, 0x55, 0x2f, 0x43, 0x59, 0x50, 0x57, 0x6b, 0x68, 0x69, 0x4d, 0x51, 0x6c, 0x49, 0x42, 0x31, 0x6f, 0x6e, + 0x59, 0x47, 0x70, 0x36, 0x38, 0x45, 0x66, 0x50, 0x4c, 0x6b, 0x51, 0x65, 0x63, 0x36, 0x49, 0x30, 0x6f, 0x68, + 0x7a, 0x65, 0x52, 0x61, 0x79, 0x59, 0x5c, 0x0a, + 0x09, 0x09, 0x4b, 0x67, 0x63, 0x62, 0x4e, 0x77, 0x4f, 0x52, 0x43, 0x34, 0x67, 0x38, 0x4d, 0x6b, 0x6b, 0x46, + 0x75, 0x66, 0x62, 0x69, 0x44, 0x30, 0x4f, 0x70, 0x4b, 0x74, 0x6e, 0x2b, 0x76, 0x33, 0x72, 0x68, 0x6a, 0x30, + 0x33, 0x75, 0x71, 0x7a, 0x34, 0x38, 0x6d, 0x67, 0x74, 0x6b, 0x57, 0x41, 0x51, 0x4d, 0x75, 0x51, 0x43, 0x2f, + 0x34, 0x77, 0x6f, 0x54, 0x79, 0x50, 0x51, 0x65, 0x36, 0x72, 0x44, 0x6f, 0x43, 0x55, 0x6e, 0x64, 0x35, 0x4e, + 0x30, 0x63, 0x68, 0x59, 0x4f, 0x44, 0x5c, 0x0a, + 0x09, 0x09, 0x67, 0x33, 0x42, 0x76, 0x4b, 0x42, 0x54, 0x47, 0x66, 0x73, 0x2f, 0x4f, 0x78, 0x64, 0x70, 0x56, + 0x2f, 0x62, 0x49, 0x61, 0x39, 0x38, 0x50, 0x52, 0x43, 0x73, 0x48, 0x6d, 0x5a, 0x7a, 0x38, 0x64, 0x75, 0x6b, + 0x61, 0x61, 0x78, 0x49, 0x4c, 0x79, 0x2f, 0x62, 0x63, 0x4e, 0x44, 0x2f, 0x6f, 0x52, 0x6c, 0x43, 0x63, 0x69, + 0x39, 0x38, 0x38, 0x2b, 0x6a, 0x78, 0x72, 0x76, 0x47, 0x44, 0x31, 0x74, 0x69, 0x46, 0x59, 0x48, 0x33, 0x76, + 0x7a, 0x30, 0x74, 0x74, 0x64, 0x6d, 0x5c, 0x0a, + 0x09, 0x09, 0x42, 0x32, 0x33, 0x75, 0x6f, 0x63, 0x37, 0x71, 0x2b, 0x31, 0x36, 0x76, 0x2f, 0x39, 0x30, 0x6f, + 0x54, 0x70, 0x63, 0x36, 0x31, 0x76, 0x6c, 0x4a, 0x42, 0x47, 0x44, 0x53, 0x75, 0x4c, 0x59, 0x69, 0x41, 0x43, + 0x77, 0x43, 0x64, 0x35, 0x58, 0x42, 0x75, 0x77, 0x4e, 0x36, 0x6c, 0x77, 0x76, 0x54, 0x48, 0x4b, 0x79, 0x31, + 0x49, 0x38, 0x42, 0x6d, 0x70, 0x72, 0x79, 0x44, 0x4a, 0x30, 0x44, 0x32, 0x6f, 0x56, 0x4f, 0x47, 0x39, 0x76, + 0x37, 0x72, 0x51, 0x79, 0x73, 0x2f, 0x5c, 0x0a, + 0x09, 0x09, 0x6d, 0x35, 0x62, 0x32, 0x42, 0x6c, 0x66, 0x33, 0x50, 0x54, 0x4e, 0x31, 0x4b, 0x75, 0x37, 0x69, + 0x6f, 0x54, 0x55, 0x64, 0x2f, 0x46, 0x63, 0x6e, 0x2b, 0x63, 0x5a, 0x4a, 0x34, 0x33, 0x72, 0x61, 0x59, 0x74, + 0x6c, 0x57, 0x39, 0x57, 0x50, 0x73, 0x64, 0x41, 0x35, 0x4c, 0x68, 0x79, 0x67, 0x4f, 0x74, 0x6f, 0x62, 0x6f, + 0x2b, 0x58, 0x4f, 0x44, 0x7a, 0x54, 0x54, 0x50, 0x38, 0x50, 0x46, 0x30, 0x37, 0x55, 0x6d, 0x44, 0x50, 0x2b, + 0x30, 0x78, 0x67, 0x4b, 0x37, 0x56, 0x5c, 0x0a, + 0x09, 0x09, 0x36, 0x59, 0x35, 0x53, 0x4e, 0x6c, 0x78, 0x73, 0x46, 0x4a, 0x6a, 0x7a, 0x7a, 0x77, 0x38, 0x4f, + 0x31, 0x58, 0x58, 0x56, 0x69, 0x67, 0x41, 0x6d, 0x38, 0x4b, 0x45, 0x37, 0x61, 0x42, 0x51, 0x67, 0x72, 0x79, + 0x37, 0x41, 0x45, 0x44, 0x56, 0x54, 0x30, 0x33, 0x36, 0x4a, 0x43, 0x67, 0x41, 0x76, 0x45, 0x61, 0x36, 0x69, + 0x69, 0x51, 0x45, 0x51, 0x33, 0x66, 0x6f, 0x72, 0x41, 0x30, 0x74, 0x2b, 0x30, 0x33, 0x49, 0x41, 0x2f, 0x71, + 0x6c, 0x42, 0x44, 0x64, 0x52, 0x6a, 0x5c, 0x0a, + 0x09, 0x09, 0x39, 0x31, 0x6f, 0x73, 0x37, 0x32, 0x6a, 0x72, 0x2f, 0x2f, 0x36, 0x46, 0x39, 0x39, 0x42, 0x74, + 0x4f, 0x47, 0x41, 0x79, 0x36, 0x44, 0x68, 0x77, 0x76, 0x39, 0x79, 0x38, 0x6f, 0x38, 0x48, 0x7a, 0x63, 0x38, + 0x64, 0x67, 0x4e, 0x65, 0x36, 0x47, 0x6e, 0x31, 0x46, 0x4d, 0x4a, 0x2f, 0x56, 0x48, 0x36, 0x47, 0x64, 0x4f, + 0x35, 0x66, 0x68, 0x47, 0x59, 0x57, 0x71, 0x34, 0x65, 0x2b, 0x2f, 0x38, 0x66, 0x4b, 0x44, 0x39, 0x50, 0x50, + 0x46, 0x37, 0x72, 0x2b, 0x4f, 0x34, 0x5c, 0x0a, + 0x09, 0x09, 0x38, 0x47, 0x47, 0x69, 0x2b, 0x65, 0x41, 0x72, 0x74, 0x62, 0x74, 0x39, 0x70, 0x32, 0x2b, 0x71, + 0x62, 0x6d, 0x2f, 0x6d, 0x51, 0x36, 0x2f, 0x63, 0x4d, 0x72, 0x35, 0x57, 0x77, 0x35, 0x72, 0x31, 0x54, 0x38, + 0x77, 0x42, 0x42, 0x46, 0x4b, 0x42, 0x4a, 0x57, 0x65, 0x4b, 0x66, 0x58, 0x63, 0x76, 0x6b, 0x65, 0x41, 0x6e, + 0x79, 0x41, 0x55, 0x38, 0x2b, 0x70, 0x64, 0x33, 0x45, 0x65, 0x6c, 0x44, 0x48, 0x42, 0x4f, 0x56, 0x7a, 0x63, + 0x42, 0x35, 0x65, 0x75, 0x30, 0x41, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x75, 0x6e, 0x2f, 0x47, 0x62, 0x67, 0x2b, 0x6a, 0x4b, 0x34, 0x7a, 0x46, 0x77, 0x69, 0x64, + 0x39, 0x4c, 0x4e, 0x69, 0x2b, 0x35, 0x63, 0x55, 0x6b, 0x2f, 0x70, 0x72, 0x2b, 0x4f, 0x53, 0x67, 0x46, 0x53, + 0x63, 0x61, 0x33, 0x6f, 0x4f, 0x48, 0x52, 0x68, 0x76, 0x78, 0x73, 0x4f, 0x41, 0x50, 0x39, 0x6e, 0x4a, 0x53, + 0x62, 0x37, 0x78, 0x4a, 0x6b, 0x37, 0x33, 0x2f, 0x2f, 0x47, 0x69, 0x73, 0x31, 0x59, 0x38, 0x39, 0x68, 0x36, + 0x39, 0x2f, 0x76, 0x73, 0x42, 0x72, 0x5c, 0x0a, + 0x09, 0x09, 0x78, 0x78, 0x4c, 0x72, 0x4d, 0x49, 0x74, 0x4a, 0x2f, 0x6c, 0x56, 0x61, 0x42, 0x47, 0x69, 0x66, + 0x51, 0x46, 0x32, 0x38, 0x58, 0x66, 0x2f, 0x49, 0x33, 0x48, 0x6d, 0x43, 0x64, 0x4c, 0x66, 0x64, 0x52, 0x4e, + 0x38, 0x48, 0x41, 0x65, 0x67, 0x76, 0x6b, 0x33, 0x76, 0x6a, 0x36, 0x38, 0x47, 0x37, 0x59, 0x6a, 0x78, 0x47, + 0x41, 0x4e, 0x50, 0x4e, 0x78, 0x41, 0x4a, 0x5a, 0x4d, 0x72, 0x6e, 0x63, 0x56, 0x34, 0x77, 0x41, 0x4d, 0x4f, + 0x51, 0x43, 0x52, 0x4a, 0x38, 0x68, 0x5c, 0x0a, + 0x09, 0x09, 0x53, 0x44, 0x32, 0x79, 0x73, 0x56, 0x35, 0x68, 0x39, 0x7a, 0x45, 0x69, 0x4f, 0x55, 0x70, 0x67, + 0x68, 0x68, 0x67, 0x67, 0x6a, 0x57, 0x50, 0x68, 0x4a, 0x78, 0x58, 0x6f, 0x4a, 0x4f, 0x50, 0x44, 0x64, 0x74, + 0x36, 0x66, 0x71, 0x67, 0x44, 0x77, 0x65, 0x4d, 0x43, 0x43, 0x45, 0x72, 0x34, 0x2b, 0x59, 0x50, 0x2f, 0x39, + 0x58, 0x35, 0x6e, 0x35, 0x51, 0x53, 0x63, 0x77, 0x75, 0x42, 0x65, 0x70, 0x59, 0x59, 0x5a, 0x59, 0x69, 0x31, + 0x45, 0x34, 0x46, 0x58, 0x46, 0x4a, 0x5c, 0x0a, + 0x09, 0x09, 0x75, 0x4c, 0x62, 0x2f, 0x6a, 0x2b, 0x38, 0x39, 0x6b, 0x50, 0x52, 0x6e, 0x31, 0x39, 0x6b, 0x6c, + 0x71, 0x38, 0x77, 0x4b, 0x67, 0x43, 0x73, 0x69, 0x73, 0x50, 0x66, 0x75, 0x78, 0x30, 0x61, 0x6d, 0x6d, 0x75, + 0x67, 0x61, 0x38, 0x49, 0x6d, 0x2b, 0x44, 0x38, 0x75, 0x50, 0x6a, 0x7a, 0x4d, 0x7a, 0x4e, 0x64, 0x45, 0x49, + 0x50, 0x79, 0x33, 0x61, 0x69, 0x6e, 0x72, 0x30, 0x39, 0x2b, 0x4f, 0x66, 0x33, 0x5a, 0x63, 0x30, 0x6e, 0x64, + 0x6a, 0x55, 0x63, 0x5a, 0x48, 0x34, 0x5c, 0x0a, + 0x09, 0x09, 0x6d, 0x70, 0x6c, 0x69, 0x57, 0x6e, 0x38, 0x74, 0x44, 0x77, 0x72, 0x4b, 0x58, 0x53, 0x52, 0x45, + 0x76, 0x63, 0x50, 0x50, 0x34, 0x74, 0x2f, 0x38, 0x34, 0x6c, 0x39, 0x78, 0x50, 0x61, 0x34, 0x52, 0x34, 0x33, + 0x4b, 0x52, 0x66, 0x72, 0x7a, 0x7a, 0x47, 0x4d, 0x5a, 0x4d, 0x6a, 0x30, 0x59, 0x39, 0x73, 0x38, 0x45, 0x62, + 0x6e, 0x48, 0x33, 0x33, 0x59, 0x79, 0x6c, 0x2f, 0x4b, 0x73, 0x56, 0x43, 0x4b, 0x72, 0x4e, 0x6b, 0x78, 0x54, + 0x54, 0x2f, 0x61, 0x6c, 0x34, 0x6b, 0x5c, 0x0a, + 0x09, 0x09, 0x4a, 0x46, 0x59, 0x45, 0x61, 0x50, 0x54, 0x65, 0x78, 0x44, 0x51, 0x54, 0x4e, 0x64, 0x4a, 0x68, + 0x41, 0x65, 0x36, 0x64, 0x58, 0x66, 0x2b, 0x44, 0x4e, 0x78, 0x44, 0x74, 0x51, 0x38, 0x70, 0x6d, 0x36, 0x42, + 0x6f, 0x4a, 0x75, 0x70, 0x49, 0x74, 0x78, 0x73, 0x33, 0x4c, 0x6b, 0x38, 0x77, 0x77, 0x4a, 0x42, 0x6a, 0x38, + 0x43, 0x7a, 0x59, 0x58, 0x2b, 0x34, 0x77, 0x73, 0x59, 0x31, 0x76, 0x62, 0x67, 0x63, 0x4f, 0x77, 0x63, 0x37, + 0x46, 0x57, 0x30, 0x53, 0x2f, 0x72, 0x5c, 0x0a, + 0x09, 0x09, 0x55, 0x68, 0x75, 0x68, 0x46, 0x36, 0x41, 0x47, 0x46, 0x75, 0x71, 0x51, 0x6d, 0x4f, 0x7a, 0x66, + 0x36, 0x36, 0x6a, 0x39, 0x2b, 0x35, 0x39, 0x35, 0x7a, 0x71, 0x43, 0x67, 0x47, 0x36, 0x2b, 0x4e, 0x38, 0x2b, + 0x6f, 0x7a, 0x42, 0x37, 0x6d, 0x78, 0x39, 0x7a, 0x38, 0x35, 0x48, 0x42, 0x67, 0x73, 0x2b, 0x75, 0x55, 0x57, + 0x73, 0x55, 0x35, 0x73, 0x62, 0x67, 0x45, 0x4f, 0x53, 0x59, 0x65, 0x44, 0x33, 0x2f, 0x69, 0x67, 0x65, 0x4f, + 0x72, 0x6e, 0x41, 0x57, 0x52, 0x4a, 0x5c, 0x0a, + 0x09, 0x09, 0x42, 0x43, 0x67, 0x2f, 0x39, 0x77, 0x36, 0x53, 0x42, 0x4d, 0x35, 0x44, 0x49, 0x72, 0x49, 0x72, + 0x59, 0x2b, 0x47, 0x56, 0x74, 0x65, 0x41, 0x50, 0x49, 0x77, 0x42, 0x46, 0x4b, 0x52, 0x57, 0x6a, 0x43, 0x36, + 0x49, 0x75, 0x4e, 0x52, 0x32, 0x67, 0x2b, 0x65, 0x69, 0x39, 0x66, 0x37, 0x2b, 0x4c, 0x36, 0x48, 0x45, 0x63, + 0x62, 0x31, 0x6e, 0x78, 0x76, 0x37, 0x36, 0x58, 0x2b, 0x65, 0x42, 0x33, 0x5a, 0x67, 0x7a, 0x41, 0x4a, 0x52, + 0x45, 0x67, 0x43, 0x77, 0x6f, 0x52, 0x5c, 0x0a, + 0x09, 0x09, 0x63, 0x44, 0x76, 0x34, 0x76, 0x53, 0x58, 0x58, 0x36, 0x65, 0x66, 0x39, 0x59, 0x6f, 0x4a, 0x66, + 0x6e, 0x41, 0x42, 0x41, 0x42, 0x49, 0x41, 0x74, 0x32, 0x79, 0x38, 0x6b, 0x2b, 0x43, 0x6e, 0x6f, 0x7a, 0x30, + 0x6f, 0x4a, 0x66, 0x70, 0x45, 0x43, 0x45, 0x42, 0x43, 0x42, 0x4a, 0x53, 0x56, 0x77, 0x6e, 0x51, 0x43, 0x4a, + 0x77, 0x4b, 0x4f, 0x62, 0x2f, 0x35, 0x4f, 0x6e, 0x37, 0x61, 0x68, 0x4f, 0x51, 0x77, 0x4e, 0x2b, 0x75, 0x33, + 0x4b, 0x43, 0x50, 0x37, 0x58, 0x52, 0x5c, 0x0a, + 0x09, 0x09, 0x66, 0x71, 0x63, 0x45, 0x67, 0x45, 0x57, 0x41, 0x70, 0x67, 0x68, 0x46, 0x4c, 0x68, 0x59, 0x69, + 0x4f, 0x2f, 0x6e, 0x31, 0x35, 0x6d, 0x33, 0x73, 0x35, 0x35, 0x63, 0x4d, 0x37, 0x52, 0x62, 0x63, 0x76, 0x69, + 0x4e, 0x6c, 0x74, 0x4c, 0x38, 0x75, 0x4d, 0x66, 0x67, 0x4a, 0x4d, 0x62, 0x4d, 0x41, 0x77, 0x39, 0x69, 0x35, + 0x57, 0x43, 0x76, 0x70, 0x6c, 0x78, 0x75, 0x71, 0x65, 0x35, 0x36, 0x41, 0x4f, 0x47, 0x68, 0x2b, 0x33, 0x37, + 0x74, 0x6c, 0x42, 0x76, 0x76, 0x35, 0x5c, 0x0a, + 0x09, 0x09, 0x52, 0x56, 0x6c, 0x2b, 0x53, 0x74, 0x57, 0x45, 0x37, 0x50, 0x4b, 0x72, 0x4a, 0x62, 0x47, 0x74, + 0x74, 0x36, 0x2b, 0x54, 0x63, 0x6d, 0x30, 0x61, 0x63, 0x49, 0x77, 0x49, 0x30, 0x48, 0x70, 0x61, 0x6d, 0x69, + 0x4a, 0x63, 0x6c, 0x4e, 0x6a, 0x67, 0x76, 0x4b, 0x75, 0x6d, 0x59, 0x69, 0x78, 0x4b, 0x41, 0x65, 0x5a, 0x36, + 0x66, 0x65, 0x72, 0x78, 0x42, 0x57, 0x32, 0x74, 0x72, 0x6e, 0x49, 0x36, 0x71, 0x79, 0x41, 0x41, 0x5a, 0x6f, + 0x54, 0x67, 0x71, 0x6a, 0x4a, 0x77, 0x5c, 0x0a, + 0x09, 0x09, 0x34, 0x59, 0x69, 0x31, 0x66, 0x45, 0x6f, 0x4c, 0x41, 0x41, 0x6c, 0x42, 0x31, 0x4c, 0x58, 0x70, + 0x49, 0x45, 0x61, 0x75, 0x54, 0x34, 0x65, 0x75, 0x47, 0x4e, 0x71, 0x2f, 0x59, 0x59, 0x44, 0x55, 0x52, 0x2f, + 0x6f, 0x7a, 0x4b, 0x51, 0x41, 0x73, 0x41, 0x6f, 0x76, 0x73, 0x42, 0x6d, 0x61, 0x6c, 0x4e, 0x6b, 0x5a, 0x61, + 0x70, 0x54, 0x5a, 0x31, 0x37, 0x6b, 0x55, 0x49, 0x51, 0x52, 0x4b, 0x42, 0x54, 0x32, 0x63, 0x46, 0x76, 0x76, + 0x4d, 0x4c, 0x53, 0x59, 0x64, 0x36, 0x5c, 0x0a, + 0x09, 0x09, 0x4e, 0x46, 0x56, 0x33, 0x50, 0x33, 0x2b, 0x71, 0x2b, 0x58, 0x35, 0x6d, 0x42, 0x63, 0x43, 0x46, + 0x63, 0x51, 0x45, 0x49, 0x67, 0x58, 0x32, 0x72, 0x54, 0x39, 0x74, 0x34, 0x68, 0x51, 0x55, 0x2b, 0x73, 0x57, + 0x62, 0x6a, 0x38, 0x67, 0x34, 0x49, 0x77, 0x48, 0x41, 0x68, 0x75, 0x4b, 0x5a, 0x66, 0x6c, 0x71, 0x57, 0x33, + 0x56, 0x32, 0x2f, 0x74, 0x4f, 0x74, 0x31, 0x47, 0x69, 0x79, 0x32, 0x2f, 0x38, 0x52, 0x71, 0x31, 0x44, 0x6e, + 0x59, 0x36, 0x70, 0x30, 0x47, 0x51, 0x5c, 0x0a, + 0x09, 0x09, 0x31, 0x51, 0x39, 0x61, 0x2f, 0x71, 0x55, 0x6b, 0x44, 0x2f, 0x4b, 0x41, 0x41, 0x42, 0x79, 0x4a, + 0x51, 0x4a, 0x6c, 0x54, 0x67, 0x70, 0x4c, 0x30, 0x42, 0x75, 0x78, 0x74, 0x44, 0x58, 0x37, 0x31, 0x57, 0x56, + 0x58, 0x38, 0x7a, 0x6a, 0x4e, 0x77, 0x42, 0x53, 0x46, 0x74, 0x50, 0x70, 0x33, 0x63, 0x73, 0x79, 0x2f, 0x72, + 0x38, 0x41, 0x34, 0x66, 0x62, 0x30, 0x65, 0x72, 0x74, 0x43, 0x6d, 0x2b, 0x33, 0x41, 0x67, 0x41, 0x69, 0x77, + 0x43, 0x4e, 0x42, 0x36, 0x79, 0x36, 0x5c, 0x0a, + 0x09, 0x09, 0x34, 0x41, 0x59, 0x4f, 0x79, 0x35, 0x48, 0x4f, 0x41, 0x4e, 0x41, 0x70, 0x41, 0x68, 0x30, 0x59, + 0x41, 0x6a, 0x48, 0x6f, 0x68, 0x34, 0x4b, 0x64, 0x67, 0x74, 0x34, 0x37, 0x73, 0x55, 0x66, 0x6d, 0x6f, 0x71, + 0x73, 0x4f, 0x42, 0x37, 0x37, 0x49, 0x4f, 0x79, 0x39, 0x79, 0x4a, 0x51, 0x41, 0x75, 0x75, 0x6f, 0x45, 0x2b, + 0x4d, 0x66, 0x6a, 0x32, 0x61, 0x5a, 0x30, 0x69, 0x7a, 0x4f, 0x62, 0x33, 0x57, 0x6a, 0x4c, 0x4f, 0x36, 0x77, + 0x2f, 0x75, 0x66, 0x79, 0x34, 0x35, 0x5c, 0x0a, + 0x09, 0x09, 0x36, 0x45, 0x58, 0x33, 0x2b, 0x72, 0x6b, 0x58, 0x41, 0x46, 0x66, 0x64, 0x77, 0x44, 0x46, 0x6d, + 0x70, 0x72, 0x7a, 0x62, 0x69, 0x65, 0x6d, 0x73, 0x41, 0x42, 0x6f, 0x37, 0x79, 0x4b, 0x77, 0x37, 0x30, 0x41, + 0x46, 0x4f, 0x4a, 0x2f, 0x4c, 0x53, 0x6f, 0x68, 0x33, 0x76, 0x5a, 0x46, 0x38, 0x44, 0x42, 0x36, 0x38, 0x6b, + 0x51, 0x46, 0x74, 0x31, 0x44, 0x2b, 0x30, 0x55, 0x66, 0x39, 0x4e, 0x56, 0x62, 0x67, 0x55, 0x67, 0x49, 0x41, + 0x51, 0x30, 0x51, 0x30, 0x43, 0x44, 0x5c, 0x0a, + 0x09, 0x09, 0x68, 0x47, 0x57, 0x6e, 0x41, 0x34, 0x58, 0x4f, 0x78, 0x6e, 0x76, 0x75, 0x57, 0x36, 0x70, 0x34, + 0x35, 0x67, 0x6c, 0x56, 0x65, 0x4f, 0x36, 0x70, 0x37, 0x6d, 0x47, 0x5a, 0x44, 0x71, 0x34, 0x36, 0x39, 0x49, + 0x2f, 0x76, 0x70, 0x68, 0x35, 0x2b, 0x6e, 0x30, 0x35, 0x64, 0x64, 0x69, 0x50, 0x67, 0x67, 0x39, 0x44, 0x39, + 0x66, 0x44, 0x58, 0x4a, 0x76, 0x54, 0x34, 0x45, 0x59, 0x4c, 0x41, 0x51, 0x56, 0x46, 0x67, 0x49, 0x5a, 0x6c, + 0x56, 0x57, 0x49, 0x46, 0x47, 0x67, 0x5c, 0x0a, + 0x09, 0x09, 0x77, 0x7a, 0x44, 0x35, 0x51, 0x45, 0x7a, 0x76, 0x39, 0x64, 0x52, 0x4d, 0x2b, 0x6d, 0x36, 0x42, + 0x65, 0x6e, 0x55, 0x4b, 0x37, 0x4e, 0x30, 0x39, 0x37, 0x33, 0x4b, 0x56, 0x2f, 0x5a, 0x33, 0x75, 0x38, 0x65, + 0x6f, 0x4f, 0x42, 0x6e, 0x75, 0x51, 0x4a, 0x74, 0x76, 0x39, 0x39, 0x6a, 0x45, 0x72, 0x38, 0x4c, 0x64, 0x4e, + 0x61, 0x6b, 0x2f, 0x6c, 0x30, 0x6f, 0x2f, 0x4c, 0x47, 0x41, 0x4e, 0x77, 0x51, 0x41, 0x52, 0x6d, 0x4f, 0x53, + 0x57, 0x34, 0x6b, 0x69, 0x6b, 0x68, 0x5c, 0x0a, + 0x09, 0x09, 0x47, 0x43, 0x45, 0x4f, 0x52, 0x50, 0x48, 0x35, 0x62, 0x78, 0x33, 0x56, 0x32, 0x33, 0x50, 0x39, + 0x79, 0x35, 0x54, 0x48, 0x4c, 0x56, 0x33, 0x32, 0x37, 0x6b, 0x66, 0x6f, 0x79, 0x63, 0x57, 0x39, 0x59, 0x4f, + 0x61, 0x37, 0x44, 0x67, 0x36, 0x2b, 0x2b, 0x4c, 0x6f, 0x62, 0x34, 0x48, 0x53, 0x37, 0x6a, 0x74, 0x74, 0x42, + 0x50, 0x73, 0x7a, 0x75, 0x56, 0x77, 0x64, 0x4e, 0x37, 0x65, 0x6e, 0x67, 0x72, 0x33, 0x43, 0x61, 0x57, 0x64, + 0x4c, 0x50, 0x76, 0x42, 0x61, 0x42, 0x5c, 0x0a, + 0x09, 0x09, 0x46, 0x67, 0x54, 0x41, 0x44, 0x53, 0x45, 0x6f, 0x63, 0x63, 0x56, 0x56, 0x46, 0x41, 0x44, 0x44, + 0x41, 0x33, 0x39, 0x74, 0x30, 0x42, 0x72, 0x2b, 0x6e, 0x73, 0x41, 0x2f, 0x64, 0x41, 0x68, 0x61, 0x41, 0x42, + 0x59, 0x67, 0x41, 0x42, 0x41, 0x43, 0x34, 0x44, 0x61, 0x55, 0x32, 0x31, 0x38, 0x66, 0x6c, 0x4f, 0x66, 0x72, + 0x77, 0x43, 0x39, 0x7a, 0x65, 0x79, 0x6b, 0x50, 0x65, 0x65, 0x2b, 0x43, 0x46, 0x6f, 0x45, 0x6d, 0x42, 0x41, + 0x42, 0x43, 0x41, 0x50, 0x49, 0x56, 0x5c, 0x0a, + 0x09, 0x09, 0x2b, 0x47, 0x4a, 0x64, 0x41, 0x41, 0x51, 0x41, 0x51, 0x67, 0x41, 0x6d, 0x73, 0x50, 0x72, 0x36, + 0x61, 0x63, 0x51, 0x49, 0x2f, 0x43, 0x43, 0x69, 0x78, 0x67, 0x49, 0x67, 0x41, 0x50, 0x33, 0x35, 0x47, 0x77, + 0x30, 0x43, 0x74, 0x6b, 0x5a, 0x5a, 0x4e, 0x52, 0x59, 0x43, 0x45, 0x6f, 0x48, 0x73, 0x44, 0x78, 0x62, 0x6d, + 0x46, 0x77, 0x72, 0x53, 0x36, 0x30, 0x4e, 0x79, 0x2f, 0x43, 0x69, 0x42, 0x37, 0x31, 0x50, 0x58, 0x62, 0x61, + 0x73, 0x4b, 0x41, 0x5a, 0x41, 0x72, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x41, 0x38, 0x34, 0x71, 0x45, 0x6b, 0x41, 0x4e, 0x6e, 0x52, 0x6c, 0x31, 0x55, 0x63, 0x49, + 0x41, 0x58, 0x33, 0x66, 0x6f, 0x75, 0x6f, 0x66, 0x38, 0x41, 0x48, 0x75, 0x51, 0x76, 0x57, 0x39, 0x4d, 0x57, + 0x52, 0x55, 0x50, 0x30, 0x37, 0x67, 0x42, 0x31, 0x4f, 0x4a, 0x73, 0x37, 0x70, 0x64, 0x64, 0x53, 0x41, 0x41, + 0x4d, 0x67, 0x58, 0x67, 0x59, 0x4a, 0x67, 0x46, 0x48, 0x46, 0x56, 0x70, 0x76, 0x4c, 0x7a, 0x34, 0x4d, 0x74, + 0x49, 0x44, 0x5a, 0x32, 0x33, 0x2b, 0x5c, 0x0a, + 0x09, 0x09, 0x68, 0x75, 0x72, 0x65, 0x75, 0x74, 0x73, 0x65, 0x30, 0x43, 0x5a, 0x38, 0x74, 0x32, 0x64, 0x71, + 0x57, 0x33, 0x6c, 0x31, 0x56, 0x4d, 0x63, 0x43, 0x41, 0x5a, 0x41, 0x6c, 0x41, 0x45, 0x48, 0x6c, 0x70, 0x6b, + 0x71, 0x37, 0x72, 0x69, 0x75, 0x76, 0x50, 0x59, 0x45, 0x72, 0x4d, 0x4e, 0x6c, 0x67, 0x51, 0x50, 0x4b, 0x39, + 0x76, 0x62, 0x38, 0x6d, 0x35, 0x4c, 0x49, 0x46, 0x64, 0x30, 0x65, 0x64, 0x79, 0x52, 0x49, 0x45, 0x77, 0x43, + 0x30, 0x42, 0x4f, 0x46, 0x61, 0x42, 0x5c, 0x0a, + 0x09, 0x09, 0x4c, 0x41, 0x54, 0x4e, 0x55, 0x64, 0x2f, 0x45, 0x59, 0x77, 0x56, 0x58, 0x57, 0x42, 0x43, 0x51, + 0x49, 0x73, 0x69, 0x41, 0x36, 0x6d, 0x35, 0x54, 0x44, 0x52, 0x6a, 0x55, 0x34, 0x2f, 0x71, 0x66, 0x34, 0x7a, + 0x71, 0x7a, 0x36, 0x65, 0x51, 0x36, 0x75, 0x75, 0x32, 0x63, 0x68, 0x67, 0x44, 0x49, 0x43, 0x33, 0x36, 0x79, + 0x38, 0x56, 0x73, 0x68, 0x72, 0x65, 0x50, 0x59, 0x39, 0x49, 0x44, 0x46, 0x59, 0x49, 0x35, 0x37, 0x45, 0x34, + 0x69, 0x42, 0x76, 0x4b, 0x43, 0x66, 0x5c, 0x0a, + 0x09, 0x09, 0x56, 0x55, 0x65, 0x44, 0x75, 0x6b, 0x6e, 0x56, 0x6a, 0x59, 0x6a, 0x5a, 0x41, 0x41, 0x68, 0x41, + 0x76, 0x2f, 0x72, 0x66, 0x69, 0x71, 0x4c, 0x6f, 0x41, 0x56, 0x63, 0x77, 0x74, 0x6c, 0x4a, 0x5a, 0x44, 0x50, + 0x77, 0x78, 0x41, 0x36, 0x51, 0x4a, 0x46, 0x6e, 0x70, 0x59, 0x31, 0x52, 0x33, 0x45, 0x48, 0x52, 0x72, 0x30, + 0x58, 0x4e, 0x2b, 0x4c, 0x41, 0x56, 0x46, 0x4f, 0x47, 0x68, 0x48, 0x6a, 0x41, 0x42, 0x43, 0x41, 0x61, 0x43, + 0x6e, 0x41, 0x4b, 0x4c, 0x7a, 0x70, 0x5c, 0x0a, + 0x09, 0x09, 0x6f, 0x30, 0x6c, 0x63, 0x51, 0x63, 0x2b, 0x59, 0x77, 0x51, 0x55, 0x57, 0x42, 0x62, 0x69, 0x44, + 0x36, 0x4f, 0x58, 0x75, 0x42, 0x66, 0x32, 0x6f, 0x49, 0x37, 0x64, 0x59, 0x35, 0x50, 0x33, 0x42, 0x32, 0x6a, + 0x53, 0x6e, 0x63, 0x4e, 0x64, 0x30, 0x2b, 0x37, 0x67, 0x4b, 0x41, 0x63, 0x69, 0x65, 0x41, 0x41, 0x79, 0x30, + 0x6e, 0x70, 0x4e, 0x4f, 0x2b, 0x77, 0x54, 0x63, 0x77, 0x51, 0x56, 0x32, 0x42, 0x78, 0x43, 0x45, 0x30, 0x51, + 0x47, 0x2f, 0x54, 0x61, 0x2b, 0x6a, 0x5c, 0x0a, + 0x09, 0x09, 0x74, 0x74, 0x38, 0x47, 0x67, 0x6c, 0x35, 0x53, 0x2b, 0x67, 0x55, 0x42, 0x79, 0x49, 0x45, 0x41, + 0x42, 0x50, 0x45, 0x62, 0x61, 0x79, 0x4e, 0x4d, 0x37, 0x73, 0x63, 0x44, 0x69, 0x53, 0x51, 0x49, 0x35, 0x31, + 0x6b, 0x51, 0x79, 0x6a, 0x6b, 0x4d, 0x39, 0x6a, 0x59, 0x48, 0x2f, 0x47, 0x30, 0x4f, 0x39, 0x75, 0x59, 0x45, + 0x39, 0x56, 0x6a, 0x69, 0x67, 0x4a, 0x65, 0x61, 0x5a, 0x6b, 0x45, 0x41, 0x68, 0x41, 0x72, 0x41, 0x33, 0x51, + 0x52, 0x36, 0x43, 0x54, 0x39, 0x48, 0x5c, 0x0a, + 0x09, 0x09, 0x39, 0x52, 0x70, 0x30, 0x32, 0x41, 0x30, 0x69, 0x37, 0x42, 0x4a, 0x38, 0x64, 0x33, 0x43, 0x42, + 0x58, 0x37, 0x50, 0x69, 0x46, 0x4a, 0x6f, 0x63, 0x38, 0x42, 0x2f, 0x77, 0x31, 0x36, 0x32, 0x77, 0x68, 0x32, + 0x76, 0x6f, 0x4f, 0x74, 0x78, 0x79, 0x51, 0x43, 0x69, 0x64, 0x45, 0x6f, 0x44, 0x70, 0x6e, 0x50, 0x55, 0x32, + 0x74, 0x6f, 0x50, 0x4a, 0x7a, 0x2f, 0x75, 0x39, 0x56, 0x59, 0x53, 0x36, 0x77, 0x51, 0x59, 0x64, 0x51, 0x6f, + 0x74, 0x46, 0x59, 0x57, 0x69, 0x6a, 0x5c, 0x0a, + 0x09, 0x09, 0x35, 0x35, 0x74, 0x6b, 0x57, 0x67, 0x4f, 0x45, 0x6f, 0x63, 0x77, 0x2f, 0x6d, 0x38, 0x54, 0x68, + 0x61, 0x58, 0x36, 0x64, 0x46, 0x64, 0x59, 0x44, 0x64, 0x67, 0x4b, 0x66, 0x66, 0x54, 0x76, 0x77, 0x33, 0x2b, + 0x31, 0x42, 0x69, 0x33, 0x41, 0x69, 0x73, 0x70, 0x31, 0x54, 0x70, 0x32, 0x53, 0x4e, 0x50, 0x44, 0x6b, 0x41, + 0x4b, 0x58, 0x63, 0x49, 0x74, 0x41, 0x4d, 0x75, 0x6f, 0x57, 0x56, 0x69, 0x47, 0x79, 0x6b, 0x4c, 0x68, 0x45, + 0x2f, 0x77, 0x36, 0x39, 0x38, 0x59, 0x5c, 0x0a, + 0x09, 0x09, 0x49, 0x58, 0x71, 0x44, 0x42, 0x4b, 0x51, 0x35, 0x4a, 0x76, 0x67, 0x47, 0x42, 0x62, 0x76, 0x4a, + 0x41, 0x4a, 0x66, 0x69, 0x35, 0x4f, 0x4c, 0x67, 0x31, 0x43, 0x78, 0x41, 0x6e, 0x68, 0x7a, 0x41, 0x42, 0x30, + 0x49, 0x2b, 0x42, 0x7a, 0x58, 0x65, 0x53, 0x71, 0x42, 0x42, 0x2b, 0x34, 0x47, 0x33, 0x71, 0x52, 0x74, 0x4f, + 0x4c, 0x63, 0x6f, 0x50, 0x37, 0x4d, 0x6d, 0x64, 0x6d, 0x78, 0x6d, 0x76, 0x52, 0x39, 0x70, 0x77, 0x73, 0x79, + 0x58, 0x34, 0x38, 0x37, 0x56, 0x63, 0x5c, 0x0a, + 0x09, 0x09, 0x4b, 0x73, 0x78, 0x69, 0x6a, 0x67, 0x52, 0x41, 0x63, 0x6d, 0x44, 0x34, 0x46, 0x68, 0x2b, 0x4d, + 0x55, 0x38, 0x2b, 0x75, 0x59, 0x36, 0x6f, 0x4a, 0x2f, 0x58, 0x68, 0x74, 0x69, 0x63, 0x65, 0x44, 0x51, 0x51, + 0x43, 0x36, 0x44, 0x61, 0x66, 0x46, 0x31, 0x68, 0x55, 0x43, 0x35, 0x58, 0x35, 0x64, 0x72, 0x67, 0x6a, 0x74, + 0x61, 0x54, 0x64, 0x63, 0x4b, 0x38, 0x74, 0x69, 0x7a, 0x74, 0x70, 0x4f, 0x51, 0x33, 0x43, 0x6a, 0x68, 0x67, + 0x43, 0x45, 0x59, 0x30, 0x6d, 0x59, 0x5c, 0x0a, + 0x09, 0x09, 0x6f, 0x48, 0x63, 0x45, 0x4f, 0x78, 0x4d, 0x49, 0x41, 0x4c, 0x4f, 0x4a, 0x33, 0x6a, 0x38, 0x7a, + 0x4c, 0x71, 0x43, 0x74, 0x58, 0x78, 0x59, 0x45, 0x69, 0x63, 0x43, 0x61, 0x6c, 0x4c, 0x4d, 0x41, 0x49, 0x41, + 0x44, 0x44, 0x47, 0x30, 0x31, 0x44, 0x61, 0x42, 0x71, 0x77, 0x69, 0x5a, 0x43, 0x4f, 0x6e, 0x4e, 0x61, 0x74, + 0x53, 0x48, 0x43, 0x57, 0x55, 0x51, 0x64, 0x77, 0x49, 0x51, 0x44, 0x4a, 0x63, 0x78, 0x32, 0x70, 0x53, 0x61, + 0x5a, 0x45, 0x6f, 0x4b, 0x36, 0x36, 0x5c, 0x0a, + 0x09, 0x09, 0x4d, 0x77, 0x4e, 0x70, 0x30, 0x55, 0x72, 0x35, 0x39, 0x30, 0x4d, 0x41, 0x51, 0x6c, 0x49, 0x54, + 0x35, 0x67, 0x4a, 0x61, 0x6f, 0x77, 0x34, 0x69, 0x41, 0x52, 0x4f, 0x4c, 0x77, 0x48, 0x77, 0x4b, 0x39, 0x55, + 0x71, 0x70, 0x32, 0x34, 0x4b, 0x4c, 0x31, 0x6a, 0x2b, 0x33, 0x41, 0x73, 0x43, 0x56, 0x4a, 0x63, 0x6b, 0x46, + 0x58, 0x45, 0x63, 0x49, 0x47, 0x30, 0x73, 0x48, 0x46, 0x6c, 0x52, 0x79, 0x73, 0x77, 0x4d, 0x31, 0x4f, 0x67, + 0x72, 0x63, 0x35, 0x65, 0x44, 0x50, 0x5c, 0x0a, + 0x09, 0x09, 0x71, 0x77, 0x50, 0x77, 0x58, 0x59, 0x43, 0x45, 0x58, 0x72, 0x63, 0x44, 0x2b, 0x32, 0x39, 0x46, + 0x42, 0x47, 0x7a, 0x6d, 0x34, 0x79, 0x33, 0x75, 0x39, 0x56, 0x65, 0x79, 0x55, 0x47, 0x61, 0x35, 0x76, 0x52, + 0x63, 0x67, 0x77, 0x69, 0x6c, 0x42, 0x4e, 0x68, 0x43, 0x78, 0x63, 0x53, 0x53, 0x4c, 0x47, 0x44, 0x72, 0x70, + 0x39, 0x39, 0x69, 0x50, 0x35, 0x50, 0x71, 0x71, 0x75, 0x2f, 0x44, 0x33, 0x59, 0x7a, 0x66, 0x67, 0x5a, 0x49, + 0x33, 0x6b, 0x4b, 0x6a, 0x65, 0x53, 0x5c, 0x0a, + 0x09, 0x09, 0x74, 0x48, 0x72, 0x2f, 0x73, 0x36, 0x35, 0x62, 0x53, 0x45, 0x65, 0x45, 0x77, 0x44, 0x2b, 0x2f, + 0x4d, 0x51, 0x72, 0x6b, 0x30, 0x44, 0x61, 0x6b, 0x33, 0x67, 0x49, 0x4d, 0x41, 0x59, 0x6a, 0x66, 0x51, 0x4e, + 0x5a, 0x56, 0x4f, 0x6b, 0x64, 0x2b, 0x56, 0x31, 0x33, 0x70, 0x54, 0x54, 0x4a, 0x53, 0x7a, 0x79, 0x56, 0x32, + 0x41, 0x35, 0x64, 0x55, 0x64, 0x7a, 0x2f, 0x47, 0x73, 0x4a, 0x32, 0x55, 0x54, 0x62, 0x62, 0x35, 0x33, 0x6f, + 0x45, 0x6b, 0x72, 0x67, 0x6f, 0x30, 0x5c, 0x0a, + 0x09, 0x09, 0x42, 0x45, 0x43, 0x32, 0x43, 0x49, 0x67, 0x35, 0x50, 0x68, 0x70, 0x6b, 0x6b, 0x30, 0x6e, 0x6a, + 0x75, 0x6f, 0x69, 0x69, 0x38, 0x67, 0x61, 0x50, 0x61, 0x42, 0x34, 0x33, 0x71, 0x64, 0x36, 0x59, 0x63, 0x73, + 0x6b, 0x71, 0x53, 0x68, 0x31, 0x49, 0x41, 0x41, 0x4a, 0x77, 0x58, 0x41, 0x53, 0x71, 0x79, 0x75, 0x35, 0x63, + 0x4d, 0x76, 0x33, 0x73, 0x4a, 0x65, 0x54, 0x39, 0x41, 0x41, 0x49, 0x67, 0x55, 0x77, 0x54, 0x49, 0x42, 0x64, + 0x43, 0x43, 0x45, 0x68, 0x73, 0x44, 0x5c, 0x0a, + 0x09, 0x09, 0x50, 0x74, 0x54, 0x7a, 0x4c, 0x37, 0x69, 0x32, 0x58, 0x52, 0x52, 0x6b, 0x47, 0x34, 0x77, 0x42, + 0x44, 0x42, 0x38, 0x58, 0x4b, 0x43, 0x74, 0x7a, 0x30, 0x30, 0x67, 0x6b, 0x4b, 0x46, 0x58, 0x30, 0x2f, 0x45, + 0x44, 0x61, 0x47, 0x41, 0x41, 0x45, 0x59, 0x4c, 0x77, 0x51, 0x6c, 0x46, 0x54, 0x30, 0x61, 0x38, 0x43, 0x6f, + 0x74, 0x31, 0x39, 0x7a, 0x62, 0x51, 0x6f, 0x4a, 0x51, 0x41, 0x41, 0x67, 0x41, 0x49, 0x50, 0x46, 0x77, 0x44, + 0x2b, 0x2b, 0x2b, 0x7a, 0x79, 0x4c, 0x5c, 0x0a, + 0x09, 0x09, 0x51, 0x58, 0x6c, 0x41, 0x6a, 0x75, 0x39, 0x50, 0x49, 0x54, 0x56, 0x67, 0x39, 0x30, 0x48, 0x6d, + 0x42, 0x41, 0x41, 0x41, 0x6b, 0x42, 0x30, 0x77, 0x43, 0x41, 0x67, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x45, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x45, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x45, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, + 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x44, 0x32, 0x2b, 0x48, + 0x38, 0x42, 0x42, 0x67, 0x43, 0x7a, 0x5c, 0x0a, + 0x09, 0x09, 0x34, 0x78, 0x6b, 0x76, 0x62, 0x59, 0x39, 0x64, 0x36, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, + 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 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, 0x45, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x43, + 0x41, 0x59, 0x41, 0x41, 0x41, 0x43, 0x71, 0x61, 0x58, 0x48, 0x65, 0x41, 0x41, 0x41, 0x41, 0x47, 0x58, 0x52, + 0x46, 0x57, 0x48, 0x52, 0x54, 0x62, 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x51, 0x42, 0x42, 0x5a, + 0x47, 0x39, 0x69, 0x5a, 0x53, 0x42, 0x4a, 0x5c, 0x0a, + 0x09, 0x09, 0x62, 0x57, 0x46, 0x6e, 0x5a, 0x56, 0x4a, 0x6c, 0x59, 0x57, 0x52, 0x35, 0x63, 0x63, 0x6c, 0x6c, + 0x50, 0x41, 0x41, 0x41, 0x41, 0x79, 0x42, 0x70, 0x56, 0x46, 0x68, 0x30, 0x57, 0x45, 0x31, 0x4d, 0x4f, 0x6d, + 0x4e, 0x76, 0x62, 0x53, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x34, 0x62, 0x58, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x77, 0x2f, 0x65, 0x48, 0x42, 0x68, 0x59, 0x32, 0x74, 0x6c, 0x64, 0x43, + 0x42, 0x69, 0x5a, 0x57, 0x64, 0x70, 0x5c, 0x0a, + 0x09, 0x09, 0x62, 0x6a, 0x30, 0x69, 0x37, 0x37, 0x75, 0x2f, 0x49, 0x69, 0x42, 0x70, 0x5a, 0x44, 0x30, 0x69, + 0x56, 0x7a, 0x56, 0x4e, 0x4d, 0x45, 0x31, 0x77, 0x51, 0x32, 0x56, 0x6f, 0x61, 0x55, 0x68, 0x36, 0x63, 0x6d, + 0x56, 0x54, 0x65, 0x6b, 0x35, 0x55, 0x59, 0x33, 0x70, 0x72, 0x59, 0x7a, 0x6c, 0x6b, 0x49, 0x6a, 0x38, 0x2b, + 0x49, 0x44, 0x78, 0x34, 0x4f, 0x6e, 0x68, 0x74, 0x63, 0x47, 0x31, 0x6c, 0x64, 0x47, 0x45, 0x67, 0x65, 0x47, + 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x5c, 0x0a, + 0x09, 0x09, 0x65, 0x44, 0x30, 0x69, 0x59, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x36, 0x62, 0x6e, 0x4d, 0x36, + 0x62, 0x57, 0x56, 0x30, 0x59, 0x53, 0x38, 0x69, 0x49, 0x48, 0x67, 0x36, 0x65, 0x47, 0x31, 0x77, 0x64, 0x47, + 0x73, 0x39, 0x49, 0x6b, 0x46, 0x6b, 0x62, 0x32, 0x4a, 0x6c, 0x49, 0x46, 0x68, 0x4e, 0x55, 0x43, 0x42, 0x44, + 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x44, 0x55, 0x75, 0x4d, 0x43, 0x31, 0x6a, 0x4d, 0x44, 0x59, 0x77, 0x49, 0x44, + 0x59, 0x78, 0x4c, 0x6a, 0x45, 0x7a, 0x5c, 0x0a, + 0x09, 0x09, 0x4e, 0x44, 0x63, 0x33, 0x4e, 0x79, 0x77, 0x67, 0x4d, 0x6a, 0x41, 0x78, 0x4d, 0x43, 0x38, 0x77, + 0x4d, 0x69, 0x38, 0x78, 0x4d, 0x69, 0x30, 0x78, 0x4e, 0x7a, 0x6f, 0x7a, 0x4d, 0x6a, 0x6f, 0x77, 0x4d, 0x43, + 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x6a, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, + 0x5a, 0x6a, 0x70, 0x53, 0x52, 0x45, 0x59, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x63, 0x6d, + 0x52, 0x6d, 0x50, 0x53, 0x4a, 0x6f, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x48, 0x52, 0x77, 0x4f, 0x69, 0x38, 0x76, 0x64, 0x33, 0x64, 0x33, 0x4c, 0x6e, 0x63, 0x7a, + 0x4c, 0x6d, 0x39, 0x79, 0x5a, 0x79, 0x38, 0x78, 0x4f, 0x54, 0x6b, 0x35, 0x4c, 0x7a, 0x41, 0x79, 0x4c, 0x7a, + 0x49, 0x79, 0x4c, 0x58, 0x4a, 0x6b, 0x5a, 0x69, 0x31, 0x7a, 0x65, 0x57, 0x35, 0x30, 0x59, 0x58, 0x67, 0x74, + 0x62, 0x6e, 0x4d, 0x6a, 0x49, 0x6a, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x45, 0x5a, 0x58, + 0x4e, 0x6a, 0x63, 0x6d, 0x6c, 0x77, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x47, 0x6c, 0x76, 0x62, 0x69, 0x42, 0x79, 0x5a, 0x47, 0x59, 0x36, 0x59, 0x57, 0x4a, 0x76, + 0x64, 0x58, 0x51, 0x39, 0x49, 0x69, 0x49, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x65, 0x47, + 0x31, 0x77, 0x50, 0x53, 0x4a, 0x6f, 0x64, 0x48, 0x52, 0x77, 0x4f, 0x69, 0x38, 0x76, 0x62, 0x6e, 0x4d, 0x75, + 0x59, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4c, 0x33, 0x68, 0x68, 0x63, 0x43, + 0x38, 0x78, 0x4c, 0x6a, 0x41, 0x76, 0x5c, 0x0a, + 0x09, 0x09, 0x49, 0x69, 0x42, 0x34, 0x62, 0x57, 0x78, 0x75, 0x63, 0x7a, 0x70, 0x34, 0x62, 0x58, 0x42, 0x4e, + 0x54, 0x54, 0x30, 0x69, 0x61, 0x48, 0x52, 0x30, 0x63, 0x44, 0x6f, 0x76, 0x4c, 0x32, 0x35, 0x7a, 0x4c, 0x6d, + 0x46, 0x6b, 0x62, 0x32, 0x4a, 0x6c, 0x4c, 0x6d, 0x4e, 0x76, 0x62, 0x53, 0x39, 0x34, 0x59, 0x58, 0x41, 0x76, + 0x4d, 0x53, 0x34, 0x77, 0x4c, 0x32, 0x31, 0x74, 0x4c, 0x79, 0x49, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, + 0x4d, 0x36, 0x63, 0x33, 0x52, 0x53, 0x5c, 0x0a, + 0x09, 0x09, 0x5a, 0x57, 0x59, 0x39, 0x49, 0x6d, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4c, 0x79, 0x39, 0x75, + 0x63, 0x79, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, 0x76, 0x65, 0x47, + 0x46, 0x77, 0x4c, 0x7a, 0x45, 0x75, 0x4d, 0x43, 0x39, 0x7a, 0x56, 0x48, 0x6c, 0x77, 0x5a, 0x53, 0x39, 0x53, + 0x5a, 0x58, 0x4e, 0x76, 0x64, 0x58, 0x4a, 0x6a, 0x5a, 0x56, 0x4a, 0x6c, 0x5a, 0x69, 0x4d, 0x69, 0x49, 0x48, + 0x68, 0x74, 0x63, 0x44, 0x70, 0x44, 0x5c, 0x0a, + 0x09, 0x09, 0x63, 0x6d, 0x56, 0x68, 0x64, 0x47, 0x39, 0x79, 0x56, 0x47, 0x39, 0x76, 0x62, 0x44, 0x30, 0x69, + 0x51, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x67, 0x55, 0x47, 0x68, 0x76, 0x64, 0x47, 0x39, 0x7a, 0x61, 0x47, + 0x39, 0x77, 0x49, 0x45, 0x4e, 0x54, 0x4e, 0x53, 0x42, 0x58, 0x61, 0x57, 0x35, 0x6b, 0x62, 0x33, 0x64, 0x7a, + 0x49, 0x69, 0x42, 0x34, 0x62, 0x58, 0x42, 0x4e, 0x54, 0x54, 0x70, 0x4a, 0x62, 0x6e, 0x4e, 0x30, 0x59, 0x57, + 0x35, 0x6a, 0x5a, 0x55, 0x6c, 0x45, 0x5c, 0x0a, + 0x09, 0x09, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x61, 0x57, 0x6c, 0x6b, 0x4f, 0x6a, 0x6b, 0x33, + 0x4e, 0x55, 0x59, 0x78, 0x4e, 0x30, 0x4e, 0x47, 0x4f, 0x55, 0x51, 0x35, 0x52, 0x44, 0x45, 0x78, 0x52, 0x54, + 0x41, 0x35, 0x4d, 0x54, 0x67, 0x79, 0x51, 0x6a, 0x63, 0x34, 0x4d, 0x6b, 0x4e, 0x45, 0x51, 0x6b, 0x59, 0x35, + 0x52, 0x6b, 0x49, 0x31, 0x49, 0x69, 0x42, 0x34, 0x62, 0x58, 0x42, 0x4e, 0x54, 0x54, 0x70, 0x45, 0x62, 0x32, + 0x4e, 0x31, 0x62, 0x57, 0x56, 0x75, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x45, 0x6c, 0x45, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x5a, 0x47, 0x6c, 0x6b, + 0x4f, 0x6a, 0x6b, 0x33, 0x4e, 0x55, 0x59, 0x78, 0x4e, 0x30, 0x51, 0x77, 0x4f, 0x55, 0x51, 0x35, 0x52, 0x44, + 0x45, 0x78, 0x52, 0x54, 0x41, 0x35, 0x4d, 0x54, 0x67, 0x79, 0x51, 0x6a, 0x63, 0x34, 0x4d, 0x6b, 0x4e, 0x45, + 0x51, 0x6b, 0x59, 0x35, 0x52, 0x6b, 0x49, 0x31, 0x49, 0x6a, 0x34, 0x67, 0x50, 0x48, 0x68, 0x74, 0x63, 0x45, + 0x31, 0x4e, 0x4f, 0x6b, 0x52, 0x6c, 0x5c, 0x0a, + 0x09, 0x09, 0x63, 0x6d, 0x6c, 0x32, 0x5a, 0x57, 0x52, 0x47, 0x63, 0x6d, 0x39, 0x74, 0x49, 0x48, 0x4e, 0x30, + 0x55, 0x6d, 0x56, 0x6d, 0x4f, 0x6d, 0x6c, 0x75, 0x63, 0x33, 0x52, 0x68, 0x62, 0x6d, 0x4e, 0x6c, 0x53, 0x55, + 0x51, 0x39, 0x49, 0x6e, 0x68, 0x74, 0x63, 0x43, 0x35, 0x70, 0x61, 0x57, 0x51, 0x36, 0x4f, 0x54, 0x63, 0x31, + 0x52, 0x6a, 0x45, 0x33, 0x51, 0x30, 0x51, 0x35, 0x52, 0x44, 0x6c, 0x45, 0x4d, 0x54, 0x46, 0x46, 0x4d, 0x44, + 0x6b, 0x78, 0x4f, 0x44, 0x4a, 0x43, 0x5c, 0x0a, + 0x09, 0x09, 0x4e, 0x7a, 0x67, 0x79, 0x51, 0x30, 0x52, 0x43, 0x52, 0x6a, 0x6c, 0x47, 0x51, 0x6a, 0x55, 0x69, + 0x49, 0x48, 0x4e, 0x30, 0x55, 0x6d, 0x56, 0x6d, 0x4f, 0x6d, 0x52, 0x76, 0x59, 0x33, 0x56, 0x74, 0x5a, 0x57, + 0x35, 0x30, 0x53, 0x55, 0x51, 0x39, 0x49, 0x6e, 0x68, 0x74, 0x63, 0x43, 0x35, 0x6b, 0x61, 0x57, 0x51, 0x36, + 0x4f, 0x54, 0x63, 0x31, 0x52, 0x6a, 0x45, 0x33, 0x51, 0x30, 0x55, 0x35, 0x52, 0x44, 0x6c, 0x45, 0x4d, 0x54, + 0x46, 0x46, 0x4d, 0x44, 0x6b, 0x78, 0x5c, 0x0a, + 0x09, 0x09, 0x4f, 0x44, 0x4a, 0x43, 0x4e, 0x7a, 0x67, 0x79, 0x51, 0x30, 0x52, 0x43, 0x52, 0x6a, 0x6c, 0x47, + 0x51, 0x6a, 0x55, 0x69, 0x4c, 0x7a, 0x34, 0x67, 0x50, 0x43, 0x39, 0x79, 0x5a, 0x47, 0x59, 0x36, 0x52, 0x47, + 0x56, 0x7a, 0x59, 0x33, 0x4a, 0x70, 0x63, 0x48, 0x52, 0x70, 0x62, 0x32, 0x34, 0x2b, 0x49, 0x44, 0x77, 0x76, + 0x63, 0x6d, 0x52, 0x6d, 0x4f, 0x6c, 0x4a, 0x45, 0x52, 0x6a, 0x34, 0x67, 0x50, 0x43, 0x39, 0x34, 0x4f, 0x6e, + 0x68, 0x74, 0x63, 0x47, 0x31, 0x6c, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x47, 0x45, 0x2b, 0x49, 0x44, 0x77, 0x2f, 0x65, 0x48, 0x42, 0x68, 0x59, 0x32, 0x74, 0x6c, + 0x64, 0x43, 0x42, 0x6c, 0x62, 0x6d, 0x51, 0x39, 0x49, 0x6e, 0x49, 0x69, 0x50, 0x7a, 0x37, 0x4d, 0x74, 0x67, + 0x59, 0x54, 0x41, 0x41, 0x41, 0x43, 0x64, 0x30, 0x6c, 0x45, 0x51, 0x56, 0x52, 0x34, 0x32, 0x75, 0x79, 0x61, + 0x6a, 0x57, 0x32, 0x43, 0x55, 0x42, 0x44, 0x48, 0x48, 0x38, 0x59, 0x42, 0x57, 0x4b, 0x42, 0x4a, 0x52, 0x38, + 0x41, 0x4a, 0x43, 0x68, 0x76, 0x59, 0x5c, 0x0a, + 0x09, 0x09, 0x41, 0x5a, 0x72, 0x69, 0x42, 0x4e, 0x59, 0x4a, 0x72, 0x42, 0x4f, 0x49, 0x45, 0x39, 0x69, 0x6d, + 0x41, 0x36, 0x67, 0x54, 0x79, 0x41, 0x5a, 0x6c, 0x67, 0x39, 0x70, 0x30, 0x41, 0x54, 0x61, 0x77, 0x39, 0x39, + 0x49, 0x7a, 0x66, 0x53, 0x45, 0x67, 0x76, 0x49, 0x39, 0x44, 0x6c, 0x4c, 0x76, 0x6b, 0x35, 0x55, 0x55, 0x55, + 0x75, 0x50, 0x75, 0x39, 0x2f, 0x37, 0x31, 0x50, 0x76, 0x65, 0x50, 0x78, 0x4b, 0x50, 0x70, 0x73, 0x41, 0x39, + 0x46, 0x7a, 0x59, 0x77, 0x41, 0x4d, 0x5c, 0x0a, + 0x09, 0x09, 0x67, 0x41, 0x45, 0x77, 0x41, 0x41, 0x62, 0x41, 0x41, 0x42, 0x67, 0x41, 0x41, 0x32, 0x41, 0x41, + 0x44, 0x49, 0x41, 0x42, 0x4d, 0x41, 0x41, 0x47, 0x30, 0x45, 0x63, 0x62, 0x6d, 0x74, 0x7a, 0x6b, 0x65, 0x56, + 0x37, 0x70, 0x39, 0x5a, 0x2b, 0x6e, 0x56, 0x51, 0x68, 0x56, 0x69, 0x42, 0x38, 0x50, 0x55, 0x4e, 0x4b, 0x37, + 0x6a, 0x2b, 0x6e, 0x42, 0x78, 0x6b, 0x46, 0x34, 0x5a, 0x67, 0x7a, 0x56, 0x48, 0x4d, 0x70, 0x39, 0x79, 0x64, + 0x65, 0x5a, 0x66, 0x41, 0x65, 0x55, 0x5c, 0x0a, + 0x09, 0x09, 0x64, 0x33, 0x68, 0x50, 0x56, 0x6e, 0x5a, 0x2f, 0x33, 0x58, 0x36, 0x48, 0x5a, 0x37, 0x49, 0x68, + 0x55, 0x67, 0x51, 0x41, 0x54, 0x67, 0x5a, 0x51, 0x72, 0x61, 0x45, 0x45, 0x4a, 0x54, 0x2b, 0x58, 0x44, 0x69, + 0x37, 0x41, 0x77, 0x56, 0x51, 0x7a, 0x63, 0x42, 0x2b, 0x71, 0x6a, 0x51, 0x4b, 0x30, 0x7a, 0x75, 0x54, 0x7a, + 0x4a, 0x30, 0x58, 0x67, 0x35, 0x41, 0x43, 0x77, 0x31, 0x61, 0x57, 0x6a, 0x66, 0x73, 0x31, 0x74, 0x43, 0x54, + 0x67, 0x33, 0x30, 0x77, 0x68, 0x2b, 0x5c, 0x0a, + 0x09, 0x09, 0x58, 0x77, 0x48, 0x30, 0x6e, 0x4f, 0x56, 0x51, 0x49, 0x6c, 0x55, 0x4e, 0x70, 0x41, 0x43, 0x77, + 0x35, 0x66, 0x63, 0x4e, 0x67, 0x6c, 0x63, 0x6c, 0x4b, 0x78, 0x33, 0x4d, 0x43, 0x59, 0x4a, 0x58, 0x49, 0x59, + 0x78, 0x4f, 0x53, 0x71, 0x69, 0x4c, 0x62, 0x32, 0x43, 0x52, 0x6d, 0x37, 0x35, 0x6d, 0x38, 0x41, 0x4b, 0x44, + 0x2b, 0x6b, 0x4a, 0x77, 0x56, 0x62, 0x61, 0x32, 0x43, 0x46, 0x36, 0x67, 0x50, 0x2b, 0x73, 0x32, 0x52, 0x6f, + 0x47, 0x6c, 0x5a, 0x76, 0x43, 0x71, 0x5c, 0x0a, + 0x09, 0x09, 0x67, 0x2f, 0x73, 0x79, 0x43, 0x48, 0x44, 0x74, 0x46, 0x61, 0x71, 0x78, 0x67, 0x38, 0x34, 0x39, + 0x68, 0x47, 0x65, 0x4e, 0x79, 0x51, 0x44, 0x41, 0x77, 0x32, 0x57, 0x50, 0x48, 0x46, 0x75, 0x32, 0x30, 0x67, + 0x5a, 0x56, 0x70, 0x4b, 0x62, 0x54, 0x33, 0x4f, 0x45, 0x49, 0x39, 0x30, 0x79, 0x70, 0x67, 0x4b, 0x6b, 0x44, + 0x42, 0x2b, 0x39, 0x52, 0x43, 0x53, 0x63, 0x49, 0x47, 0x38, 0x64, 0x44, 0x66, 0x43, 0x4d, 0x46, 0x44, 0x45, + 0x30, 0x6c, 0x35, 0x73, 0x68, 0x4a, 0x5c, 0x0a, + 0x09, 0x09, 0x32, 0x65, 0x70, 0x4c, 0x67, 0x50, 0x42, 0x64, 0x4d, 0x63, 0x35, 0x62, 0x47, 0x61, 0x6f, 0x71, + 0x6f, 0x77, 0x41, 0x51, 0x4f, 0x50, 0x51, 0x7a, 0x46, 0x6e, 0x54, 0x6d, 0x55, 0x36, 0x58, 0x41, 0x56, 0x56, + 0x69, 0x54, 0x79, 0x64, 0x63, 0x74, 0x41, 0x32, 0x67, 0x30, 0x42, 0x62, 0x39, 0x6c, 0x41, 0x47, 0x6e, 0x66, + 0x41, 0x65, 0x77, 0x6f, 0x41, 0x61, 0x51, 0x64, 0x44, 0x7a, 0x36, 0x48, 0x2f, 0x4e, 0x39, 0x53, 0x41, 0x74, + 0x68, 0x31, 0x48, 0x4d, 0x43, 0x4b, 0x5c, 0x0a, + 0x09, 0x09, 0x65, 0x69, 0x71, 0x38, 0x37, 0x58, 0x4c, 0x72, 0x79, 0x35, 0x55, 0x6e, 0x4b, 0x51, 0x42, 0x63, + 0x61, 0x58, 0x55, 0x56, 0x77, 0x75, 0x72, 0x63, 0x61, 0x74, 0x4e, 0x6c, 0x4a, 0x7a, 0x69, 0x37, 0x39, 0x74, + 0x61, 0x33, 0x41, 0x6f, 0x41, 0x71, 0x53, 0x44, 0x6f, 0x47, 0x59, 0x4b, 0x48, 0x54, 0x2b, 0x74, 0x59, 0x62, + 0x49, 0x6a, 0x6a, 0x66, 0x2f, 0x6e, 0x51, 0x38, 0x4e, 0x54, 0x61, 0x31, 0x44, 0x49, 0x49, 0x66, 0x46, 0x53, + 0x2b, 0x53, 0x62, 0x59, 0x67, 0x6f, 0x5c, 0x0a, + 0x09, 0x09, 0x39, 0x6f, 0x6a, 0x53, 0x75, 0x37, 0x52, 0x4e, 0x54, 0x47, 0x36, 0x79, 0x42, 0x6f, 0x43, 0x70, + 0x45, 0x46, 0x30, 0x59, 0x77, 0x71, 0x4a, 0x71, 0x56, 0x35, 0x67, 0x38, 0x42, 0x51, 0x70, 0x4c, 0x54, 0x39, + 0x30, 0x74, 0x4d, 0x6a, 0x4c, 0x70, 0x74, 0x35, 0x6b, 0x43, 0x4a, 0x79, 0x56, 0x6b, 0x71, 0x49, 0x52, 0x44, + 0x69, 0x38, 0x48, 0x6e, 0x70, 0x74, 0x49, 0x6e, 0x57, 0x51, 0x73, 0x67, 0x68, 0x46, 0x48, 0x64, 0x4a, 0x6f, + 0x52, 0x44, 0x6d, 0x35, 0x6c, 0x4b, 0x5c, 0x0a, + 0x09, 0x09, 0x6e, 0x32, 0x77, 0x78, 0x68, 0x4d, 0x4f, 0x51, 0x56, 0x4d, 0x49, 0x62, 0x63, 0x66, 0x44, 0x79, + 0x6e, 0x4d, 0x48, 0x36, 0x48, 0x63, 0x37, 0x36, 0x67, 0x44, 0x4b, 0x44, 0x66, 0x75, 0x46, 0x46, 0x2f, 0x4f, + 0x30, 0x65, 0x4f, 0x31, 0x2f, 0x71, 0x51, 0x76, 0x42, 0x52, 0x6b, 0x78, 0x2b, 0x32, 0x31, 0x67, 0x64, 0x55, + 0x71, 0x43, 0x48, 0x42, 0x6c, 0x48, 0x44, 0x5a, 0x4c, 0x32, 0x51, 0x34, 0x39, 0x44, 0x6f, 0x78, 0x38, 0x76, + 0x30, 0x41, 0x70, 0x56, 0x39, 0x49, 0x5c, 0x0a, + 0x09, 0x09, 0x48, 0x41, 0x55, 0x66, 0x36, 0x63, 0x37, 0x32, 0x4c, 0x70, 0x59, 0x43, 0x4a, 0x53, 0x6b, 0x52, + 0x59, 0x6b, 0x6f, 0x45, 0x62, 0x51, 0x58, 0x66, 0x79, 0x75, 0x6d, 0x77, 0x41, 0x59, 0x68, 0x59, 0x56, 0x42, + 0x39, 0x35, 0x4f, 0x32, 0x33, 0x35, 0x54, 0x67, 0x49, 0x6f, 0x67, 0x4a, 0x6a, 0x57, 0x4b, 0x43, 0x4b, 0x56, + 0x4f, 0x57, 0x38, 0x71, 0x2b, 0x30, 0x34, 0x44, 0x4b, 0x4d, 0x77, 0x69, 0x35, 0x55, 0x6e, 0x4f, 0x67, 0x2f, + 0x67, 0x2f, 0x64, 0x4d, 0x6c, 0x78, 0x5c, 0x0a, + 0x09, 0x09, 0x69, 0x6d, 0x76, 0x56, 0x64, 0x35, 0x41, 0x41, 0x75, 0x43, 0x58, 0x6a, 0x50, 0x30, 0x6b, 0x78, + 0x41, 0x41, 0x62, 0x41, 0x41, 0x42, 0x67, 0x41, 0x41, 0x32, 0x41, 0x41, 0x44, 0x49, 0x41, 0x42, 0x4d, 0x41, + 0x41, 0x47, 0x77, 0x41, 0x42, 0x36, 0x61, 0x62, 0x38, 0x43, 0x44, 0x41, 0x43, 0x6a, 0x6c, 0x50, 0x65, 0x70, + 0x56, 0x76, 0x45, 0x33, 0x72, 0x77, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, + 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x22, 0x0a,0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x78, 0x20, 0x3d, 0x20, 0x34, 0x30, 0x30, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x79, 0x20, 0x3d, 0x20, 0x33, 0x30, 0x30, 0x0a, + 0x09, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x67, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, + 0x09, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, + 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, 0x64, 0x69, 0x75, + 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, + 0x68, 0x2e, 0x70, 0x69, 0x2a, 0x32, 0x2f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, + 0x73, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, + 0x70, 0x2a, 0x69, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x2f, 0x34, 0x35, 0x30, 0x0a, + 0x09, 0x09, 0x09, 0x7d, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x68, 0x65, + 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x72, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x72, 0x69, 0x6e, + 0x67, 0x73, 0x2c, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x64, 0x74, 0x2c, 0x20, 0x73, 0x29, 0x0a, - 0x09, 0x09, 0x73, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x74, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x31, 0x20, - 0x2a, 0x20, 0x73, 0x2e, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x2a, 0x20, 0x64, 0x74, 0x0a,0x0a, - 0x09, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x2e, 0x74, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x73, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x0a, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x28, 0x64, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x76, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x2e, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x73, 0x70, 0x65, 0x65, 0x64, + 0x2a, 0x64, 0x74, 0x2a, 0x30, 0x2e, 0x36, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x73, 0x29, 0x0a,0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x78, 0x30, 0x20, 0x2b, - 0x20, 0x73, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x73, 0x2e, 0x74, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x72, 0x30, 0x20, 0x2b, - 0x20, 0x73, 0x2e, 0x72, 0x76, 0x20, 0x2a, 0x20, 0x73, 0x2e, 0x74, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x0a,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, 0x2a, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, - 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2a, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x32, 0x35, 0x35, - 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2a, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x73, 0x74, 0x61, 0x72, 0x31, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x72, 0x2c, - 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x79, 0x2c, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x31, 0x36, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x64, 0x74, - 0x2c, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x29, 0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x64, 0x74, 0x2c, - 0x20, 0x76, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x29, 0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x28, 0x76, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x70, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x09, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, - 0x6d, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, - 0x09, 0x09, 0x7d, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x28, 0x6e, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x6e, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x2c, - 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x28, 0x6d, 0x61, 0x74, - 0x68, 0x2e, 0x70, 0x69, 0x20, 0x2a, 0x20, 0x32, 0x20, 0x2f, 0x20, 0x6e, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x29, + 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x6f, 0x73, 0x28, 0x76, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x2a, 0x20, + 0x76, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2b, 0x20, 0x63, 0x78, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x69, 0x6e, 0x28, 0x76, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x2a, 0x20, + 0x76, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2b, 0x20, 0x63, 0x79, 0x0a, + 0x09, 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, 0x76, 0x2e, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x2a, 0x32, 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, + 0x72, 0x61, 0x77, 0x28, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x78, + 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x76, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2b, 0x30, 0x2e, + 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x32, 0x2c, 0x20, 0x33, 0x32, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x64, 0x74, 0x2c, 0x20, 0x6b, 0x29, 0x0a, - 0x09, 0x09, 0x6b, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x6b, 0x2e, 0x74, 0x20, 0x2b, 0x20, 0x64, 0x74, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x6b, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, - 0x2e, 0x78, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, - 0x2e, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x6b, 0x2e, 0x70, 0x20, 0x2b, 0x20, - 0x6b, 0x2e, 0x74, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x32, 0x32, 0x35, 0x20, 0x2b, 0x20, - 0x32, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, - 0x28, 0x6b, 0x2e, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x6b, 0x2e, 0x74, 0x29, 0x29, 0x0a, + 0x61, 0x77, 0x5f, 0x70, 0x69, 0x67, 0x28, 0x70, 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, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x61, - 0x2c, 0x20, 0x2e, 0x37, 0x35, 0x2c, 0x20, 0x2e, 0x37, 0x35, 0x2c, 0x20, 0x36, 0x34, 0x2c, 0x20, 0x68, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x28, 0x64, 0x74, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, - 0x2b, 0x20, 0x64, 0x74, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, 0x3e, 0x20, 0x33, 0x36, 0x30, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x67, 0x6f, - 0x2e, 0x72, 0x20, 0x2d, 0x20, 0x33, 0x36, 0x30, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, - 0x79, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x28, 0x64, 0x74, 0x29, 0x0a, - 0x09, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x74, 0x2e, 0x74, 0x20, 0x2b, 0x20, 0x64, 0x74, 0x0a, - 0x09, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x33, 0x30, 0x30, 0x20, 0x2b, - 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x74, - 0x29, 0x2a, 0x33, 0x30, 0x0a, + 0x61, 0x77, 0x28, 0x70, 0x2e, 0x69, 0x6d, 0x67, 0x2c, 0x20, 0x70, 0x2e, 0x78, 0x2c, 0x20, 0x70, 0x2e, 0x79, + 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x32, 0x38, 0x2c, 0x20, 0x31, 0x32, + 0x38, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x62, 0x36, 0x34, 0x2c, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 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, 0x62, 0x36, 0x34, 0x2c, 0x20, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x77, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 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, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 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, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, - 0x64, 0x28, 0x29, 0x0a,0x0a, - 0x09, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x09, 0x78, 0x20, 0x3d, 0x20, 0x34, 0x30, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x79, 0x20, 0x3d, 0x20, 0x33, 0x30, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, - 0x34, 0x2c, 0x20, 0x22, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x7d, 0x0a,0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x09, 0x78, 0x20, 0x3d, 0x20, 0x34, 0x30, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x79, 0x20, 0x3d, 0x20, 0x33, 0x30, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x77, 0x20, 0x3d, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x68, 0x20, 0x3d, 0x20, 0x36, 0x34, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2c, - 0x20, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x7d, 0x0a,0x0a, - 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, - 0x38, 0x2c, 0x20, 0x31, 0x38, 0x2c, 0x20, 0x31, 0x38, 0x29, 0x0a, - 0x09, 0x09, 0x73, 0x74, 0x61, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x73, 0x74, 0x61, 0x72, 0x31, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, - 0x34, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x72, 0x31, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x62, 0x36, 0x34, 0x28, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x5f, 0x62, 0x61, 0x73, - 0x65, 0x36, 0x34, 0x2c, 0x20, 0x22, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x31, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a,0x0a, - 0x09, 0x09, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x09, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, - 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x28, 0x31, 0x30, 0x29, 0x0a,0x0a, - 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x41, 0x64, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x20, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x73, 0x2e, 0x0a, - 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x28, 0x31, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, - 0x29, 0x29, 0x0a, - 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x28, 0x37, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x29, - 0x29, 0x0a, - 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x28, 0x35, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x29, 0x0a,0x0a, + 0x64, 0x28, 0x29, 0x0a, 0x09, 0x09, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x73, 0x65, 0x65, 0x64, 0x28, - 0x6f, 0x73, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a,0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x28, 0x76, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x76, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x2c, 0x20, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x74, 0x2e, 0x78, 0x2c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x79, 0x2c, 0x20, 0x30, - 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x77, 0x2c, 0x20, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x69, 0x6d, 0x67, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, - 0x78, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x79, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x72, 0x2c, - 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x77, 0x2f, 0x32, 0x2c, 0x20, 0x6c, - 0x6f, 0x67, 0x6f, 0x2e, 0x68, 0x2f, 0x32, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x6f, 0x73, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x70, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x78, 0x20, 0x3d, 0x20, 0x63, 0x78, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x79, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x28, 0x70, 0x69, 0x67, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x70, 0x69, 0x67, 0x2e, 0x70, 0x6e, 0x67, + 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x7d, 0x0a, + 0x09, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x2c, + 0x20, 0x22, 0x68, 0x65, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, + 0x30, 0x30, 0x2c, 0x20, 0x31, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x34, 0x29, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, + 0x35, 0x30, 0x2c, 0x20, 0x32, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x32, + 0x30, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x32, + 0x35, 0x30, 0x2c, 0x20, 0x33, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x38, 0x29, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x33, + 0x30, 0x30, 0x2c, 0x20, 0x34, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x29, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x33, + 0x35, 0x30, 0x2c, 0x20, 0x35, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x34, 0x29, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x34, + 0x30, 0x30, 0x2c, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x61, 0x64, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x34, + 0x35, 0x30, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, 0x31, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 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, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x28, 0x64, 0x74, 0x2c, 0x20, 0x76, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x6e, 0x6f, 0x6c, 0x6c, 0x28, 0x64, 0x74, - 0x2c, 0x20, 0x76, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x28, 0x64, 0x74, + 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x28, 0x64, 0x74, 0x29, 0x0a, - 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x28, 0x64, 0x74, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 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, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, + 0x35, 0x34, 0x2c, 0x20, 0x32, 0x32, 0x34, 0x2c, 0x20, 0x32, 0x33, 0x38, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x69, 0x67, 0x28, 0x70, 0x69, 0x67, 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, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x22, 0x71, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x4f, 0x56, 0x45, 0x20, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 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, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 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, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 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, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 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, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a,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, From b90771d44acd3190998c46b94736429e68c1352e Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 24 Jun 2011 01:18:48 +0200 Subject: [PATCH 073/384] Fail gracefully on a utf-8 decoding error (bug #244) --- src/modules/graphics/opengl/Font.cpp | 40 +++++++++++-------- src/modules/graphics/opengl/wrap_Graphics.cpp | 18 ++++++++- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 8f6e1531f..18acb6dc2 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -149,24 +149,32 @@ namespace opengl glTranslatef(ceil(x), ceil(y), 0.0f); glRotatef(LOVE_TODEG(angle), 0, 0, 1.0f); glScalef(sx, sy, 1.0f); - utf8::iterator i (text.begin(), text.begin(), text.end()); - utf8::iterator end (text.end(), text.begin(), text.end()); - while (i != end) { - int g = *i++; - if (g == '\n') { // wrap newline, but do not print it - glTranslatef(-dx, floor(getHeight() * getLineHeight() + 0.5f), 0); - dx = 0.0f; - continue; + try + { + utf8::iterator i (text.begin(), text.begin(), text.end()); + utf8::iterator end (text.end(), text.begin(), text.end()); + while (i != end) { + int g = *i++; + if (g == '\n') { // wrap newline, but do not print it + glTranslatef(-dx, floor(getHeight() * getLineHeight() + 0.5f), 0); + dx = 0.0f; + continue; + } + Glyph * glyph = glyphs[g]; + if (!glyph) glyph = addGlyph(g); + glPushMatrix(); + // 1.25 is magic line height for true type fonts + if (type == FONT_TRUETYPE) glTranslatef(0, floor(getHeight() / 1.25f + 0.5f), 0); + glCallList(glyph->list); + glPopMatrix(); + glTranslatef(static_cast(glyph->spacing), 0, 0); + dx += glyph->spacing; } - Glyph * glyph = glyphs[g]; - if (!glyph) glyph = addGlyph(g); - glPushMatrix(); - // 1.25 is magic line height for true type fonts - if (type == FONT_TRUETYPE) glTranslatef(0, floor(getHeight() / 1.25f + 0.5f), 0); - glCallList(glyph->list); + } + catch (utf8::invalid_utf8 e) + { glPopMatrix(); - glTranslatef(static_cast(glyph->spacing), 0, 0); - dx += glyph->spacing; + throw love::Exception(e.what()); } glPopMatrix(); } diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 078f6c2a5..ad2da0495 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -759,7 +759,14 @@ namespace opengl 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); - instance->print(str, x, y, angle, sx, sy); + try + { + instance->print(str, x, y, angle, sx, sy); + } + catch (love::Exception e) + { + return luaL_error(L, "Decoding error: %s", e.what()); + } return 0; } @@ -779,7 +786,14 @@ namespace opengl return luaL_error(L, "Incorrect alignment: %s", str); } - instance->printf(str, x, y, wrap, align); + try + { + instance->printf(str, x, y, wrap, align); + } + catch (love::Exception e) + { + return luaL_error(L, "Decoding error: %s", e.what()); + } return 0; } From 8c5db2a92fae5b6b964621059c47269cbf8b3ab2 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 28 Jun 2011 17:01:35 +0200 Subject: [PATCH 074/384] Fix up posix threading backend --- src/modules/thread/posix/threads.cpp | 6 +++--- src/modules/thread/posix/threads.h | 4 +++- src/modules/thread/threads.h | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/modules/thread/posix/threads.cpp b/src/modules/thread/posix/threads.cpp index 0ee146107..c5825d24e 100644 --- a/src/modules/thread/posix/threads.cpp +++ b/src/modules/thread/posix/threads.cpp @@ -26,7 +26,7 @@ namespace thread { Mutex::Mutex() { - pthread_create_mutex(&mutex, NULL); + pthread_mutex_init(&mutex, NULL); } Mutex::~Mutex() @@ -157,7 +157,7 @@ namespace thread bool Conditional::wait(Mutex* mutex, int timeout) { if (timeout < 0) - return !pthread_cond_wait(cond, mutex->mutex); + return !pthread_cond_wait(&cond, &mutex->mutex); else { struct timespec ts; @@ -166,7 +166,7 @@ namespace thread ts.tv_sec = timeout / 1000; ts.tv_nsec = (timeout % 1000) * 1000000; - ret = pthread_cond_timedwait(&cond, mutex->mutex, &ts); + ret = pthread_cond_timedwait(&cond, &mutex->mutex, &ts); return (ret == 0); } } diff --git a/src/modules/thread/posix/threads.h b/src/modules/thread/posix/threads.h index 07291cec0..ce3794724 100644 --- a/src/modules/thread/posix/threads.h +++ b/src/modules/thread/posix/threads.h @@ -23,6 +23,7 @@ #include #include +#include namespace love { @@ -52,6 +53,7 @@ namespace thread ThreadBase(ThreadBase& thread) {} static void* thread_runner(void* param); + bool running; protected: @@ -72,7 +74,7 @@ namespace thread { private: Semaphore(const Semaphore& sem) {} - sem_t semaphore; + sem_t sem; public: Semaphore(unsigned int initial_value); diff --git a/src/modules/thread/threads.h b/src/modules/thread/threads.h index 0dcefd42f..c8f94845a 100644 --- a/src/modules/thread/threads.h +++ b/src/modules/thread/threads.h @@ -21,6 +21,8 @@ #ifndef LOVE_THREAD_THREADS_H #define LOVE_THREAD_THREADS_H +#include + #define LOVE_THREADS_SDL 0 #define LOVE_THREADS_WIN32 1 #define LOVE_THREADS_POSIX 2 From 1cf6a6fee19e19e8a76f6e4029ace9a31df0415b Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 28 Jun 2011 22:02:53 -0500 Subject: [PATCH 075/384] update the project for OS X and make pthreads work properly --- .../macosx/love.xcodeproj/project.pbxproj | 74 ++++++++++++++----- src/modules/thread/posix/threads.cpp | 15 ++++ 2 files changed, 71 insertions(+), 18 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 16f893a2a..5b0160cf3 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -176,8 +176,10 @@ A968F0D91083A9FC00A895AA /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D81083A9FC00A895AA /* Mouse.cpp */; }; A968F0DD1083AA6600A895AA /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DB1083AA6600A895AA /* Shape.cpp */; }; A968F0DE1083AA6600A895AA /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DC1083AA6600A895AA /* Joint.cpp */; }; - A986DEB5113249A800810279 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB1113249A800810279 /* Thread.cpp */; }; - A986DEB6113249A800810279 /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB3113249A800810279 /* wrap_Thread.cpp */; }; + A96E253B13B9890300456DEA /* delay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E253913B9890300456DEA /* delay.cpp */; }; + A96E254E13B9892100456DEA /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254313B9892100456DEA /* Thread.cpp */; }; + A96E254F13B9892100456DEA /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254513B9892100456DEA /* threads.cpp */; }; + A96E255113B9892100456DEA /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254A13B9892100456DEA /* wrap_Thread.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; A9B4BA9D1045937F001DBC80 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */; }; A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9BD60701226C988007DEC63 /* Framebuffer.cpp */; }; @@ -573,11 +575,21 @@ A968F0D81083A9FC00A895AA /* Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; A968F0DB1083AA6600A895AA /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = ""; }; A968F0DC1083AA6600A895AA /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; + A96E253913B9890300456DEA /* delay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay.cpp; sourceTree = ""; }; + A96E253A13B9890300456DEA /* delay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay.h; sourceTree = ""; }; + A96E253E13B9892100456DEA /* threads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = ""; }; + A96E253F13B9892100456DEA /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; + A96E254113B9892100456DEA /* threads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = ""; }; + A96E254213B9892100456DEA /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; + A96E254313B9892100456DEA /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Thread.cpp; sourceTree = ""; }; + A96E254413B9892100456DEA /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; + A96E254513B9892100456DEA /* threads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = ""; }; + A96E254613B9892100456DEA /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; + A96E254813B9892100456DEA /* threads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = ""; }; + A96E254913B9892100456DEA /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; + A96E254A13B9892100456DEA /* wrap_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Thread.cpp; sourceTree = ""; }; + A96E254B13B9892100456DEA /* wrap_Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Thread.h; sourceTree = ""; }; A97E3842132A9EDE00198A2F /* love-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "love-Info.plist"; sourceTree = ""; }; - A986DEB1113249A800810279 /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Thread.cpp; sourceTree = ""; }; - A986DEB2113249A800810279 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; - A986DEB3113249A800810279 /* wrap_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Thread.cpp; sourceTree = ""; }; - A986DEB4113249A800810279 /* wrap_Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Thread.h; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; A9B4BA981045937F001DBC80 /* ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleSystem.h; sourceTree = ""; }; A9B4BA991045937F001DBC80 /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = ""; }; @@ -587,7 +599,6 @@ A9BD60711226C988007DEC63 /* Framebuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Framebuffer.h; sourceTree = ""; }; A9BD60721226C988007DEC63 /* wrap_Framebuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Framebuffer.cpp; sourceTree = ""; }; A9BD60731226C988007DEC63 /* wrap_Framebuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Framebuffer.h; sourceTree = ""; }; - A9BFAA851137C1CE005FE0AD /* ThreadModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadModule.h; sourceTree = ""; }; A9CF0E8410B9EB1000E6F37E /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = ""; }; A9CF0E8510B9EB1000E6F37E /* utf8.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utf8.cpp; sourceTree = ""; }; A9D307E9106635C3004FEDF8 /* physfs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = physfs.framework; path = /Library/Frameworks/physfs.framework; sourceTree = ""; }; @@ -710,6 +721,8 @@ A95684F6125D3555001B276B /* b64.h */, A93E69DE10420ABF007D418B /* config.h */, A93E69DF10420ABF007D418B /* Data.h */, + A96E253913B9890300456DEA /* delay.cpp */, + A96E253A13B9890300456DEA /* delay.h */, A968F0C61083A07B00A895AA /* EnumMap.h */, A93E69E010420ABF007D418B /* Exception.cpp */, A93E69E110420ABF007D418B /* Exception.h */, @@ -822,7 +835,7 @@ A93E6AC210420AC3007D418B /* mouse */, A93E6AE910420AC7007D418B /* physics */, A93E6B7410420ACB007D418B /* sound */, - A986DEAF113249A700810279 /* thread */, + A96E253C13B9892100456DEA /* thread */, A93E6B8D10420ACB007D418B /* timer */, ); path = modules; @@ -1392,26 +1405,49 @@ path = utf8; sourceTree = ""; }; - A986DEAF113249A700810279 /* thread */ = { + A96E253C13B9892100456DEA /* thread */ = { isa = PBXGroup; children = ( - A9BFAA851137C1CE005FE0AD /* ThreadModule.h */, - A986DEB0113249A800810279 /* sdl */, + A96E253D13B9892100456DEA /* posix */, + A96E254013B9892100456DEA /* sdl */, + A96E254313B9892100456DEA /* Thread.cpp */, + A96E254413B9892100456DEA /* Thread.h */, + A96E254513B9892100456DEA /* threads.cpp */, + A96E254613B9892100456DEA /* threads.h */, + A96E254713B9892100456DEA /* win32 */, + A96E254A13B9892100456DEA /* wrap_Thread.cpp */, + A96E254B13B9892100456DEA /* wrap_Thread.h */, ); path = thread; sourceTree = ""; }; - A986DEB0113249A800810279 /* sdl */ = { + A96E253D13B9892100456DEA /* posix */ = { isa = PBXGroup; children = ( - A986DEB1113249A800810279 /* Thread.cpp */, - A986DEB2113249A800810279 /* Thread.h */, - A986DEB3113249A800810279 /* wrap_Thread.cpp */, - A986DEB4113249A800810279 /* wrap_Thread.h */, + A96E253E13B9892100456DEA /* threads.cpp */, + A96E253F13B9892100456DEA /* threads.h */, + ); + path = posix; + sourceTree = ""; + }; + A96E254013B9892100456DEA /* sdl */ = { + isa = PBXGroup; + children = ( + A96E254113B9892100456DEA /* threads.cpp */, + A96E254213B9892100456DEA /* threads.h */, ); path = sdl; sourceTree = ""; }; + A96E254713B9892100456DEA /* win32 */ = { + isa = PBXGroup; + children = ( + A96E254813B9892100456DEA /* threads.cpp */, + A96E254913B9892100456DEA /* threads.h */, + ); + path = win32; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1631,11 +1667,13 @@ A968F0DE1083AA6600A895AA /* Joint.cpp in Sources */, A9CF0E8610B9EB1000E6F37E /* utf8.cpp in Sources */, A93A3AB51121E86E003B04A4 /* Image.cpp in Sources */, - A986DEB5113249A800810279 /* Thread.cpp in Sources */, - A986DEB6113249A800810279 /* wrap_Thread.cpp in Sources */, A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */, A9BD60751226C988007DEC63 /* wrap_Framebuffer.cpp in Sources */, A95684F7125D3555001B276B /* b64.cpp in Sources */, + A96E253B13B9890300456DEA /* delay.cpp in Sources */, + A96E254E13B9892100456DEA /* Thread.cpp in Sources */, + A96E254F13B9892100456DEA /* threads.cpp in Sources */, + A96E255113B9892100456DEA /* wrap_Thread.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/modules/thread/posix/threads.cpp b/src/modules/thread/posix/threads.cpp index c5825d24e..be63e5ca3 100644 --- a/src/modules/thread/posix/threads.cpp +++ b/src/modules/thread/posix/threads.cpp @@ -19,6 +19,9 @@ **/ #include "threads.h" +#ifdef LOVE_MACOSX +#include // for Mac OS X's fake sem_timedwait +#endif namespace love { @@ -122,10 +125,22 @@ namespace thread return !sem_trywait(&sem); else { +#ifdef LOVE_MACOSX + // OS X lacks sem_timedwait, so we fake it with a busy loop + time_t timer = time(NULL)*1000 + timeout; + int retval = 0; + do { + retval = sem_trywait(&sem); + if (retval == 0) break; + delay(1); + } while (time(NULL)*1000 < timer); + return !retval; +#else struct timespec ts; ts.tv_sec = timeout/1000; ts.tv_nsec = (timeout % 1000) * 1000000; return !sem_timedwait(&sem, &ts); +#endif } } From 176fb7d2f50b1db0a831edb403bdaa444922b3a4 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 29 Jun 2011 12:49:31 +0200 Subject: [PATCH 076/384] Manage our own ImageData, thereby bypassing DevILs thread-safety issues (bug #200) --- src/modules/image/ImageData.h | 4 +- src/modules/image/devil/ImageData.cpp | 106 +++++++++++++++++++++++--- src/modules/image/devil/ImageData.h | 14 +++- 3 files changed, 109 insertions(+), 15 deletions(-) diff --git a/src/modules/image/ImageData.h b/src/modules/image/ImageData.h index 41ec498db..0f0286d07 100644 --- a/src/modules/image/ImageData.h +++ b/src/modules/image/ImageData.h @@ -107,7 +107,7 @@ namespace image * @param y The location along the y-axis. * @return The color for the given location. **/ - virtual pixel getPixel(int x, int y) const = 0; + virtual pixel getPixel(int x, int y) = 0; /** * Encodes raw pixel data into a given format. @@ -125,4 +125,4 @@ namespace image } // image } // love -#endif // LOVE_IMAGE_IMAGE_DATA_H \ No newline at end of file +#endif // LOVE_IMAGE_IMAGE_DATA_H diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index e452985cf..b2b8e4d2e 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -29,6 +29,10 @@ #include #include +using love::thread::Lock; + +static Mutex devilMutex; + namespace love { namespace image @@ -37,6 +41,9 @@ namespace devil { void ImageData::create(int width, int height, void * data) { + Lock lock(devilMutex); //automatically lock and unlock + ILuint image; + //create the image ilGenImages(1, &image); @@ -66,10 +73,24 @@ namespace devil } throw love::Exception("Could not decode image data."); } + + try { + this->data = new unsigned char[width*height*bpp]; + } catch(std::bad_alloc) { + ilDeleteImages(1, &image); + throw love::Exception("Out of memory"); + } + + memcpy(this->data, ilGetData(), width*height*bpp); + + ilDeleteImages(1, &image); } void ImageData::load(Data * data) { + Lock lock(devilMutex); + ILuint image; + // Generate DevIL image. ilGenImages(1, &image); @@ -101,6 +122,20 @@ namespace devil std::cerr << "Bits per pixel != 4" << std::endl; return; } + + try + { + this->data = new unsigned char[width*height*bpp]; + } + catch(std::bad_alloc) + { + ilDeleteImages(1, &image); + throw love::Exception("Out of memory"); + } + + memcpy(this->data, ilGetData(), width*height*bpp); + + ilDeleteImages(1, &image); } ImageData::ImageData(Data * data) @@ -121,7 +156,7 @@ namespace devil create(width, height); // Set to black. - memset((void*)ilGetData(), 0, width*height*4); + memset(data, 0, width*height*4); } ImageData::ImageData(int width, int height, void *data) @@ -132,7 +167,7 @@ namespace devil ImageData::~ImageData() { - ilDeleteImages(1, &image); + delete[] data; } int ImageData::getWidth() const @@ -147,8 +182,7 @@ namespace devil void * ImageData::getData() const { - ilBindImage(image); - return ilGetData(); + return data; } int ImageData::getSize() const @@ -158,6 +192,7 @@ namespace devil void ImageData::setPixel(int x, int y, pixel c) { + Lock lock(mutex); //int tx = x > width-1 ? width-1 : x; //int ty = y > height-1 ? height-1 : y; // not using these seems to not break anything if (x > width-1 || y > height-1 || x < 0 || y < 0) throw love::Exception("Attempt to set out-of-range pixel!"); @@ -165,8 +200,9 @@ namespace devil pixels[y*width+x] = c; } - pixel ImageData::getPixel(int x, int y) const + pixel ImageData::getPixel(int x, int y) { + Lock lock(mutex); //int tx = x > width-1 ? width-1 : x; //int ty = y > height-1 ? height-1 : y; // not using these seems to not break anything if (x > width-1 || y > height-1 || x < 0 || y < 0) throw love::Exception("Attempt to get out-of-range pixel!"); @@ -175,7 +211,41 @@ namespace devil } void ImageData::encode(love::filesystem::File * f, ImageData::Format format) { - ilBindImage(image); + Lock lock(devilMutex); + Lock lock2(mutex); + + ILuint tempimage; + ilGenImages(1, &tempimage); + ilBindImage(tempimage); + + while(ilGetError() != IL_NO_ERROR); + + bool success = ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, this->data) == IL_TRUE; + + ILenum err = ilGetError(); + while(ilGetError() != IL_NO_ERROR); + + if(!success) { + ilDeleteImages(1, &tempimage); + + 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: @@ -195,13 +265,29 @@ namespace devil ilFormat = IL_PNG; break; } + ILuint size = ilSaveL(ilFormat, NULL, 0); - ILubyte * data = new ILubyte[size]; - ilSaveL(ilFormat, data, size); + if(!size) { + ilDeleteImages(1, &tempimage); + throw love::Exception("Could not encode image!"); + } + + ILubyte * encoded_data; + try { + encoded_data = new ILubyte[size]; + } catch(std::bad_alloc) { + ilDeleteImages(1, &tempimage); + throw love::Exception("Out of memory"); + } + + ilSaveL(ilFormat, encoded_data, size); + ilDeleteImages(1, &tempimage); + f->open(love::filesystem::File::WRITE); - f->write(data, size); + f->write(encoded_data, size); f->close(); - delete[] data; + + delete[] encoded_data; } } // devil diff --git a/src/modules/image/devil/ImageData.h b/src/modules/image/devil/ImageData.h index 20f9d379f..ea28f928e 100644 --- a/src/modules/image/devil/ImageData.h +++ b/src/modules/image/devil/ImageData.h @@ -24,10 +24,13 @@ // LOVE #include #include +#include // DevIL #include +using love::thread::Mutex; + namespace love { namespace image @@ -50,14 +53,19 @@ namespace devil // The bits per pixel. int bpp; - // DevIL image identifier. - ILuint image; + // The actual data + unsigned char *data; // Create imagedata. void create(int width, int height, void * data = 0); void load(Data * data); + // We need to be thread-safe + // so we lock when we're accessing our + // data + Mutex mutex; + public: ImageData(Data * data); @@ -74,7 +82,7 @@ namespace devil int getWidth() const ; int getHeight() const ; void setPixel(int x, int y, pixel c); - pixel getPixel(int x, int y) const; + pixel getPixel(int x, int y); void encode(love::filesystem::File * f, Format format); }; // ImageData From e5cd9f04d2f444a48d5467d243a792633eceb8eb Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 30 Jun 2011 13:13:58 +0200 Subject: [PATCH 077/384] Apply Boolsheet's cosmetics (ticket #200) --- src/modules/image/devil/ImageData.cpp | 103 ++++++++++++++++---------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index b2b8e4d2e..e05fc1549 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -50,40 +50,49 @@ namespace devil //bind it ilBindImage(image); + while(ilGetError() != IL_NO_ERROR); + //create and populate the image bool success = (ilTexImage(width, height, 1, bpp, IL_RGBA, IL_UNSIGNED_BYTE, data) == IL_TRUE); - if(!success) { - int err = ilGetError(); - if (err != IL_NO_ERROR){ - switch (err) { + ILenum err = ilGetError(); + while(ilGetError() != IL_NO_ERROR); + + if (!success) + { + ilDeleteImages(1, &image); + + if (err != IL_NO_ERROR) + { + switch (err) + { case IL_ILLEGAL_OPERATION: - throw love::Exception("Error: Illegal operation"); - break; + throw love::Exception("Illegal operation"); case IL_INVALID_PARAM: - throw love::Exception("Error: invalid parameters"); - break; + throw love::Exception("Invalid parameters"); case IL_OUT_OF_MEMORY: - throw love::Exception("Error: out of memory"); - break; + throw love::Exception("Out of memory"); default: - throw love::Exception("Error: unknown error"); - break; + throw love::Exception("Unknown error (%d)", (int) err); } } + throw love::Exception("Could not decode image data."); } - try { - this->data = new unsigned char[width*height*bpp]; - } catch(std::bad_alloc) { - ilDeleteImages(1, &image); - throw love::Exception("Out of memory"); - } - - memcpy(this->data, ilGetData(), width*height*bpp); - - ilDeleteImages(1, &image); + try + { + this->data = new unsigned char[width*height*bpp]; + } + catch (std::bad_alloc) + { + ilDeleteImages(1, &image); + throw love::Exception("Out of memory"); + } + + memcpy(this->data, ilGetData(), width*height*bpp); + + ilDeleteImages(1, &image); } void ImageData::load(Data * data) @@ -104,7 +113,6 @@ namespace devil if(!success) { throw love::Exception("Could not decode image!"); - return; } width = ilGetInteger(IL_IMAGE_WIDTH); @@ -119,23 +127,24 @@ namespace devil if(bpp != 4) { + ilDeleteImages(1, &image); std::cerr << "Bits per pixel != 4" << std::endl; return; } try { - this->data = new unsigned char[width*height*bpp]; - } + this->data = new unsigned char[width*height*bpp]; + } catch(std::bad_alloc) { - ilDeleteImages(1, &image); - throw love::Exception("Out of memory"); - } - - memcpy(this->data, ilGetData(), width*height*bpp); - - ilDeleteImages(1, &image); + ilDeleteImages(1, &image); + throw love::Exception("Out of memory"); + } + + memcpy(this->data, ilGetData(), width*height*bpp); + + ilDeleteImages(1, &image); } ImageData::ImageData(Data * data) @@ -195,7 +204,9 @@ namespace devil Lock lock(mutex); //int tx = x > width-1 ? width-1 : x; //int ty = y > height-1 ? height-1 : y; // not using these seems to not break anything - if (x > width-1 || y > height-1 || x < 0 || y < 0) throw love::Exception("Attempt to set out-of-range pixel!"); + if (x > width-1 || y > height-1 || x < 0 || y < 0) + throw love::Exception("Attempt to set out-of-range pixel!"); + pixel * pixels = (pixel *)getData(); pixels[y*width+x] = c; } @@ -205,7 +216,9 @@ namespace devil Lock lock(mutex); //int tx = x > width-1 ? width-1 : x; //int ty = y > height-1 ? height-1 : y; // not using these seems to not break anything - if (x > width-1 || y > height-1 || x < 0 || y < 0) throw love::Exception("Attempt to get out-of-range pixel!"); + if (x > width-1 || y > height-1 || x < 0 || y < 0) + throw love::Exception("Attempt to get out-of-range pixel!"); + pixel * pixels = (pixel *)getData(); return pixels[y*width+x]; } @@ -225,11 +238,14 @@ namespace devil ILenum err = ilGetError(); while(ilGetError() != IL_NO_ERROR); - if(!success) { + if (!success) + { ilDeleteImages(1, &tempimage); - if(err != IL_NO_ERROR) { - switch (err) { + if (err != IL_NO_ERROR) + { + switch (err) + { case IL_ILLEGAL_OPERATION: throw love::Exception("Illegal operation"); case IL_INVALID_PARAM: @@ -247,7 +263,8 @@ namespace devil ilRegisterOrigin(IL_ORIGIN_UPPER_LEFT); ILuint ilFormat; - switch (format) { + switch (format) + { case ImageData::FORMAT_BMP: ilFormat = IL_BMP; break; @@ -267,15 +284,19 @@ namespace devil } ILuint size = ilSaveL(ilFormat, NULL, 0); - if(!size) { + if (!size) + { ilDeleteImages(1, &tempimage); throw love::Exception("Could not encode image!"); } ILubyte * encoded_data; - try { + try + { encoded_data = new ILubyte[size]; - } catch(std::bad_alloc) { + } + catch(std::bad_alloc) + { ilDeleteImages(1, &tempimage); throw love::Exception("Out of memory"); } From d215c157026472e69a9e6fc196430013f24ea6e5 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 2 Jul 2011 16:21:10 +0200 Subject: [PATCH 078/384] Fix memory leak in audio (bug #249) --- src/modules/audio/openal/Source.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 60a857c99..d785a0470 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -65,6 +65,8 @@ namespace openal { stop(); alDeleteBuffers((type == TYPE_STATIC) ? 1 : MAX_BUFFERS, buffers); + if (decoder) + decoder->release(); } love::audio::Source * Source::copy() From f993fe99d39742c608dd11c1fb2bbf46844ed234 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 2 Jul 2011 16:24:58 +0200 Subject: [PATCH 079/384] Catch errors in getPixel and setPixel (bug #93) --- src/modules/image/wrap_ImageData.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/modules/image/wrap_ImageData.cpp b/src/modules/image/wrap_ImageData.cpp index a6f61c44e..5541f5217 100644 --- a/src/modules/image/wrap_ImageData.cpp +++ b/src/modules/image/wrap_ImageData.cpp @@ -51,7 +51,15 @@ namespace image ImageData * t = luax_checkimagedata(L, 1); int x = luaL_checkint(L, 2); int y = luaL_checkint(L, 3); - pixel c = t->getPixel(x, y); + pixel c; + try + { + pixel c = t->getPixel(x, y); + } + catch (love::Exception *e) + { + return luaL_error(L, "%s", e->what()); + } lua_pushnumber(L, c.r); lua_pushnumber(L, c.g); lua_pushnumber(L, c.b); @@ -69,7 +77,14 @@ namespace image c.g = luaL_checkint(L, 5); c.b = luaL_checkint(L, 6); c.a = luaL_checkint(L, 7); - t->setPixel(x, y, c); + try + { + t->setPixel(x, y, c); + } + catch (love::Exception *e) + { + return luaL_error(L, "%s", e->what()); + } return 0; } From 404a3d529cb35e71144001de50063451215e810a Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 2 Jul 2011 16:43:56 +0200 Subject: [PATCH 080/384] Make seek and tell thread-safe (bug #245) --- src/modules/audio/Source.h | 2 +- src/modules/audio/null/Source.cpp | 2 +- src/modules/audio/null/Source.h | 2 +- src/modules/audio/openal/Pool.cpp | 12 ++++++++++++ src/modules/audio/openal/Pool.h | 2 ++ src/modules/audio/openal/Source.cpp | 18 ++++++++++++++---- src/modules/audio/openal/Source.h | 4 +++- 7 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/modules/audio/Source.h b/src/modules/audio/Source.h index d9c803992..b91067638 100644 --- a/src/modules/audio/Source.h +++ b/src/modules/audio/Source.h @@ -73,7 +73,7 @@ namespace audio virtual float getVolume() const = 0; virtual void seek(float offset, Unit unit) = 0; - virtual float tell(Unit unit) const = 0; + virtual float tell(Unit unit) = 0; // all float * v must be of size 3 virtual void setPosition(float * v) = 0; diff --git a/src/modules/audio/null/Source.cpp b/src/modules/audio/null/Source.cpp index 96c14ac2c..4da104c23 100644 --- a/src/modules/audio/null/Source.cpp +++ b/src/modules/audio/null/Source.cpp @@ -105,7 +105,7 @@ namespace null { } - float Source::tell(Source::Unit) const + float Source::tell(Source::Unit) { return 0.0f; } diff --git a/src/modules/audio/null/Source.h b/src/modules/audio/null/Source.h index 0459301c1..0d5c5c2f6 100644 --- a/src/modules/audio/null/Source.h +++ b/src/modules/audio/null/Source.h @@ -58,7 +58,7 @@ namespace null virtual void setVolume(float volume); virtual float getVolume() const; virtual void seek(float offset, Unit unit); - virtual float tell(Unit unit) const; + virtual float tell(Unit unit); virtual void setPosition(float * v); virtual void getPosition(float * v) const; virtual void setVelocity(float * v); diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index 80a419602..036e1c3cf 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -237,6 +237,18 @@ namespace openal } } + 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); diff --git a/src/modules/audio/openal/Pool.h b/src/modules/audio/openal/Pool.h index 02f0eae27..3a662b37c 100644 --- a/src/modules/audio/openal/Pool.h +++ b/src/modules/audio/openal/Pool.h @@ -103,6 +103,8 @@ namespace openal void resume(Source * source); void rewind(); void rewind(Source * source); + void seek(Source * source, float offset, void * unit); + float tell(Source * source, void * unit); private: diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index d785a0470..122fc5019 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -221,11 +221,11 @@ namespace openal return volume; } - void Source::seek(float offset, Source::Unit unit) + void Source::seekAtomic(float offset, void * unit) { if (valid) { - switch (unit) { + switch (*((Source::Unit*) unit)) { case Source::UNIT_SAMPLES: if (type == TYPE_STREAM) { ALint buffer; @@ -249,13 +249,18 @@ namespace openal } } } + + void Source::seek(float offset, Source::Unit unit) + { + return pool->seek(this, offset, &unit); + } - float Source::tell(Source::Unit unit) const + float Source::tellAtomic(void * unit) const { if (valid) { float offset; - switch (unit) { + switch (*((Source::Unit*) unit)) { case Source::UNIT_SAMPLES: alGetSourcef(source, AL_SAMPLE_OFFSET, &offset); if (type == TYPE_STREAM) offset += offsetSamples; @@ -276,6 +281,11 @@ namespace openal return 0.0f; } + float Source::tell(Source::Unit unit) + { + return pool->tell(this, &unit); + } + void Source::setPosition(float * v) { if(valid) diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index af073cedb..5b281aac7 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -87,8 +87,10 @@ namespace openal 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 tell(Unit unit) const; + 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); From 5809f6b067c278a5385370916fef5416985b8c52 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 2 Jul 2011 10:52:45 -0500 Subject: [PATCH 081/384] remove the now-unnecessary SDL stuff from love.audio --- src/modules/audio/openal/Audio.h | 3 --- src/modules/audio/openal/Pool.cpp | 10 ---------- src/modules/audio/openal/Pool.h | 3 --- 3 files changed, 16 deletions(-) diff --git a/src/modules/audio/openal/Audio.h b/src/modules/audio/openal/Audio.h index 2479ceb5d..fe9f5fe83 100644 --- a/src/modules/audio/openal/Audio.h +++ b/src/modules/audio/openal/Audio.h @@ -27,9 +27,6 @@ #include #include -// SDL -#include - // LOVE #include @@ -954,6 +960,12 @@ common + + modules\graphics\opengl + + + modules\graphics\opengl + From 1274b5d55a1c2f5066986711af4be554ed4ef59d Mon Sep 17 00:00:00 2001 From: rude Date: Sun, 24 Jul 2011 18:40:22 +0200 Subject: [PATCH 112/384] Do not allow more than eight sizes and colors in ParticleSystem. This makes it less impossible to implement ParticleSystem as a vertex shader in the future. --- src/modules/graphics/opengl/wrap_ParticleSystem.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/modules/graphics/opengl/wrap_ParticleSystem.cpp b/src/modules/graphics/opengl/wrap_ParticleSystem.cpp index 1f4b7275c..bf9537903 100644 --- a/src/modules/graphics/opengl/wrap_ParticleSystem.cpp +++ b/src/modules/graphics/opengl/wrap_ParticleSystem.cpp @@ -147,6 +147,10 @@ namespace opengl { 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) { t->setSize(luax_checkfloat(L, 2)); } else { @@ -199,6 +203,9 @@ namespace opengl ParticleSystem * t = luax_checkparticlesystem(L, 1); size_t nColors = (lua_gettop(L) - 1) / 4; + if (nColors > 8) + return luaL_error(L, "At most eight (8) colors may be used."); + if (nColors == 1) { t->setColor(Color(luaL_checkint(L,2), luaL_checkint(L,3), From 9a4b92160585657347a8f9a7fe96fff443714d58 Mon Sep 17 00:00:00 2001 From: rude Date: Sun, 24 Jul 2011 18:47:13 +0200 Subject: [PATCH 113/384] Particles now have fixed origin. (ParticleSystem::SetPosition will only affect new particles, and existing particles will not gravitate against the new point). This is another requirement to implement ParticleSystem in GLSL. --- src/modules/graphics/opengl/ParticleSystem.cpp | 4 +++- src/modules/graphics/opengl/ParticleSystem.h | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/ParticleSystem.cpp b/src/modules/graphics/opengl/ParticleSystem.cpp index 2d8a5fe6a..a5044d6c5 100644 --- a/src/modules/graphics/opengl/ParticleSystem.cpp +++ b/src/modules/graphics/opengl/ParticleSystem.cpp @@ -95,6 +95,8 @@ namespace opengl max = direction + spread/2.0f; pLast->direction = (rand() / (float(RAND_MAX)+1)) * (max - min) + min; + pLast->origin = position; + min = speedMin; max = speedMax; float speed = (rand() / (float(RAND_MAX)+1)) * (max - min) + min; @@ -447,7 +449,7 @@ namespace opengl love::Vector ppos(p->position[0], p->position[1]); // Get vector from particle center to particle. - radial = ppos - position; + radial = ppos - p->origin; radial.normalize(); tangential = radial; diff --git a/src/modules/graphics/opengl/ParticleSystem.h b/src/modules/graphics/opengl/ParticleSystem.h index 0af4f0bd6..6514d1568 100644 --- a/src/modules/graphics/opengl/ParticleSystem.h +++ b/src/modules/graphics/opengl/ParticleSystem.h @@ -46,6 +46,9 @@ namespace opengl float position[2]; float direction; + // Particles gravitate towards this point. + love::Vector origin; + love::Vector speed; float gravity; float radialAcceleration; From 8fe3f73660755d66b2dc7f6d6f79c59bf37e231c Mon Sep 17 00:00:00 2001 From: Donald Johnson Date: Tue, 2 Aug 2011 04:35:06 -0500 Subject: [PATCH 114/384] Dependency documentation added to readme. Just copied from the checks in configure.in. Specific features might be missing. --- readme.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/readme.txt b/readme.txt index 3a05a7c05..e386f6014 100644 --- a/readme.txt +++ b/readme.txt @@ -26,6 +26,19 @@ Windows: OSX: Use the XCode project in platform/macosx. +Dependencies +------------ +-SDL +-OpenGL +-OpenAL +-Lua +-LuaJIT +-DevIL with MNG and TIFF +-FreeType +-PhysicsFS +-ModPlug +-mpg123 +-Vorbisfile ! WARNING ! ----------- From 69f12bf89988eae1f4b3f7d5535c459365fe9cf9 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 5 Aug 2011 12:29:42 +0200 Subject: [PATCH 115/384] Another fix for seeking in audio sources --- src/modules/audio/openal/Source.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 99e5ac1f9..38fb398a7 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -264,7 +264,6 @@ namespace openal // let's empty them. stopAtomic(false); playAtomic(); - toLoop = 0; } } } @@ -425,6 +424,7 @@ namespace openal } if (rewind) rewindAtomic(); + toLoop = 0; valid = false; } From 9ed59064166e7965eafd09bfb9293517d3c0c9b4 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 13:36:22 +0200 Subject: [PATCH 116/384] Fix lines iterator not closing opened files --- src/modules/filesystem/physfs/Filesystem.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 3c4cc8f63..108d1388e 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -524,6 +524,11 @@ namespace physfs // Set the beginning of the next line. if(!file->eof()) file->seek(newline+1); + else if(close) + { + file->close(); + file->release(); + } return 1; } @@ -534,7 +539,6 @@ namespace physfs file->release(); } - // else: (newline <= 0) return 0; } From e4f398604b19b56535031f2e01f7ce644a75480d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 13:39:54 +0200 Subject: [PATCH 117/384] Fix spelling misstake in setGrab wrapper --- src/modules/mouse/sdl/wrap_Mouse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/mouse/sdl/wrap_Mouse.cpp b/src/modules/mouse/sdl/wrap_Mouse.cpp index c99f0e7f3..2460c2547 100644 --- a/src/modules/mouse/sdl/wrap_Mouse.cpp +++ b/src/modules/mouse/sdl/wrap_Mouse.cpp @@ -89,7 +89,7 @@ namespace sdl return 1; } - int w_setGrap(lua_State * L) + int w_setGrab(lua_State * L) { bool b = luax_toboolean(L, 1); instance->setGrab(b); @@ -111,7 +111,7 @@ namespace sdl { "setVisible", w_setVisible }, { "isVisible", w_isVisible }, { "getPosition", w_getPosition }, - { "setGrab", w_setGrap }, + { "setGrab", w_setGrab }, { "isGrabbed", w_isGrabbed }, { 0, 0 } }; From defd6c5ee407effb21be219efda84a2ce8ff65da Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 13:42:57 +0200 Subject: [PATCH 118/384] Attempt to close open files when File objects are destroyed --- src/modules/filesystem/physfs/File.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/filesystem/physfs/File.cpp b/src/modules/filesystem/physfs/File.cpp index 678b687fc..0bb77e5d0 100644 --- a/src/modules/filesystem/physfs/File.cpp +++ b/src/modules/filesystem/physfs/File.cpp @@ -42,6 +42,8 @@ namespace physfs File::~File() { + if (mode != CLOSED) + close(); } bool File::open(Mode mode) From 416370b5955faf2e6e119d0a81681f0239712f30 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 14:02:37 +0200 Subject: [PATCH 119/384] Improve Source controls --- src/modules/audio/openal/Source.cpp | 20 +++++++++++++++----- src/modules/audio/openal/Source.h | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 38fb398a7..65d9113f8 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -34,8 +34,8 @@ 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), looping(false), offsetSamples(0), offsetSeconds(0), - decoder(0), toLoop(0) + pitch(1.0f), volume(1.0f), looping(false), paused(false), offsetSamples(0), + offsetSeconds(0), decoder(0), toLoop(0) { alGenBuffers(1, buffers); ALenum fmt = getFormat(soundData->getChannels(), soundData->getBits()); @@ -50,8 +50,8 @@ namespace openal Source::Source(Pool * pool, love::sound::Decoder * decoder) : love::audio::Source(Source::TYPE_STREAM), pool(pool), valid(false), - pitch(1.0f), volume(1.0f), looping(false), offsetSamples(0), offsetSeconds(0), - decoder(decoder), toLoop(0) + pitch(1.0f), volume(1.0f), looping(false), paused(false), offsetSamples(0), + offsetSeconds(0), decoder(decoder), toLoop(0) { decoder->retain(); alGenBuffers(MAX_BUFFERS, buffers); @@ -78,6 +78,12 @@ namespace openal void Source::play() { + if (valid && paused) + { + pool->resume(this); + return; + } + valid = pool->play(this, source); if(valid) @@ -433,14 +439,16 @@ namespace openal if(valid) { alSourcePause(source); + paused = true; } } void Source::resumeAtomic() { - if(valid) + if(valid && paused) { alSourcePlay(source); + paused = false; } } @@ -449,6 +457,8 @@ namespace openal if(valid && type == TYPE_STATIC) { alSourceRewind(source); + if (!paused) + alSourcePlay(source); } else if(valid && type == TYPE_STREAM) { diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index 07a86b5e1..83b050792 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -62,6 +62,7 @@ namespace openal float velocity[3]; float direction[3]; bool looping; + bool paused; float offsetSamples; float offsetSeconds; From 620d359331c4deda900fb84822c48bd4f04dac65 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 14:16:28 +0200 Subject: [PATCH 120/384] Add getRenderTarget (issue #257) --- src/modules/graphics/opengl/wrap_Graphics.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 683775d06..2c89f96d9 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -729,6 +729,19 @@ namespace opengl return 0; } + int w_getRenderTarget(lua_State * L) + { + Framebuffer *fbo = Framebuffer::current; + if (fbo) + { + fbo->retain(); + luax_newtype(L, "Framebuffer", GRAPHICS_FRAMEBUFFER_T, (void*) fbo); + } + else + lua_pushnil(L); + return 1; + } + int w_setPixelEffect(lua_State * L) { if (lua_isnoneornil(L,1)) { @@ -1175,6 +1188,7 @@ namespace opengl { "getMaxPointSize", w_getMaxPointSize }, { "newScreenshot", w_newScreenshot }, { "setRenderTarget", w_setRenderTarget }, + { "getRenderTarget", w_getRenderTarget }, { "setPixelEffect", w_setPixelEffect }, From 4165ac7e6616e56ea1de1c2da70e13e115ef4eba Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 14:22:00 +0200 Subject: [PATCH 121/384] Add love.event.quit --- src/modules/event/sdl/wrap_Event.cpp | 9 +++++++++ src/modules/event/sdl/wrap_Event.h | 1 + src/modules/graphics/opengl/wrap_Graphics.h | 1 + 3 files changed, 11 insertions(+) diff --git a/src/modules/event/sdl/wrap_Event.cpp b/src/modules/event/sdl/wrap_Event.cpp index 26c8046f1..8a519b780 100644 --- a/src/modules/event/sdl/wrap_Event.cpp +++ b/src/modules/event/sdl/wrap_Event.cpp @@ -183,6 +183,14 @@ namespace sdl return 0; } + int w_quit(lua_State * L) + { + static Event::Message m; + m.type = Event::TYPE_QUIT; + luax_pushboolean(L, instance->push(m)); + return 1; + } + // List of functions to wrap. static const luaL_Reg functions[] = { { "pump", w_pump }, @@ -190,6 +198,7 @@ namespace sdl { "wait", w_wait }, { "push", w_push }, { "clear", w_clear }, + { "quit", w_quit }, { 0, 0 } }; diff --git a/src/modules/event/sdl/wrap_Event.h b/src/modules/event/sdl/wrap_Event.h index d06401edb..b625641cf 100644 --- a/src/modules/event/sdl/wrap_Event.h +++ b/src/modules/event/sdl/wrap_Event.h @@ -36,6 +36,7 @@ namespace sdl 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); diff --git a/src/modules/graphics/opengl/wrap_Graphics.h b/src/modules/graphics/opengl/wrap_Graphics.h index 84fcf913a..4f216e3d4 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.h +++ b/src/modules/graphics/opengl/wrap_Graphics.h @@ -88,6 +88,7 @@ namespace opengl int w_getMaxPointSize(lua_State * L); int w_newScreenshot(lua_State * L); int w_setRenderTarget(lua_State * L); + int w_getRenderTarget(lua_State * L); int w_setPixelEffect(lua_State * L); int w_isSupported(lua_State * L); int w_getGLSLVersion(lua_State * L); From 0d1da828b644d05af4eec32f86f3c282e6227d0e Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 14:24:56 +0200 Subject: [PATCH 122/384] Update changelog --- changes.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/changes.txt b/changes.txt index 50aaae942..af28d43b4 100644 --- a/changes.txt +++ b/changes.txt @@ -18,6 +18,8 @@ LOVE 0.8.0 [Rubber Piggy] * Added per-sprite colors on SpriteBatches. * Added pixel effects. * Added love.graphics.isSupported. + * Added love.graphics.getRenderTarget. + * Added love.event.quit. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. @@ -32,6 +34,9 @@ LOVE 0.8.0 [Rubber Piggy] * 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 Source controls inconsistencies. + * Fixed most leaking on unclosed File objects. * Renamed SpriteBatch's lock/unlock to bind/unbind. From fdc56e7e73e964d18381067803e8b1a073c510fe Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 14:44:49 +0200 Subject: [PATCH 123/384] Fix File:getSize crashing for a non-existent file --- changes.txt | 1 + src/modules/filesystem/physfs/wrap_File.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/changes.txt b/changes.txt index af28d43b4..21d59c7bf 100644 --- a/changes.txt +++ b/changes.txt @@ -37,6 +37,7 @@ LOVE 0.8.0 [Rubber Piggy] * Fixed love.filesystem.lines() leaking. * Fixed Source controls inconsistencies. * Fixed most leaking on unclosed File objects. + * Fixed crash when File:getSize() was called on a non-existent file. * Renamed SpriteBatch's lock/unlock to bind/unbind. diff --git a/src/modules/filesystem/physfs/wrap_File.cpp b/src/modules/filesystem/physfs/wrap_File.cpp index f8649b31a..437dcc5f4 100644 --- a/src/modules/filesystem/physfs/wrap_File.cpp +++ b/src/modules/filesystem/physfs/wrap_File.cpp @@ -37,7 +37,14 @@ namespace physfs int w_File_getSize(lua_State * L) { File * t = luax_checkfile(L, 1); - lua_pushinteger(L, t->getSize()); + try + { + lua_pushinteger(L, t->getSize()); + } + catch (Exception & e) + { + return luaL_error(L, e.what()); + } return 1; } From eae6c0ff8543f2cdbca36032a5f47a25a5865654 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 16:51:33 +0200 Subject: [PATCH 124/384] Remove duplicate lines_i, finally fix leak (issue #271) --- src/modules/filesystem/physfs/Filesystem.cpp | 2 +- src/modules/filesystem/physfs/wrap_File.cpp | 84 +------------------- src/modules/filesystem/physfs/wrap_File.h | 2 +- 3 files changed, 4 insertions(+), 84 deletions(-) diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 108d1388e..412f5991b 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -445,7 +445,7 @@ namespace physfs lua_pop(L, 1); luax_newtype(L, "File", FILESYSTEM_FILE_T, file, false); - lua_pushboolean(L, 1); // 1 = autoclose. + lua_pushnumber(L, 1); // 1 = autoclose. } else return luaL_error(L, "Expected filename."); diff --git a/src/modules/filesystem/physfs/wrap_File.cpp b/src/modules/filesystem/physfs/wrap_File.cpp index 437dcc5f4..217acce5a 100644 --- a/src/modules/filesystem/physfs/wrap_File.cpp +++ b/src/modules/filesystem/physfs/wrap_File.cpp @@ -162,7 +162,7 @@ namespace physfs if(luax_istype(L, 1, FILESYSTEM_FILE_T)) { file = luax_checktype(L, 1, "File", FILESYSTEM_FILE_T); - lua_pushboolean(L, 0); // 0 = do not close. + lua_pushnumber(L, 0); // 0 = do not close. } else return luaL_error(L, "Expected file handle."); @@ -171,90 +171,10 @@ namespace physfs if(!file->seek(0)) return luaL_error(L, "File does not appear to be open.\n"); - lua_pushcclosure(L, lines_i, 2); + lua_pushcclosure(L, Filesystem::lines_i, 2); return 1; } - int lines_i(lua_State * L) - { - // We're using a 1k buffer. - const static int bufsize = 1024; - static char buf[bufsize]; - - File * file = luax_checktype(L, lua_upvalueindex(1), "File", FILESYSTEM_FILE_T); - int close = (int)lua_tointeger(L, lua_upvalueindex(2)); - - // Find the next newline. - // pos must be at the start of the line we're trying to find. - int pos = file->tell(); - int newline = -1; - int totalread = 0; - - while(!file->eof()) - { - int current = file->tell(); - int read = file->read(buf, bufsize); - totalread += read; - - if(read < 0) - return luaL_error(L, "Readline failed!"); - - for(int i = 0;i 0) - break; - } - - // Special case for the last "line". - if(newline <= 0 && file->eof() && totalread > 0) - newline = pos + totalread; - - // We've got a newline. - if(newline > 0) - { - // Ok, we've got a line. - int linesize = (newline-pos); - - // Allocate memory for the string. - char * str = new char[linesize]; - - // Read it. - file->seek(pos); - if(file->read(str, linesize) == -1) - return luaL_error(L, "Read error."); - - if(str[linesize-1]=='\r') - linesize -= 1; - - lua_pushlstring(L, str, linesize); - - // Free the memory. Lua has a copy now. - delete[] str; - - // Set the beginning of the next line. - if(!file->eof()) - file->seek(newline+1); - - return 1; - } - - if(close) - { - file->close(); - file->release(); - } - - // else: (newline <= 0) - return 0; - } - static const luaL_Reg functions[] = { { "getSize", w_File_getSize }, { "open", w_File_open }, diff --git a/src/modules/filesystem/physfs/wrap_File.h b/src/modules/filesystem/physfs/wrap_File.h index c012ac343..5ea7c42e9 100644 --- a/src/modules/filesystem/physfs/wrap_File.h +++ b/src/modules/filesystem/physfs/wrap_File.h @@ -23,6 +23,7 @@ // LOVE #include +#include "Filesystem.h" #include "File.h" namespace love @@ -41,7 +42,6 @@ namespace physfs int w_File_tell(lua_State * L); int w_File_seek(lua_State * L); int w_File_lines(lua_State * L); - int lines_i(lua_State * L); int luaopen_file(lua_State * L); } // physfs } // filesystem From a79231f9f930f342bf19db1cef46a200d6000526 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 16:54:04 +0200 Subject: [PATCH 125/384] Catch exception in lines --- changes.txt | 2 +- src/modules/filesystem/physfs/wrap_Filesystem.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/changes.txt b/changes.txt index 21d59c7bf..183519c28 100644 --- a/changes.txt +++ b/changes.txt @@ -37,7 +37,7 @@ LOVE 0.8.0 [Rubber Piggy] * Fixed love.filesystem.lines() leaking. * Fixed Source controls inconsistencies. * Fixed most leaking on unclosed File objects. - * Fixed crash when File:getSize() was called on a non-existent file. + * Fixed crashes when operating on non-existent files. * Renamed SpriteBatch's lock/unlock to bind/unbind. diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index dfbfc0a8e..6786b90ed 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -221,7 +221,14 @@ namespace physfs int w_lines(lua_State * L) { - return instance->lines(L); + try + { + return instance->lines(L); + } + catch (Exception &e) + { + return luaL_error(L, e.what()); + } } int w_load(lua_State * L) From d3280ae55b22959f940f7e626c9363bcdb52dcf1 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 6 Aug 2011 17:14:52 +0200 Subject: [PATCH 126/384] Fix segfault in lines_i --- src/modules/filesystem/physfs/Filesystem.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 412f5991b..4b4af3db0 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -524,12 +524,7 @@ namespace physfs // Set the beginning of the next line. if(!file->eof()) file->seek(newline+1); - else if(close) - { - file->close(); - file->release(); - } - + return 1; } From 03f60e2bf394e4808a03f175ba9bf4c0174a8213 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 7 Aug 2011 13:54:36 +0200 Subject: [PATCH 127/384] Unbuffer when rewinding streaming sources (bug #250) --- src/modules/audio/openal/Source.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 65d9113f8..76dba16ca 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -265,11 +265,14 @@ namespace openal } 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(false); playAtomic(); + if (waspaused) + pauseAtomic(); } } } @@ -462,7 +465,15 @@ namespace openal } 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(false); + playAtomic(); + if (waspaused) + pauseAtomic(); offsetSamples = 0; offsetSeconds = 0; } From 7e06aebf66f8b3e650c2d67ea36889ff35c5abd0 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 7 Aug 2011 18:23:07 +0200 Subject: [PATCH 128/384] Work around PhysicsFS eof bug on windows (issue #272) --- src/modules/filesystem/physfs/File.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/modules/filesystem/physfs/File.cpp b/src/modules/filesystem/physfs/File.cpp index 0bb77e5d0..dbb0df43d 100644 --- a/src/modules/filesystem/physfs/File.cpp +++ b/src/modules/filesystem/physfs/File.cpp @@ -168,9 +168,23 @@ namespace physfs return write(data->getData(), (size == ALL) ? data->getSize() : size); } +#ifdef LOVE_WINDOWS + inline bool test_eof(File * this, PHYSFS_File *) + { + int pos = this->tell(); + int size = this->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 || PHYSFS_eof(file)) + if(file == 0 || test_eof(this, file)) return true; return false; } From 36f4d1c9dbfab3401e928fdd0615d81b946f563d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 7 Aug 2011 18:51:58 +0200 Subject: [PATCH 129/384] Update the readme (finally) --- readme.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ readme.txt | 50 ---------------------------------------- 2 files changed, 67 insertions(+), 50 deletions(-) create mode 100644 readme.md delete mode 100644 readme.txt diff --git a/readme.md b/readme.md new file mode 100644 index 000000000..f3e5a7e8e --- /dev/null +++ b/readme.md @@ -0,0 +1,67 @@ +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] for documentation. +If you need further help, feel free to ask on our [forums], and last but not least there's the irc channel [#love on Freenode][irc]. + +Compilation +----------- + +###Windows +Use the project files for Visual C++ 2008 or 2010 (2010 preferred) located in the platform dir. + +###*nix: +Run platform/unix/automagic, then run ./configure and 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: + +- For windows they are located [here][winbuilds]. +- For ubuntu linux they are in [ppa:bartbes/love-unstable][unstableppa] +- For arch linux there's [love-hg][aur] in the AUR. +- For other linuxes and OSX there are currently no official builds. + +Dependencies +------------ + +- SDL +- 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.freenode.net/love +[dependencies]: http://love2d.org/sdk +[winbuilds]: 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/readme.txt b/readme.txt deleted file mode 100644 index e386f6014..000000000 --- a/readme.txt +++ /dev/null @@ -1,50 +0,0 @@ -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. - -RUNNING GAMES -------------- - -In Windows or other graphical enviroments, just open the .love file you want to -run with the love binary, such as love.exe. (~^-^)~ - -In a console, type "love" followed by the relative or absolute path to a directory -(or archive). - -Examples: - -* love mygame.love -* love /home/hax/ultragame - -Remember that what you are trying to run at least should contain the file "main.lua". - -Compilation ------------ - -Windows: - Use the project files for Visual C++ 2008 or 2010 (2010 preferred) located in the platform dir. -*nix: - Run platform/unix/automagic, then run ./configure and make. -OSX: - Use the XCode project in platform/macosx. - -Dependencies ------------- --SDL --OpenGL --OpenAL --Lua --LuaJIT --DevIL with MNG and TIFF --FreeType --PhysicsFS --ModPlug --mpg123 --Vorbisfile - -! WARNING ! ------------ - -This software is not complete. This is just a preview. Don't expect to find any -interface consistencies between releases at all. With each release, everything -you once knew and loved may be brutally murdered. By which I mean removed and/or -changed. - From 00cfaebab893f1cc8bd369d871a913b1c7c0adda Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 7 Aug 2011 18:55:36 +0200 Subject: [PATCH 130/384] Fixes for the readme --- readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index f3e5a7e8e..572cee508 100644 --- a/readme.md +++ b/readme.md @@ -3,8 +3,8 @@ LÖVE is an *awesome* framework you can use to make 2D games in Lua. It's free, Documentation ------------- -We use our [wiki] for documentation. -If you need further help, feel free to ask on our [forums], and last but not least there's the irc channel [#love on Freenode][irc]. +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 Freenode][irc]. Compilation ----------- @@ -12,10 +12,10 @@ Compilation ###Windows Use the project files for Visual C++ 2008 or 2010 (2010 preferred) located in the platform dir. -###*nix: +###*nix Run platform/unix/automagic, then run ./configure and make. -###OSX: +###OSX Use the XCode project in platform/macosx. For both Windows and OSX there are dependencies available [here][dependencies]. From 3da5b3fd46de2aef5d929d24c8b9d5cc0170cb9c Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 8 Aug 2011 15:32:34 +0200 Subject: [PATCH 131/384] Make the eof code compile on windows --- src/modules/filesystem/physfs/File.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/modules/filesystem/physfs/File.cpp b/src/modules/filesystem/physfs/File.cpp index dbb0df43d..5a9f242ac 100644 --- a/src/modules/filesystem/physfs/File.cpp +++ b/src/modules/filesystem/physfs/File.cpp @@ -169,10 +169,13 @@ namespace physfs } #ifdef LOVE_WINDOWS - inline bool test_eof(File * this, PHYSFS_File *) + // MSVC doesn't like the 'this' keyword + // well, we'll use 'that'. + // It zigs, we zag. + inline bool test_eof(File * that, PHYSFS_File *) { - int pos = this->tell(); - int size = this->getSize(); + int pos = that->tell(); + int size = that->getSize(); return pos == -1 || size == -1 || pos >= size; } #else From 0b0d8fe3e51a4fcf3350441f223c463598d4d762 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 8 Aug 2011 15:54:43 +0200 Subject: [PATCH 132/384] Unbreak stop (issue #250) --- src/modules/audio/openal/Source.cpp | 17 ++++++++--------- src/modules/audio/openal/Source.h | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 76dba16ca..4345d7ef0 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -65,7 +65,7 @@ namespace openal Source::~Source() { - stop(); + pool->stop(this); alDeleteBuffers((type == TYPE_STATIC) ? 1 : MAX_BUFFERS, buffers); if (decoder) decoder->release(); @@ -93,7 +93,10 @@ namespace openal void Source::stop() { if (!isStopped()) + { pool->stop(this); + rewind(); + } } void Source::pause() @@ -269,7 +272,7 @@ namespace openal // Because we still have old data // from before the seek in the buffers // let's empty them. - stopAtomic(false); + stopAtomic(); playAtomic(); if (waspaused) pauseAtomic(); @@ -407,7 +410,7 @@ namespace openal //but this prevents a horrible, horrible bug } - void Source::stopAtomic(bool rewind) + void Source::stopAtomic() { if(valid) { @@ -418,21 +421,17 @@ namespace openal else if(type == TYPE_STREAM) { alSourceStop(source); - int queued = 0; alGetSourcei(source, AL_BUFFERS_QUEUED, &queued); - while(queued--) + while (queued--) { ALuint buffer; alSourceUnqueueBuffers(source, 1, &buffer); } } - alSourcei(source, AL_BUFFER, AL_NONE); } - if (rewind) - rewindAtomic(); toLoop = 0; valid = false; } @@ -470,7 +469,7 @@ namespace openal // Because we still have old data // from before the seek in the buffers // let's empty them. - stopAtomic(false); + stopAtomic(); playAtomic(); if (waspaused) pauseAtomic(); diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index 83b050792..c84d35b08 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -105,7 +105,7 @@ namespace openal bool isStatic() const; void playAtomic(); - void stopAtomic(bool rewind = true); + void stopAtomic(); void pauseAtomic(); void resumeAtomic(); void rewindAtomic(); From c47a7c563b2533664c66a27a0df9d92a50ab481d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 8 Aug 2011 16:26:38 +0200 Subject: [PATCH 133/384] REALLY fix stopping sources --- src/modules/audio/openal/Pool.cpp | 7 +++++++ src/modules/audio/openal/Pool.h | 1 + src/modules/audio/openal/Source.cpp | 8 +++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index ff0cec43d..c9c81e64e 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -209,6 +209,13 @@ namespace openal 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); diff --git a/src/modules/audio/openal/Pool.h b/src/modules/audio/openal/Pool.h index b8a00dd75..03d650ec8 100644 --- a/src/modules/audio/openal/Pool.h +++ b/src/modules/audio/openal/Pool.h @@ -100,6 +100,7 @@ namespace openal 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); diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 4345d7ef0..40f6f697a 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -95,7 +95,7 @@ namespace openal if (!isStopped()) { pool->stop(this); - rewind(); + pool->softRewind(this); } } @@ -476,6 +476,12 @@ namespace openal offsetSamples = 0; offsetSeconds = 0; } + else if (type == TYPE_STREAM) + { + decoder->rewind(); + offsetSamples = 0; + offsetSeconds = 0; + } } void Source::reset(ALenum source) From 480f936815402da18a37b90c62c6935a1180c342 Mon Sep 17 00:00:00 2001 From: rude Date: Fri, 12 Aug 2011 11:35:14 +0200 Subject: [PATCH 134/384] Added 'VertexBuffer' abstraction. SpriteBatches are now always supported. Also improved memory usage in SpriteBatch. (No need to retain full copy of sprites in memory. Can read that data back later to save data from OpenGL context destruction). --- platform/msvc2010/love.vcxproj | 2 + platform/msvc2010/love.vcxproj.filters | 6 + src/modules/graphics/Graphics.cpp | 1 - src/modules/graphics/Graphics.h | 1 - src/modules/graphics/opengl/SpriteBatch.cpp | 198 +++++------- src/modules/graphics/opengl/SpriteBatch.h | 27 +- src/modules/graphics/opengl/VertexBuffer.cpp | 237 +++++++++++++++ src/modules/graphics/opengl/VertexBuffer.h | 287 ++++++++++++++++++ src/modules/graphics/opengl/wrap_Graphics.cpp | 4 - 9 files changed, 621 insertions(+), 142 deletions(-) create mode 100644 src/modules/graphics/opengl/VertexBuffer.cpp create mode 100644 src/modules/graphics/opengl/VertexBuffer.h diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 159f5335c..4abc36f8c 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -104,6 +104,7 @@ + @@ -270,6 +271,7 @@ + diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index f90f350c5..aeb7c8138 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -595,6 +595,9 @@ modules\graphics\opengl + + modules\graphics\opengl + @@ -966,6 +969,9 @@ modules\graphics\opengl + + modules\graphics\opengl + diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index 644f3e513..540a7c693 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -153,7 +153,6 @@ namespace graphics { { "framebuffers", Graphics::SUPPORT_FRAMEBUFFERS }, { "pixeleffects", Graphics::SUPPORT_PIXELEFFECTS }, - { "spritebatches", Graphics::SUPPORT_SPRITEBATCHES } }; StringMap Graphics::support(Graphics::supportEntries, sizeof(Graphics::supportEntries)); diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index 29837489c..e48edaca1 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -82,7 +82,6 @@ namespace graphics { SUPPORT_FRAMEBUFFERS = 1, SUPPORT_PIXELEFFECTS, - SUPPORT_SPRITEBATCHES, SUPPORT_MAX_ENUM }; diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index 041aa7b0e..3bbe050d1 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -26,6 +26,7 @@ // LOVE #include "Image.h" #include "Quad.h" +#include "VertexBuffer.h" namespace love { @@ -34,80 +35,68 @@ namespace graphics namespace opengl { SpriteBatch::SpriteBatch(Image * image, int size, int usage) - : image(image), size(size), next(0), usage(usage), lockp(0), color(0) + : image(image) + , size(size) + , next(0) + , color(0) + , array_buf(0) + , element_buf(0) { - if (!(GLEE_ARB_vertex_buffer_object || GLEE_VERSION_1_5)) - throw love::Exception("Your OpenGL version does not support SpriteBatches. Go upgrade!"); - image->retain(); - vertices = new vertex[size*4]; - indices = new GLushort[size*6]; + GLenum gl_usage; - for(int i = 0; i(element_buf->map(GL_WRITE_ONLY)); + + if (indices) + { + for (int i = 0; i < size; ++i) + { + indices[i*6+0] = 0+(i*4); + indices[i*6+1] = 1+(i*4); + indices[i*6+2] = 2+(i*4); + + indices[i*6+3] = 0+(i*4); + indices[i*6+4] = 2+(i*4); + indices[i*6+5] = 3+(i*4); + } + } + + element_buf->unmap(); + } } SpriteBatch::~SpriteBatch() { image->release(); - if(vbo[0] != 0 && vbo[1] != 0) - glDeleteBuffers(2, vbo); - - delete [] vertices; - delete [] indices; delete color; - } - - bool SpriteBatch::isSupported() - { - return (GLEE_ARB_vertex_buffer_object || GLEE_VERSION_1_5); - } - - bool SpriteBatch::loadVolatile() - { - // Find out which OpenGL VBO usage hint to use. - gl_usage = GL_STREAM_DRAW_ARB; - gl_usage = (usage == USAGE_DYNAMIC) ? GL_DYNAMIC_DRAW_ARB : gl_usage; - gl_usage = (usage == USAGE_STATIC) ? GL_STATIC_DRAW_ARB : gl_usage; - gl_usage = (usage == USAGE_STREAM) ? GL_STREAM_DRAW_ARB : gl_usage; - - glGenBuffersARB(2, vbo); - - glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]); - glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertex)*size*4, vertices, gl_usage); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[1]); - glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLushort)*size*6, indices, GL_STATIC_DRAW_ARB); - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); - - return true; - } - - void SpriteBatch::unloadVolatile() - { - vertex * v = (vertex *)lock(); - - // Copy to system memory. - memcpy(vertices, v, sizeof(vertex)*size*4); - - unlock(); - - // Delete the buffers. - if(vbo[0] != 0 && vbo[1] != 0) - glDeleteBuffersARB(2, vbo); + delete array_buf; + delete element_buf; } void SpriteBatch::add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky) @@ -115,21 +104,18 @@ namespace opengl // Only do this if there's a free slot. if(next < size) { - // Get a pointer to the correct insertion position. - vertex * v = vertices + next*4; - // Needed for texture coordinates. - memcpy(v, image->getVertices(), sizeof(vertex)*4); + memcpy(sprite, image->getVertices(), sizeof(vertex)*4); // Transform. Matrix t; t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); - t.transform(v, v, 4); + t.transform(sprite, sprite, 4); if (color) - setColorv(v, *color); + setColorv(sprite, *color); - addv(v); + addv(sprite); // Increment counter. next++; @@ -141,21 +127,18 @@ namespace opengl // Only do this if there's a free slot. if(next < size) { - // Get a pointer to the correct insertion position. - vertex * v = vertices + next*4; - // Needed for colors. - memcpy(v, quad->getVertices(), sizeof(vertex)*4); + memcpy(sprite, quad->getVertices(), sizeof(vertex)*4); // Transform. Matrix t; t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); - t.transform(v, v, 4); + t.transform(sprite, sprite, 4); if (color) - setColorv(v, *color); + setColorv(sprite, *color); - addv(v); + addv(sprite); // Increment counter. next++; @@ -170,22 +153,16 @@ namespace opengl void * SpriteBatch::lock() { - // If already locked, prevent from locking again. - if(lockp != 0) - return lockp; + VertexArray::Bind bind(*array_buf); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]); - lockp = (vertex *)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - return lockp; + return array_buf->map(GL_READ_WRITE); } void SpriteBatch::unlock() { - glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]); - glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); - lockp = 0; - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); + VertexArray::Bind bind(*array_buf); + + array_buf->unmap(); } void SpriteBatch::setImage(Image * newimage) @@ -211,6 +188,10 @@ namespace opengl void SpriteBatch::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const { + const int color_offset = 0; + const int vertex_offset = sizeof(unsigned char) * 4; + const int texel_offset = sizeof(unsigned char) * 4 + sizeof(float) * 2; + static Matrix t; glPushMatrix(); @@ -220,51 +201,38 @@ namespace opengl image->bind(); - // Enable vertex arrays. - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - // Bind the VBO buffer. - glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]); - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[1]); + VertexBuffer::Bind array_bind(*array_buf); + VertexBuffer::Bind element_bind(*element_buf); // Apply per-sprite color, if a color is set. if (color) { glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(vertex), 0); + glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(vertex), array_buf->getPointer(color_offset)); } - glVertexPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)(sizeof(unsigned char)*4)); - glTexCoordPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)(sizeof(unsigned char)*4+sizeof(float)*2)); - - glDrawElements(GL_TRIANGLES, next*6, GL_UNSIGNED_SHORT, 0); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, sizeof(vertex), array_buf->getPointer(vertex_offset)); + + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glTexCoordPointer(2, GL_FLOAT, sizeof(vertex), array_buf->getPointer(texel_offset)); + + glDrawElements(GL_TRIANGLES, next*6, GL_UNSIGNED_SHORT, element_buf->getPointer(0)); - // Disable vertex arrays. - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); - - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); glPopMatrix(); } void SpriteBatch::addv(const vertex * v) { - if(lockp != 0) - { - // Copy into mapped memory if buffer is locked. - memcpy(lockp + (next*4), v, sizeof(vertex)*4); - } - else - { - // ... use glBufferSubData otherwise. - glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]); - glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, (next*4)*sizeof(vertex), sizeof(vertex)*4, v); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - } + int sprite_size = sizeof(vertex) * 4; + + VertexArray::Bind bind(*array_buf); + + array_buf->fill(next * sprite_size, sprite_size, v); } void SpriteBatch::setColorv(vertex * v, const Color & color) diff --git a/src/modules/graphics/opengl/SpriteBatch.h b/src/modules/graphics/opengl/SpriteBatch.h index 58599ea1a..0c5fd55c0 100644 --- a/src/modules/graphics/opengl/SpriteBatch.h +++ b/src/modules/graphics/opengl/SpriteBatch.h @@ -46,8 +46,9 @@ namespace opengl // Forward declarations. class Image; class Quad; + class VertexBuffer; - class SpriteBatch : public Drawable, public Volatile + class SpriteBatch : public Drawable { private: @@ -59,25 +60,15 @@ namespace opengl // The next free element. int next; - GLuint vbo[2]; - - // Vertex Buffer. - vertex * vertices; - - // Index buffer. - GLushort * indices; - - // The uage hint for the vertex buffer. - int usage; - int gl_usage; - - // If the buffer is locked, this pointer is nonzero. - vertex * lockp; + vertex sprite[4]; // Current color. This color, if present, will be applied to the next // added quad. Color * color; + VertexBuffer *array_buf; + VertexBuffer *element_buf; + public: enum UsageHint @@ -90,12 +81,6 @@ namespace opengl SpriteBatch(Image * image, int size, int usage); virtual ~SpriteBatch(); - static bool isSupported(); - - // Implements Volatile. - bool loadVolatile(); - void unloadVolatile(); - void add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky); void addq(Quad * quad, float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky); void clear(); diff --git a/src/modules/graphics/opengl/VertexBuffer.cpp b/src/modules/graphics/opengl/VertexBuffer.cpp new file mode 100644 index 000000000..0bcb622b8 --- /dev/null +++ b/src/modules/graphics/opengl/VertexBuffer.cpp @@ -0,0 +1,237 @@ +/** +* 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. +**/ + +#include "VertexBuffer.h" + +#include "common/Exception.h" + +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + // VertexBuffer + + VertexBuffer *VertexBuffer::Create(int size, GLenum target, GLenum usage) + { + try + { + // Try to create a VBO. + return new VBO(size, target, usage); + + } catch (const love::Exception &e) + { + (void)e; + + // VBO not supported ... create regular array. + return new VertexArray(size, target, usage); + } + } + + VertexBuffer::VertexBuffer(int size, GLenum target, GLenum usage) + : size(size) + , target(target) + , usage(usage) + { + } + + VertexBuffer::~VertexBuffer() + { + } + + // VertexBuffer::Bind + + VertexBuffer::Bind::Bind(VertexBuffer &buf) + : buf(buf) + { + buf.bind(); + } + + VertexBuffer::Bind::~Bind() + { + buf.unbind(); + } + + // VertexArray + + VertexArray::VertexArray(int size, GLenum target, GLenum usage) + : VertexBuffer(size, target, usage) + , buf(new char[size]) + { + } + + VertexArray::~VertexArray() + { + delete [] buf; + } + + void *VertexArray::map(GLenum access) + { + return buf; + } + + void VertexArray::unmap() + { + } + + void VertexArray::bind() + { + } + + void VertexArray::unbind() + { + } + + void VertexArray::fill(int offset, int size, const void *data) + { + memcpy(buf + offset, data, size); + } + + const void *VertexArray::getPointer(int offset) const + { + return buf + offset; + } + + // VBO + + VBO::VBO(int size, GLenum target, GLenum usage) + : VertexBuffer(size, target, usage) + , vbo(0) + , buffer_copy(0) + , mapped(0) + { + if (!(GLEE_ARB_vertex_buffer_object || GLEE_VERSION_1_5)) + throw love::Exception("Not supported"); + + bool ok = load(false); + + if (!ok) + throw love::Exception("Could not load VBO."); + } + + VBO::~VBO() + { + if (vbo != 0) + unload(false); + } + + void *VBO::map(GLenum access) + { + // Don't map twice. + if (mapped) + return mapped; + + mapped = glMapBufferARB(getTarget(), access); + + return mapped; + } + + void VBO::unmap() + { + glUnmapBufferARB(getTarget()); + mapped = 0; + } + + void VBO::bind() + { + glBindBufferARB(getTarget(), vbo); + } + + void VBO::unbind() + { + glBindBufferARB(getTarget(), 0); + } + + void VBO::fill(int offset, int size, const void *data) + { + if (mapped) + memcpy(static_cast(mapped) + offset, data, size); + else + glBufferSubDataARB(getTarget(), offset, size, data); + } + + const void *VBO::getPointer(int offset) const + { + return reinterpret_cast(offset); + } + + bool VBO::loadVolatile() + { + return load(true); + } + + void VBO::unloadVolatile() + { + unload(true); + } + + bool VBO::load(bool restore) + { + glGenBuffersARB(1, &vbo); + + VertexBuffer::Bind bind(*this); + + // Copy the old buffer only if 'restore' was requested. + const GLvoid *src = restore ? buffer_copy : 0; + + // Note that if 'src' is '0', no data will be copied. + glBufferDataARB(getTarget(), getSize(), src, getUsage()); + + // Clean up buffer_copy, if it exists. + delete[] buffer_copy; + buffer_copy = 0; + + return true; + } + + void VBO::unload(bool save) + { + // Clean up buffer_copy, if it exists. + delete[] buffer_copy; + buffer_copy = 0; + + // Save data before unloading. + if (save) + { + VertexBuffer::Bind bind(*this); + + GLint size; + glGetBufferParameterivARB(getTarget(), GL_BUFFER_SIZE, &size); + + const char *src = static_cast(map(GL_READ_ONLY)); + + if (src) + { + buffer_copy = new char[size]; + memcpy(buffer_copy, src, size); + unmap(); + } + } + + glDeleteBuffers(1, &vbo); + vbo = 0; + } + +} // opengl +} // graphics +} // love diff --git a/src/modules/graphics/opengl/VertexBuffer.h b/src/modules/graphics/opengl/VertexBuffer.h new file mode 100644 index 000000000..efe58339a --- /dev/null +++ b/src/modules/graphics/opengl/VertexBuffer.h @@ -0,0 +1,287 @@ +/** +* 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_OPENGL_VERTEX_BUFFER_H +#define LOVE_GRAPHICS_OPENGL_VERTEX_BUFFER_H + +// LOVE +#include + +// OpenGL +#include "GLee.h" +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + /** + * VertexBuffer is an abstraction over VBOs (Vertex Buffer Objecys), 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: + + /** + * 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. + * @return A new VertexBuffer. + */ + static VertexBuffer *Create(int size, GLenum target, GLenum usage); + + /** + * 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. + */ + VertexBuffer(int size, GLenum target, GLenum usage); + + /** + * Destructor. Does nothing, but must be declared virtual. + */ + virtual ~VertexBuffer(); + + /** + * Get the size of the VertexBuffer, in bytes. + * + * @return The size of the VertexBuffer. + */ + int 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; } + + /** + * 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. + * + * @param access GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE. + * @return A pointer to memory which represents the buffer. + */ + virtual void *map(GLenum access) = 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 the specified target. + * (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER). + * + * @param target GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER. + */ + 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(int offset, int 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(int 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); + + /** + * Unbinds a VertexBuffer. + */ + ~Bind(); + + private: + + // VertexBuffer to work on. + VertexBuffer &buf; + }; + + private: + + // The size of the buffer, in bytes. + int size; + + // The target buffer object. (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER). + GLenum target; + + // Usage hint. GL_[DYNAMIC, STATIC, STREAM]_DRAW. + GLenum usage; + }; + + /** + * 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) + */ + VertexArray(int size, GLenum target, GLenum usage); + + /** + * Frees the data we've allocated. + */ + virtual ~VertexArray(); + + // Implements VertexBuffer. + virtual void *map(GLenum access); + virtual void unmap(); + virtual void bind(); + virtual void unbind(); + virtual void fill(int offset, int size, const void *data); + virtual const void *getPointer(int 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(int, GLenum, GLenum) + */ + VBO(int size, GLenum target, GLenum usage); + + /** + * Deletes the VBOs from OpenGL. + */ + virtual ~VBO(); + + // Implements VertexBuffer. + virtual void *map(GLenum access); + virtual void unmap(); + virtual void bind(); + virtual void unbind(); + virtual void fill(int offset, int size, const void *data); + virtual const void *getPointer(int 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; + + // *May* contain data saved by 'unload'. + char *buffer_copy; + + // A pointer to mapped memory. Zero if memory is currently + // not mapped. + void *mapped; + }; + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 2c89f96d9..c9ea82e26 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -774,10 +774,6 @@ namespace opengl if (!PixelEffect::isSupported()) supported = false; break; - case Graphics::SUPPORT_SPRITEBATCHES: - if (!SpriteBatch::isSupported()) - supported = false; - break; default: supported = false; } From 873a99aba1aedc3d000a0cbe0cd07e5482f0f91d Mon Sep 17 00:00:00 2001 From: rude Date: Fri, 12 Aug 2011 13:38:42 +0200 Subject: [PATCH 135/384] Add missing #include in VertexBuffer.cpp. --- src/modules/graphics/opengl/VertexBuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/graphics/opengl/VertexBuffer.cpp b/src/modules/graphics/opengl/VertexBuffer.cpp index 0bcb622b8..7953e28ea 100644 --- a/src/modules/graphics/opengl/VertexBuffer.cpp +++ b/src/modules/graphics/opengl/VertexBuffer.cpp @@ -23,6 +23,7 @@ #include "common/Exception.h" #include +#include namespace love { From 59a407bc6ddfedd6b02d88e0e3d80dd289b75818 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 12 Aug 2011 13:49:49 +0200 Subject: [PATCH 136/384] Add second loader for binary modules --- src/modules/filesystem/physfs/Filesystem.cpp | 7 +++ src/modules/filesystem/physfs/Filesystem.h | 1 + .../filesystem/physfs/wrap_Filesystem.cpp | 54 +++++++++++++++++++ .../filesystem/physfs/wrap_Filesystem.h | 4 ++ 4 files changed, 66 insertions(+) diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 4b4af3db0..f00d63165 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -67,6 +67,13 @@ namespace physfs releaseSet = true; } + bool Filesystem::isRelease() const + { + if (!releaseSet) + return false; + return release; + } + bool Filesystem::setIdentity( const char * ident ) { if(!isInited) diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index 327022886..d87881059 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -119,6 +119,7 @@ namespace physfs void init(const char * arg0); void setRelease(bool release); + bool isRelease() const; /** * This sets up the save directory. If the diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index 6786b90ed..c5575ffc0 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -297,6 +297,59 @@ namespace physfs return 1; } + inline const char * library_extension() + { +#ifdef LOVE_WINDOWS + return ".dll"; +#elif defined(LOVE_MACOSX) || defined(LOVE_MACOS) + return ".dylib"; +#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 (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->isRelease()) + 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 }, @@ -337,6 +390,7 @@ namespace physfs { instance = new Filesystem(); love::luax_register_searcher(L, loader); + love::luax_register_searcher(L, extloader); } catch(Exception & e) { diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.h b/src/modules/filesystem/physfs/wrap_Filesystem.h index a7307e355..5bd348081 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.h +++ b/src/modules/filesystem/physfs/wrap_Filesystem.h @@ -26,6 +26,9 @@ #include "wrap_File.h" #include "wrap_FileData.h" +// SDL +#include + namespace love { namespace filesystem @@ -60,6 +63,7 @@ namespace physfs int w_load(lua_State * L); int w_getLastModified(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 From 28b400879763828e8eeb64b7620228fe07c0bce2 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 12 Aug 2011 14:41:18 +0200 Subject: [PATCH 137/384] Rename Framebuffer to Canvas (issue #263). Move error reporting code. Error reporting now resides in Graphics::newCanvas() instead of the previous location wrap_newFramebuffer(). Changed error text for "Error in implementation" to point to a possible fix. --- src/common/runtime.cpp | 2 +- src/common/types.h | 4 +- .../opengl/{Framebuffer.cpp => Canvas.cpp} | 38 +++++----- .../opengl/{Framebuffer.h => Canvas.h} | 16 ++-- src/modules/graphics/opengl/Graphics.cpp | 51 +++++++++++-- src/modules/graphics/opengl/Graphics.h | 4 +- src/modules/graphics/opengl/PixelEffect.cpp | 4 +- src/modules/graphics/opengl/PixelEffect.h | 4 +- .../{wrap_Framebuffer.cpp => wrap_Canvas.cpp} | 76 +++++++++---------- src/modules/graphics/opengl/wrap_Canvas.h | 29 +++++++ .../graphics/opengl/wrap_Framebuffer.h | 29 ------- src/modules/graphics/opengl/wrap_Graphics.cpp | 62 +++++---------- src/modules/graphics/opengl/wrap_Graphics.h | 4 +- .../graphics/opengl/wrap_PixelEffect.cpp | 18 ++--- src/scripts/graphics.lua | 4 +- src/scripts/graphics.lua.h | 8 +- 16 files changed, 187 insertions(+), 166 deletions(-) rename src/modules/graphics/opengl/{Framebuffer.cpp => Canvas.cpp} (92%) rename src/modules/graphics/opengl/{Framebuffer.h => Canvas.h} (80%) rename src/modules/graphics/opengl/{wrap_Framebuffer.cpp => wrap_Canvas.cpp} (60%) create mode 100644 src/modules/graphics/opengl/wrap_Canvas.h delete mode 100644 src/modules/graphics/opengl/wrap_Framebuffer.h diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index 039573da8..47660db42 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -381,7 +381,7 @@ namespace love {"Font", GRAPHICS_FONT_ID}, {"ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_ID}, {"SpriteBatch", GRAPHICS_SPRITE_BATCH_ID}, - {"Framebuffer", GRAPHICS_FRAMEBUFFER_ID}, + {"Canvas", GRAPHICS_CANVAS_ID}, // Image {"ImageData", IMAGE_IMAGE_DATA_ID}, diff --git a/src/common/types.h b/src/common/types.h index 2aaec138b..214dc1313 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -49,7 +49,7 @@ namespace love GRAPHICS_FONT_ID, GRAPHICS_PARTICLE_SYSTEM_ID, GRAPHICS_SPRITE_BATCH_ID, - GRAPHICS_FRAMEBUFFER_ID, + GRAPHICS_CANVAS_ID, GRAPHICS_PIXELEFFECT_ID, // Image @@ -112,7 +112,7 @@ namespace love 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_FRAMEBUFFER_T = (bits(1) << GRAPHICS_FRAMEBUFFER_ID) | GRAPHICS_DRAWABLE_T; + const bits GRAPHICS_CANVAS_T = (bits(1) << GRAPHICS_CANVAS_ID) | GRAPHICS_DRAWABLE_T; const bits GRAPHICS_PIXELEFFECT_T = (bits(1) << GRAPHICS_PIXELEFFECT_ID) | OBJECT_T; // Image. diff --git a/src/modules/graphics/opengl/Framebuffer.cpp b/src/modules/graphics/opengl/Canvas.cpp similarity index 92% rename from src/modules/graphics/opengl/Framebuffer.cpp rename to src/modules/graphics/opengl/Canvas.cpp index e5ad3aeee..5d82d6637 100644 --- a/src/modules/graphics/opengl/Framebuffer.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -1,4 +1,4 @@ -#include "Framebuffer.h" +#include "Canvas.h" #include "Graphics.h" #include @@ -140,9 +140,9 @@ namespace opengl FramebufferStrategyEXT strategyEXT; - Framebuffer* Framebuffer::current = NULL; + Canvas* Canvas::current = NULL; - Framebuffer::Framebuffer(int width, int height) : + Canvas::Canvas(int width, int height) : width(width), height(height) { strategy = NULL; @@ -174,7 +174,7 @@ namespace opengl loadVolatile(); } - Framebuffer::~Framebuffer() + Canvas::~Canvas() { // reset framebuffer if still using this one if (current == this) @@ -183,7 +183,7 @@ namespace opengl unloadVolatile(); } - bool Framebuffer::isSupported() + bool Canvas::isSupported() { if (!strategy) { if (GLEE_VERSION_3_0 || GLEE_ARB_framebuffer_object) @@ -196,13 +196,13 @@ namespace opengl return (strategy != &strategyNone); } - void Framebuffer::bindDefaultBuffer() + void Canvas::bindDefaultCanvas() { if (current != NULL) current->stopGrab(); } - void Framebuffer::startGrab() + void Canvas::startGrab() { // already grabbing if (current == this) @@ -233,7 +233,7 @@ namespace opengl current = this; } - void Framebuffer::stopGrab() + void Canvas::stopGrab() { // i am not grabbing. leave me alone if (current != this) @@ -248,7 +248,7 @@ namespace opengl } - void Framebuffer::clear(const Color& c) + void Canvas::clear(const Color& c) { GLuint previous = 0; if (current != NULL) @@ -263,7 +263,7 @@ namespace opengl strategy->bindFBO(previous); } - void Framebuffer::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const + 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); @@ -284,7 +284,7 @@ namespace opengl glPopMatrix(); } - love::image::ImageData * Framebuffer::getImageData(love::image::Image * image) + love::image::ImageData * Canvas::getImageData(love::image::Image * image) { int row = 4 * width; int size = row * height; @@ -315,7 +315,7 @@ namespace opengl return img; } - void Framebuffer::setFilter(const Image::Filter &f) + void Canvas::setFilter(const Image::Filter &f) { GLint gmin = (f.min == Image::FILTER_NEAREST) ? GL_NEAREST : GL_LINEAR; GLint gmag = (f.mag == Image::FILTER_NEAREST) ? GL_NEAREST : GL_LINEAR; @@ -326,7 +326,7 @@ namespace opengl glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gmag); } - Image::Filter Framebuffer::getFilter() const + Image::Filter Canvas::getFilter() const { GLint gmin, gmag; @@ -340,7 +340,7 @@ namespace opengl return f; } - void Framebuffer::setWrap(const Image::Wrap &w) + void Canvas::setWrap(const Image::Wrap &w) { GLint wrap_s = (w.s == Image::WRAP_CLAMP) ? GL_CLAMP_TO_EDGE : GL_REPEAT; GLint wrap_t = (w.t == Image::WRAP_CLAMP) ? GL_CLAMP_TO_EDGE : GL_REPEAT; @@ -350,7 +350,7 @@ namespace opengl glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t); } - Image::Wrap Framebuffer::getWrap() const + Image::Wrap Canvas::getWrap() const { GLint wrap_s, wrap_t; glBindTexture(GL_TEXTURE_2D, img); @@ -364,7 +364,7 @@ namespace opengl return w; } - bool Framebuffer::loadVolatile() + bool Canvas::loadVolatile() { status = strategy->createFBO(fbo, depthbuffer, img, width, height); if (status != GL_FRAMEBUFFER_COMPLETE) @@ -378,19 +378,19 @@ namespace opengl return true; } - void Framebuffer::unloadVolatile() + void Canvas::unloadVolatile() { settings.filter = getFilter(); settings.wrap = getWrap(); strategy->deleteFBO(fbo, depthbuffer, img); } - int Framebuffer::getWidth() + int Canvas::getWidth() { return width; } - int Framebuffer::getHeight() + int Canvas::getHeight() { return height; } diff --git a/src/modules/graphics/opengl/Framebuffer.h b/src/modules/graphics/opengl/Canvas.h similarity index 80% rename from src/modules/graphics/opengl/Framebuffer.h rename to src/modules/graphics/opengl/Canvas.h index 13fafb4dd..dd69140e7 100644 --- a/src/modules/graphics/opengl/Framebuffer.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -1,5 +1,5 @@ -#ifndef LOVE_GRAPHICS_FRAMEBUFFER_H -#define LOVE_GRAPHICS_FRAMEBUFFER_H +#ifndef LOVE_GRAPHICS_CANVAS_H +#define LOVE_GRAPHICS_CANVAS_H #include #include @@ -16,18 +16,18 @@ namespace graphics { namespace opengl { - class Framebuffer : public Drawable, public Volatile + class Canvas : public Drawable, public Volatile { public: - Framebuffer(int width, int height); - virtual ~Framebuffer(); + Canvas(int width, int height); + virtual ~Canvas(); static bool isSupported(); unsigned int getStatus() const { return status; } - static Framebuffer* current; - static void bindDefaultBuffer(); + static Canvas* current; + static void bindDefaultCanvas(); void startGrab(); void stopGrab(); @@ -73,4 +73,4 @@ namespace opengl } // graphics } // love -#endif // LOVE_GRAPHICS_FRAMEBUFFER_H +#endif // LOVE_GRAPHICS_CANVAS_H diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 527c96708..0a38b2562 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -313,7 +313,7 @@ namespace opengl { DisplayState s; discardMask(); - Framebuffer::bindDefaultBuffer(); + Canvas::bindDefaultCanvas(); restoreState(s); } @@ -378,8 +378,8 @@ namespace opengl int Graphics::getRenderHeight() { - if (Framebuffer::current) - return Framebuffer::current->getHeight(); + if (Canvas::current) + return Canvas::current->getHeight(); return currentMode.height; } @@ -533,9 +533,50 @@ namespace opengl return new ParticleSystem(image, size); } - Framebuffer * Graphics::newFramebuffer(int width, int height) + Canvas * Graphics::newCanvas(int width, int height) { - return new Framebuffer(width, height); + Canvas * canvas = new Canvas(width, height); + GLenum err = canvas->getStatus(); + + // everything ok, reaturn 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 } PixelEffect * Graphics::newPixelEffect(const std::string& code) diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index 87d2c6183..bf2aa0c94 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -41,7 +41,7 @@ #include "Quad.h" #include "SpriteBatch.h" #include "ParticleSystem.h" -#include "Framebuffer.h" +#include "Canvas.h" #include "PixelEffect.h" namespace love @@ -287,7 +287,7 @@ namespace opengl ParticleSystem * newParticleSystem(Image * image, int size); - Framebuffer * newFramebuffer(int width, int height); + Canvas * newCanvas(int width, int height); PixelEffect * newPixelEffect(const std::string& code); diff --git a/src/modules/graphics/opengl/PixelEffect.cpp b/src/modules/graphics/opengl/PixelEffect.cpp index 90dfeb411..2737d3c2b 100644 --- a/src/modules/graphics/opengl/PixelEffect.cpp +++ b/src/modules/graphics/opengl/PixelEffect.cpp @@ -223,7 +223,7 @@ namespace opengl checkSetUniformError(); } - void PixelEffect::sendFramebuffer(const std::string& name, const Framebuffer& fb) + void PixelEffect::sendCanvas(const std::string& name, const Canvas& canvas) { GLint texture_unit = getTextureUnit(name); @@ -231,7 +231,7 @@ namespace opengl GLint location = getUniformLocation(name); glActiveTexture(GL_TEXTURE0 + texture_unit); - glBindTexture(GL_TEXTURE_2D, fb.getTextureName()); + glBindTexture(GL_TEXTURE_2D, canvas.getTextureName()); glUniform1i(location, texture_unit); // reset texture unit diff --git a/src/modules/graphics/opengl/PixelEffect.h b/src/modules/graphics/opengl/PixelEffect.h index 8e959b075..db439db4c 100644 --- a/src/modules/graphics/opengl/PixelEffect.h +++ b/src/modules/graphics/opengl/PixelEffect.h @@ -5,7 +5,7 @@ #include #include #include "Image.h" -#include "Framebuffer.h" +#include "Canvas.h" namespace love { @@ -31,7 +31,7 @@ namespace opengl void sendFloat(const std::string& name, int count, const GLfloat* vec); void sendMatrix(const std::string& name, int size, const GLfloat* m); void sendImage(const std::string& name, const Image& image); - void sendFramebuffer(const std::string& name, const Framebuffer& fb); + void sendCanvas(const std::string& name, const Canvas& canvas); private: GLint getUniformLocation(const std::string& name); diff --git a/src/modules/graphics/opengl/wrap_Framebuffer.cpp b/src/modules/graphics/opengl/wrap_Canvas.cpp similarity index 60% rename from src/modules/graphics/opengl/wrap_Framebuffer.cpp rename to src/modules/graphics/opengl/wrap_Canvas.cpp index e3fbcf547..5eb9f6070 100644 --- a/src/modules/graphics/opengl/wrap_Framebuffer.cpp +++ b/src/modules/graphics/opengl/wrap_Canvas.cpp @@ -1,5 +1,5 @@ #include "Graphics.h" -#include "wrap_Framebuffer.h" +#include "wrap_Canvas.h" namespace love { @@ -7,44 +7,44 @@ namespace graphics { namespace opengl { - Framebuffer * luax_checkfbo(lua_State * L, int idx) + Canvas * luax_checkcanvas(lua_State * L, int idx) { - return luax_checktype(L, idx, "Framebuffer", GRAPHICS_FRAMEBUFFER_T); + return luax_checktype(L, idx, "Canvas", GRAPHICS_CANVAS_T); } - int w_Framebuffer_renderTo(lua_State * L) + int w_Canvas_renderTo(lua_State * L) { // As startGrab() clears the framebuffer, better not allow // grabbing inside another grabbing - if (Framebuffer::current != NULL) { - Framebuffer::bindDefaultBuffer(); - return luaL_error(L, "Current render target not the default framebuffer!"); + if (Canvas::current != NULL) { + Canvas::bindDefaultCanvas(); + return luaL_error(L, "Current render target not the default canvas!"); } - Framebuffer * fbo = luax_checkfbo(L, 1); + Canvas * canvas = luax_checkcanvas(L, 1); if (!lua_isfunction(L, 2)) - return luaL_error(L, "Need a function to render to fbo"); + return luaL_error(L, "Need a function to render to canvas."); - fbo->startGrab(); + canvas->startGrab(); lua_settop(L, 2); // make sure the function is on top of the stack lua_call(L, 0, 0); - fbo->stopGrab(); + canvas->stopGrab(); return 0; } - int w_Framebuffer_getImageData(lua_State * L) + int w_Canvas_getImageData(lua_State * L) { - Framebuffer * fbo = luax_checkfbo(L, 1); + Canvas * canvas = luax_checkcanvas(L, 1); love::image::Image * image = luax_getmodule(L, "image", MODULE_IMAGE_T); - love::image::ImageData * img = fbo->getImageData( image ); + love::image::ImageData * img = canvas->getImageData( image ); luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *)img); return 1; } - int w_Framebuffer_setFilter(lua_State * L) + int w_Canvas_setFilter(lua_State * L) { - Framebuffer * fbo = luax_checkfbo(L, 1); + Canvas * canvas = luax_checkcanvas(L, 1); const char * minstr = luaL_checkstring(L, 2); const char * magstr = luaL_checkstring(L, 3); @@ -54,14 +54,14 @@ namespace opengl if (!Image::getConstant(magstr, f.mag)) return luaL_error(L, "Invalid max filter mode: %s", magstr); - fbo->setFilter(f); + canvas->setFilter(f); return 0; } - int w_Framebuffer_getFilter(lua_State * L) + int w_Canvas_getFilter(lua_State * L) { - Framebuffer * fbo = luax_checkfbo(L, 1); - Image::Filter f = fbo->getFilter(); + Canvas * canvas = luax_checkcanvas(L, 1); + Image::Filter f = canvas->getFilter(); const char * minstr; const char * magstr; @@ -74,9 +74,9 @@ namespace opengl return 2; } - int w_Framebuffer_setWrap(lua_State * L) + int w_Canvas_setWrap(lua_State * L) { - Framebuffer * fbo = luax_checkfbo(L, 1); + Canvas * canvas = luax_checkcanvas(L, 1); const char * wrap_s = luaL_checkstring(L, 2); const char * wrap_t = luaL_checkstring(L, 3); @@ -86,14 +86,14 @@ namespace opengl if (!Image::getConstant(wrap_t, w.t)) return luaL_error(L, "Invalid wrap mode: %s", wrap_t); - fbo->setWrap(w); + canvas->setWrap(w); return 0; } - int w_Framebuffer_getWrap(lua_State * L) + int w_Canvas_getWrap(lua_State * L) { - Framebuffer * fbo = luax_checkfbo(L, 1); - Image::Wrap w = fbo->getWrap(); + Canvas * canvas = luax_checkcanvas(L, 1); + Image::Wrap w = canvas->getWrap(); const char * wrap_s; const char * wrap_t; @@ -106,9 +106,9 @@ namespace opengl return 2; } - int w_Framebuffer_clear(lua_State * L) + int w_Canvas_clear(lua_State * L) { - Framebuffer * fbo = luax_checkfbo(L, 1); + Canvas * canvas = luax_checkcanvas(L, 1); Color c; if (lua_isnoneornil(L, 2)) { c.r = 0; @@ -135,25 +135,25 @@ namespace opengl c.b = (unsigned char)luaL_checkint(L, 4); c.a = (unsigned char)luaL_optint(L, 5, 255); } - fbo->clear(c); + canvas->clear(c); return 0; } static const luaL_Reg functions[] = { - { "renderTo", w_Framebuffer_renderTo }, - { "getImageData", w_Framebuffer_getImageData }, - { "setFilter", w_Framebuffer_setFilter }, - { "getFilter", w_Framebuffer_getFilter }, - { "setWrap", w_Framebuffer_setWrap }, - { "getWrap", w_Framebuffer_getWrap }, - { "clear", w_Framebuffer_clear }, + { "renderTo", w_Canvas_renderTo }, + { "getImageData", w_Canvas_getImageData }, + { "setFilter", w_Canvas_setFilter }, + { "getFilter", w_Canvas_getFilter }, + { "setWrap", w_Canvas_setWrap }, + { "getWrap", w_Canvas_getWrap }, + { "clear", w_Canvas_clear }, { 0, 0 } }; - int luaopen_framebuffer(lua_State * L) + int luaopen_canvas(lua_State * L) { - return luax_register_type(L, "Framebuffer", functions); + return luax_register_type(L, "Canvas", functions); } } // opengl diff --git a/src/modules/graphics/opengl/wrap_Canvas.h b/src/modules/graphics/opengl/wrap_Canvas.h new file mode 100644 index 000000000..257b6c038 --- /dev/null +++ b/src/modules/graphics/opengl/wrap_Canvas.h @@ -0,0 +1,29 @@ +#ifndef LOVE_GRAPHICS_OPENGL_WRAP_CANVAS_H +#define LOVE_GRAPHICS_OPENGL_WRAP_CANVAS_H + +// LOVE +#include +#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_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 luaopen_canvas(lua_State * L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_CANVAS_H diff --git a/src/modules/graphics/opengl/wrap_Framebuffer.h b/src/modules/graphics/opengl/wrap_Framebuffer.h deleted file mode 100644 index 1433c2ade..000000000 --- a/src/modules/graphics/opengl/wrap_Framebuffer.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef LOVE_GRAPHICS_OPENGL_WRAP_FBO_H -#define LOVE_GRAPHICS_OPENGL_WRAP_FBO_H - -// LOVE -#include -#include "Framebuffer.h" - -namespace love -{ -namespace graphics -{ -namespace opengl -{ - //see Framebuffer.h - Framebuffer * luax_checkfbo(lua_State * L, int idx); - int w_Framebuffer_renderTo(lua_State * L); - int w_Framebuffer_getImageData(lua_State * L); - int w_Framebuffer_setFilter(lua_State * L); - int w_Framebuffer_getFilter(lua_State * L); - int w_Framebuffer_setWrap(lua_State * L); - int w_Framebuffer_getWrap(lua_State * L); - int w_Framebuffer_clear(lua_State * L); - int luaopen_framebuffer(lua_State * L); - -} // opengl -} // graphics -} // love - -#endif // LOVE_GRAPHICS_OPENGL_WRAP_FBO_H diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index c9ea82e26..dac9e1213 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -343,43 +343,24 @@ namespace opengl return 1; } - int w_newFramebuffer(lua_State * L) + 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()); glGetError(); // clear opengl error flag - Framebuffer * framebuffer = instance->newFramebuffer(width, height); - //and there we go with the status... still disliked - if (framebuffer->getStatus() != GL_FRAMEBUFFER_COMPLETE) { - switch (framebuffer->getStatus()) { - case GL_FRAMEBUFFER_UNSUPPORTED: - return luaL_error(L, "Cannot create Framebuffer: " - "Not supported by your OpenGL implementation"); - // 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: - return luaL_error(L, "Cannot create Framebuffer: " - "Error in implementation (please inform the love devs)"); - 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) - return luaL_error(L, "Cannot create Framebuffer: " - "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. - return luaL_error(L, "Cannot create Framebuffer: Aliens did it (OpenGL error code: %d)", glGetError()); - } + Canvas * canvas = NULL; + try { + canvas = instance->newCanvas(width, height); + } catch (Exception& e) { + return luaL_error(L, e.what()); } - luax_newtype(L, "Framebuffer", GRAPHICS_FRAMEBUFFER_T, (void*)framebuffer); + + if (NULL == canvas) + return luaL_error(L, "Canvas not created, but no error thrown. I don't even..."); + + luax_newtype(L, "Canvas", GRAPHICS_CANVAS_T, (void*)canvas); return 1; } @@ -718,24 +699,23 @@ namespace opengl { // called with nil or none -> reset to default buffer if (lua_isnoneornil(L,1)) { - Framebuffer::bindDefaultBuffer(); + Canvas::bindDefaultCanvas(); return 0; } - Framebuffer * fbo = luax_checkfbo(L, 1); + Canvas * canvas = luax_checkcanvas(L, 1); // this unbinds the previous fbo - fbo->startGrab(); + canvas->startGrab(); return 0; } int w_getRenderTarget(lua_State * L) { - Framebuffer *fbo = Framebuffer::current; - if (fbo) - { - fbo->retain(); - luax_newtype(L, "Framebuffer", GRAPHICS_FRAMEBUFFER_T, (void*) fbo); + Canvas *canvas = Canvas::current; + if (canvas) { + canvas->retain(); + luax_newtype(L, "Canvas", GRAPHICS_CANVAS_T, (void*) canvas); } else lua_pushnil(L); @@ -767,7 +747,7 @@ namespace opengl switch(support) { case Graphics::SUPPORT_FRAMEBUFFERS: - if (!Framebuffer::isSupported()) + if (!Canvas::isSupported()) supported = false; break; case Graphics::SUPPORT_PIXELEFFECTS: @@ -1156,7 +1136,7 @@ namespace opengl { "newImageFont", w_newImageFont }, { "newSpriteBatch", w_newSpriteBatch }, { "newParticleSystem", w_newParticleSystem }, - { "newFramebuffer", w_newFramebuffer }, + { "newCanvas", w_newCanvas }, { "newPixelEffect", w_newPixelEffect }, { "setColor", w_setColor }, @@ -1245,7 +1225,7 @@ namespace opengl luaopen_frame, luaopen_spritebatch, luaopen_particlesystem, - luaopen_framebuffer, + luaopen_canvas, luaopen_pixeleffect, 0 }; diff --git a/src/modules/graphics/opengl/wrap_Graphics.h b/src/modules/graphics/opengl/wrap_Graphics.h index 4f216e3d4..17a5a0a24 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.h +++ b/src/modules/graphics/opengl/wrap_Graphics.h @@ -27,7 +27,7 @@ #include "wrap_Quad.h" #include "wrap_SpriteBatch.h" #include "wrap_ParticleSystem.h" -#include "wrap_Framebuffer.h" +#include "wrap_Canvas.h" #include "wrap_PixelEffect.h" #include "Graphics.h" @@ -61,7 +61,7 @@ namespace opengl int w_newImageFont(lua_State * L); int w_newSpriteBatch(lua_State * L); int w_newParticleSystem(lua_State * L); - int w_newFramebuffer(lua_State * L); // comments in function + int w_newCanvas(lua_State * L); // comments in function int w_newPixelEffect(lua_State * L); int w_setColor(lua_State * L); int w_getColor(lua_State * L); diff --git a/src/modules/graphics/opengl/wrap_PixelEffect.cpp b/src/modules/graphics/opengl/wrap_PixelEffect.cpp index 907722d99..9e7e9d909 100644 --- a/src/modules/graphics/opengl/wrap_PixelEffect.cpp +++ b/src/modules/graphics/opengl/wrap_PixelEffect.cpp @@ -1,6 +1,6 @@ #include "wrap_PixelEffect.h" #include "wrap_Image.h" -#include "wrap_Framebuffer.h" +#include "wrap_Canvas.h" #include namespace love @@ -81,14 +81,14 @@ namespace opengl return 0; } - int w_PixelEffect_sendFramebuffer(lua_State * L) + int w_PixelEffect_sendCanvas(lua_State * L) { PixelEffect * effect = luax_checkpixeleffect(L, 1); const char* name = luaL_checkstring(L, 2); - Framebuffer* fb = luax_checkfbo(L, 3); + Canvas* canvas = luax_checkcanvas(L, 3); try { - effect->sendFramebuffer(name, *fb); + effect->sendCanvas(name, *canvas); } catch(love::Exception& e) { luaL_error(L, e.what()); } @@ -98,11 +98,11 @@ namespace opengl static const luaL_Reg functions[] = { - { "getWarnings", w_PixelEffect_getWarnings }, - { "sendFloat", w_PixelEffect_sendFloat }, - { "sendMatrix", w_PixelEffect_sendMatrix }, - { "sendImage", w_PixelEffect_sendImage }, - { "sendFramebuffer", w_PixelEffect_sendFramebuffer }, + { "getWarnings", w_PixelEffect_getWarnings }, + { "sendFloat", w_PixelEffect_sendFloat }, + { "sendMatrix", w_PixelEffect_sendMatrix }, + { "sendImage", w_PixelEffect_sendImage }, + { "sendCanvas", w_PixelEffect_sendCanvas }, { 0, 0 } }; diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index f6441c00d..ad2c07f5a 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -1324,8 +1324,8 @@ do self:sendFloat(name, value, ...) elseif type(value) == "userdata" and value:typeOf("Image") then self:sendImage(name, value) - elseif type(value) == "userdata" and value:typeOf("Framebuffer") then - self:sendFramebuffer(name, value) + elseif type(value) == "userdata" and value:typeOf("Canvas") then + self:sendCanvas(name, value) elseif type(value) == "table" then -- vector or matrix if type(value[1]) == "number" then self:sendFloat(name, unpack(value)) diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index ddae1eecd..929f0f09c 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -6379,10 +6379,10 @@ const unsigned char graphics_lua[] = 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x4f, 0x66, 0x28, 0x22, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, + 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x4f, 0x66, 0x28, 0x22, 0x43, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x6f, 0x72, From af1e8761facad73bf68cea772a3a83e58dc89f23 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 12 Aug 2011 14:45:55 +0200 Subject: [PATCH 138/384] Change l.g.isSupported('framebuffer') to l.g.isSupported('canvas') --- src/modules/graphics/Graphics.cpp | 2 +- src/modules/graphics/Graphics.h | 2 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index 540a7c693..c32ae4620 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -151,7 +151,7 @@ namespace graphics StringMap::Entry Graphics::supportEntries[] = { - { "framebuffers", Graphics::SUPPORT_FRAMEBUFFERS }, + { "canvas", Graphics::SUPPORT_CANVAS }, { "pixeleffects", Graphics::SUPPORT_PIXELEFFECTS }, }; diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index e48edaca1..88b40ad38 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -80,7 +80,7 @@ namespace graphics enum Support { - SUPPORT_FRAMEBUFFERS = 1, + SUPPORT_CANVAS = 1, SUPPORT_PIXELEFFECTS, SUPPORT_MAX_ENUM }; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index dac9e1213..6867f6a6d 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -746,7 +746,7 @@ namespace opengl supported = false; switch(support) { - case Graphics::SUPPORT_FRAMEBUFFERS: + case Graphics::SUPPORT_CANVAS: if (!Canvas::isSupported()) supported = false; break; From cbe2d12db741db4524024fa40e37817e495abb29 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 12 Aug 2011 15:11:04 +0200 Subject: [PATCH 139/384] Use singular in l.g.isSupported() --- src/modules/graphics/Graphics.cpp | 2 +- src/modules/graphics/Graphics.h | 2 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index c32ae4620..79c536b79 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -152,7 +152,7 @@ namespace graphics StringMap::Entry Graphics::supportEntries[] = { { "canvas", Graphics::SUPPORT_CANVAS }, - { "pixeleffects", Graphics::SUPPORT_PIXELEFFECTS }, + { "pixeleffect", Graphics::SUPPORT_PIXELEFFECT }, }; StringMap Graphics::support(Graphics::supportEntries, sizeof(Graphics::supportEntries)); diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index 88b40ad38..0875f24a1 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -81,7 +81,7 @@ namespace graphics enum Support { SUPPORT_CANVAS = 1, - SUPPORT_PIXELEFFECTS, + SUPPORT_PIXELEFFECT, SUPPORT_MAX_ENUM }; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 6867f6a6d..60ed515c8 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -750,7 +750,7 @@ namespace opengl if (!Canvas::isSupported()) supported = false; break; - case Graphics::SUPPORT_PIXELEFFECTS: + case Graphics::SUPPORT_PIXELEFFECT: if (!PixelEffect::isSupported()) supported = false; break; From ec2cf3fbe97024caffd99fe1cbd34dc655ad6319 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 12 Aug 2011 15:31:48 +0200 Subject: [PATCH 140/384] Rename Mask to Stencil --- src/modules/graphics/opengl/Graphics.cpp | 8 +++---- src/modules/graphics/opengl/Graphics.h | 6 ++--- src/modules/graphics/opengl/wrap_Graphics.cpp | 24 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 0a38b2562..c4d8e5526 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -312,7 +312,7 @@ namespace opengl void Graphics::reset() { DisplayState s; - discardMask(); + discardStencil(); Canvas::bindDefaultCanvas(); restoreState(s); } @@ -451,7 +451,7 @@ namespace opengl return 4; } - void Graphics::defineMask() + void Graphics::defineStencil() { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glEnable(GL_STENCIL_TEST); @@ -460,14 +460,14 @@ namespace opengl glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); } - void Graphics::useMask(bool invert) + void Graphics::useStencil(bool invert) { glStencilFunc(GL_EQUAL, (int)(!invert), 1); // invert ? 0 : 1 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } - void Graphics::discardMask() + void Graphics::discardStencil() { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDisable(GL_STENCIL_TEST); diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index bf2aa0c94..742802e43 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -252,7 +252,7 @@ namespace opengl /** * Enables the stencil buffer and set stencil function to fill it */ - void defineMask(); + void defineStencil(); /** * Set stencil function to mask the following drawing calls using @@ -260,12 +260,12 @@ namespace opengl * @param invert Invert the mask, i.e. draw everywhere expect where * the mask is defined. */ - void useMask(bool invert = false); + void useStencil(bool invert = false); /** * Disables the stencil buffer */ - void discardMask(); + void discardStencil(); /** * Creates an Image object with padding and/or optimization. diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 60ed515c8..3187e4eab 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -157,7 +157,7 @@ namespace opengl return instance->getScissor(L); } - int w_newMask(lua_State * L) + int w_newStencil(lua_State * L) { // just return the function if (!lua_isfunction(L, 1)) @@ -166,32 +166,32 @@ namespace opengl return 1; } - static int setMask(lua_State * L, bool invert) + static int setStencil(lua_State * L, bool invert) { // no argument -> clear mask if (lua_isnoneornil(L, 1)) { - instance->discardMask(); + instance->discardStencil(); return 0; } if (!lua_isfunction(L, 1)) return luaL_typerror(L, 1, "mask"); - instance->defineMask(); + instance->defineStencil(); lua_call(L, lua_gettop(L) - 1, 0); // call mask(...) - instance->useMask(invert); + instance->useStencil(invert); return 0; } - int w_setMask(lua_State * L) + int w_setStencil(lua_State * L) { - return setMask(L, false); + return setStencil(L, false); } - int w_setInvertedMask(lua_State * L) + int w_setInvertedStencil(lua_State * L) { - return setMask(L, true); + return setStencil(L, true); } int w_newImage(lua_State * L) @@ -1192,9 +1192,9 @@ namespace opengl { "setScissor", w_setScissor }, { "getScissor", w_getScissor }, - { "newMask", w_newMask }, - { "setMask", w_setMask }, - { "setInvertedMask", w_setInvertedMask }, + { "newStencil", w_newStencil }, + { "setStencil", w_setStencil }, + { "setInvertedStencil", w_setInvertedStencil }, { "point", w_point }, { "line", w_line }, From c7b3e6cc539a1de7a0fa280f3f201107ac8f7921 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 12 Aug 2011 15:32:55 +0200 Subject: [PATCH 141/384] Update changelog --- changes.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/changes.txt b/changes.txt index 183519c28..d198a3aec 100644 --- a/changes.txt +++ b/changes.txt @@ -3,7 +3,7 @@ LOVE 0.8.0 [Rubber Piggy] * Added release error screen. * Added alpha to love.graphics.setBackgroundColor. - * Added framebuffer:clear(r, g, b, a). + * Added canvas:clear(r, g, b, a). * Added love.graphics.arc. * Added seek and tell to Source objects. * Added color interpolation to ParticleSystem. @@ -20,6 +20,7 @@ LOVE 0.8.0 [Rubber Piggy] * Added love.graphics.isSupported. * Added love.graphics.getRenderTarget. * Added love.event.quit. + # Added stencils. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. @@ -40,13 +41,14 @@ LOVE 0.8.0 [Rubber Piggy] * Fixed crashes when operating on non-existent files. * Renamed SpriteBatch's lock/unlock to bind/unbind. + * Renamed Framebuffer to Canvas * Updated love.joystick to be 1-indexed. * Updated love.thread to use get/set instead of send/receive. * Updated font engine. * Updated line drawing to a custom system. - * Removed framebuffer auto-clearing. + * Removed canvas auto-clearing. * Removed EncodedImageData. * Removed old syntax for require (with extension). From 611db4059293c733a2f03662b2c0718183c836a9 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 12 Aug 2011 15:37:03 +0200 Subject: [PATCH 142/384] Update changelog again (sorry) --- changes.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/changes.txt b/changes.txt index d198a3aec..76d74f84e 100644 --- a/changes.txt +++ b/changes.txt @@ -7,7 +7,6 @@ LOVE 0.8.0 [Rubber Piggy] * Added love.graphics.arc. * Added seek and tell to Source objects. * Added color interpolation to ParticleSystem. - * Added alpha masking. * 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. @@ -20,7 +19,7 @@ LOVE 0.8.0 [Rubber Piggy] * Added love.graphics.isSupported. * Added love.graphics.getRenderTarget. * Added love.event.quit. - # Added stencils. + * Added stencil masks. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. From 73d062e8fec8ea959d82d60af6b820ddf1dc5bdf Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 13 Aug 2011 15:30:29 +0200 Subject: [PATCH 143/384] Check if SoundData can allocate the memory and limit maximum size to INT_MAX --- src/modules/sound/SoundData.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/modules/sound/SoundData.cpp b/src/modules/sound/SoundData.cpp index c05e806e7..90d93e5b8 100644 --- a/src/modules/sound/SoundData.cpp +++ b/src/modules/sound/SoundData.cpp @@ -44,6 +44,9 @@ namespace sound // memory to other locations. data = (char*)realloc(data, size + decoder->getSize()); + if (!data) + throw love::Exception("Not enough memory."); // I know, I know, little memory, creating objects.. + // Copy memory into new part of memory. memcpy(data + size, decoder->getBuffer(), decoded); @@ -61,13 +64,25 @@ namespace sound SoundData::SoundData(int samples, int sampleRate, int bits, int channels) : data(0), size(samples*(bits/8)*channels), sampleRate(sampleRate), bits(bits), channels(channels) { + unsigned double realsize = samples; + realsize *= (bits/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."); } SoundData::SoundData(void * d, int samples, int sampleRate, int bits, int channels) : data(0), size(samples*(bits/8)*channels), sampleRate(sampleRate), bits(bits), channels(channels) { + unsigned double realsize = samples; + realsize *= (bits/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."); memcpy(data, d, size); } From 515596d389da8b11183e7b358cf2c60cd424bd8d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 13 Aug 2011 15:38:03 +0200 Subject: [PATCH 144/384] Ehm, unsigned double.. sure.. --- src/modules/sound/SoundData.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/sound/SoundData.cpp b/src/modules/sound/SoundData.cpp index 90d93e5b8..f7cf3874e 100644 --- a/src/modules/sound/SoundData.cpp +++ b/src/modules/sound/SoundData.cpp @@ -64,7 +64,7 @@ namespace sound SoundData::SoundData(int samples, int sampleRate, int bits, int channels) : data(0), size(samples*(bits/8)*channels), sampleRate(sampleRate), bits(bits), channels(channels) { - unsigned double realsize = samples; + double realsize = samples; realsize *= (bits/8)*channels; if (realsize > INT_MAX) throw love::Exception("Data is too big!"); @@ -76,7 +76,7 @@ namespace sound SoundData::SoundData(void * d, int samples, int sampleRate, int bits, int channels) : data(0), size(samples*(bits/8)*channels), sampleRate(sampleRate), bits(bits), channels(channels) { - unsigned double realsize = samples; + double realsize = samples; realsize *= (bits/8)*channels; if (realsize > INT_MAX) throw love::Exception("Data is too big!"); From 09367dc3bd2dea18d3f12e5aae05e7a0e6d5749f Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 22 Aug 2011 18:04:19 +0200 Subject: [PATCH 145/384] Make love loaders the first 2, preventing lua loaders from loading the wrong files (issue #283) --- src/common/runtime.cpp | 32 ++++++++++++++++--- src/common/runtime.h | 12 ++++++- .../filesystem/physfs/wrap_Filesystem.cpp | 7 ++-- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index 47660db42..0d7e8f064 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -215,8 +215,32 @@ namespace love 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 luax_register_searcher(lua_State * L, lua_CFunction f, int pos) { // Add the package loader to the package.loaders table. lua_getglobal(L, "package"); @@ -229,11 +253,9 @@ namespace love if(lua_isnil(L, -1)) return luaL_error(L, "Can't register searcher: package.loaders table does not exist."); - int len = lua_objlen(L, -1); - lua_pushinteger(L, len+1); lua_pushcfunction(L, f); - lua_settable(L, -3); - lua_pop(L, 2); + luax_table_insert(L, -2, -1, pos); + lua_pop(L, 3); return 0; } diff --git a/src/common/runtime.h b/src/common/runtime.h index 1543758b2..a4cca86dc 100644 --- a/src/common/runtime.h +++ b/src/common/runtime.h @@ -176,13 +176,23 @@ namespace love **/ 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 luax_register_searcher(lua_State * L, lua_CFunction f, int pos = -1); /** * Creates a new Lua-accessible object of the given type, and put it on the stack. diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index c5575ffc0..dd6c266ad 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -389,8 +389,8 @@ namespace physfs try { instance = new Filesystem(); - love::luax_register_searcher(L, loader); - love::luax_register_searcher(L, extloader); + love::luax_register_searcher(L, loader, 1); + love::luax_register_searcher(L, extloader, 2); } catch(Exception & e) { @@ -400,7 +400,8 @@ namespace physfs else { instance->retain(); - love::luax_register_searcher(L, loader); + love::luax_register_searcher(L, loader, 1); + love::luax_register_searcher(L, extloader, 2); } WrappedModule w; From efb04ab27c4e54b122bef1ccda1398635ea64851 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 22 Aug 2011 18:05:09 +0200 Subject: [PATCH 146/384] Add love.thread.getKeys (issue #276) --- src/modules/thread/Thread.cpp | 15 +++++++++++++++ src/modules/thread/Thread.h | 5 ++++- src/modules/thread/wrap_Thread.cpp | 18 ++++++++++++++++++ src/modules/thread/wrap_Thread.h | 1 + 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/modules/thread/Thread.cpp b/src/modules/thread/Thread.cpp index a159e8132..25288ba54 100644 --- a/src/modules/thread/Thread.cpp +++ b/src/modules/thread/Thread.cpp @@ -185,6 +185,16 @@ namespace thread shared[name] = v; } + std::vector ThreadData::getKeys() + { + std::vector keys; + for (std::map::iterator it = shared.begin(); it != shared.end(); it++) + { + keys.push_back(it->first); + } + return keys; + } + Thread::Thread(love::thread::ThreadModule *module, const std::string & name, love::Data *data) : handle(0), module(module), name(name), isThread(true) { @@ -270,6 +280,11 @@ namespace thread return v; } + std::vector Thread::getKeys() + { + return comm->getKeys(); + } + ThreadVariant *Thread::demand(const std::string & name) { ThreadVariant *v = comm->getValue(name); diff --git a/src/modules/thread/Thread.h b/src/modules/thread/Thread.h index 85ee791a8..444912a2e 100644 --- a/src/modules/thread/Thread.h +++ b/src/modules/thread/Thread.h @@ -24,7 +24,8 @@ // STL #include #include -#include +#include +#include // LOVE #include @@ -90,6 +91,7 @@ namespace thread ThreadVariant* getValue(const std::string & name); void clearValue(const std::string & name); void setValue(const std::string & name, ThreadVariant *v); + std::vector getKeys(); void *mutex; void *cond; @@ -129,6 +131,7 @@ namespace thread void wait(); std::string getName(); ThreadVariant *get(const std::string & name); + std::vector getKeys(); ThreadVariant *demand(const std::string & name); void clear(const std::string & name); void set(const std::string & name, ThreadVariant *v); diff --git a/src/modules/thread/wrap_Thread.cpp b/src/modules/thread/wrap_Thread.cpp index 62aa59cab..d82c26665 100644 --- a/src/modules/thread/wrap_Thread.cpp +++ b/src/modules/thread/wrap_Thread.cpp @@ -128,6 +128,23 @@ namespace thread return 1; } + int w_Thread_getKeys(lua_State *L) + { + Thread *t = luax_checkthread(L, 1); + t->lock(); + std::vector keys = t->getKeys(); + t->unlock(); + lua_createtable(L, keys.size(), 0); + int i = 0; + for (std::vector::iterator it = keys.begin(); it != keys.end(); it++) + { + lua_pushnumber(L, i++); + lua_pushlstring(L, it->c_str(), it->length()); + lua_settable(L, -3); + } + return 1; + } + int w_Thread_demand(lua_State *L) { Thread *t = luax_checkthread(L, 1); @@ -216,6 +233,7 @@ namespace thread { "wait", w_Thread_wait }, { "getName", w_Thread_getName }, { "get", w_Thread_get }, + { "getKeys", w_Thread_getKeys }, { "demand", w_Thread_demand }, { "peek", w_Thread_peek }, { "set", w_Thread_set }, diff --git a/src/modules/thread/wrap_Thread.h b/src/modules/thread/wrap_Thread.h index 4a9af3131..325c769d7 100644 --- a/src/modules/thread/wrap_Thread.h +++ b/src/modules/thread/wrap_Thread.h @@ -36,6 +36,7 @@ namespace thread int w_Thread_wait(lua_State *L); int w_Thread_getName(lua_State *L); int w_Thread_get(lua_State *L); + int w_Thread_getKeys(lua_State *L); int w_Thread_demand(lua_State *L); int w_Thread_peek(lua_State *L); int w_Thread_set(lua_State *L); From ceab3f7a443b6d78ee151cace53de7583274c255 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 22 Aug 2011 18:07:50 +0200 Subject: [PATCH 147/384] Catch exceptions thrown while encoding image data (issue #282) --- src/modules/image/wrap_ImageData.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/modules/image/wrap_ImageData.cpp b/src/modules/image/wrap_ImageData.cpp index ccd7f5439..eabf5b00e 100644 --- a/src/modules/image/wrap_ImageData.cpp +++ b/src/modules/image/wrap_ImageData.cpp @@ -157,7 +157,14 @@ namespace image } ImageData::Format format; ImageData::getConstant(fmt, format); - t->encode(file, format); + try + { + t->encode(file, format); + } + catch (love::Exception & e) + { + return luaL_error(L, e.what()); + } return 0; } From f0dad41f399c2d6b21ac94118f2cfe19f5b7ae3e Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 24 Aug 2011 09:58:16 +0200 Subject: [PATCH 148/384] Switch quads over to floats instead of ints (issue #285) --- src/modules/graphics/opengl/Quad.cpp | 28 +++++++++---------- src/modules/graphics/opengl/Quad.h | 8 +++--- src/modules/graphics/opengl/wrap_Graphics.cpp | 12 ++++---- src/modules/graphics/opengl/wrap_Quad.cpp | 16 +++++------ 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/modules/graphics/opengl/Quad.cpp b/src/modules/graphics/opengl/Quad.cpp index 0f88292b8..635b2269a 100644 --- a/src/modules/graphics/opengl/Quad.cpp +++ b/src/modules/graphics/opengl/Quad.cpp @@ -33,7 +33,7 @@ namespace graphics { namespace opengl { - Quad::Quad(const Viewport & v, int sw, int sh) + Quad::Quad(const Viewport & v, float sw, float sh) : sw(sw), sh(sh) { memset(vertices, 255, sizeof(vertex)*4); @@ -44,7 +44,7 @@ namespace opengl { } - void Quad::refresh(const Viewport & v, int sw, int sh) + void Quad::refresh(const Viewport & v, float sw, float sh) { if (!GLEE_ARB_texture_non_power_of_two) { @@ -56,20 +56,20 @@ namespace opengl vertices[0].x = 0; vertices[0].y = 0; vertices[1].x = 0; - vertices[1].y = (float)v.h; - vertices[2].x = (float)v.w; - vertices[2].y = (float)v.h; - vertices[3].x = (float)v.w; + 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 = (float)v.x/(float)sw; - vertices[0].t = (float)v.y/(float)sh; - vertices[1].s = (float)v.x/(float)sw; - vertices[1].t = (float)(v.y+v.h)/(float)sh; - vertices[2].s = (float)(v.x+v.w)/(float)sw; - vertices[2].t = (float)(v.y+v.h)/(float)sh; - vertices[3].s = (float)(v.x+v.w)/(float)sw; - vertices[3].t = (float)v.y/(float)sh; + 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) diff --git a/src/modules/graphics/opengl/Quad.h b/src/modules/graphics/opengl/Quad.h index 9da9fe6f6..b85c6ec39 100644 --- a/src/modules/graphics/opengl/Quad.h +++ b/src/modules/graphics/opengl/Quad.h @@ -38,7 +38,7 @@ namespace opengl struct Viewport { - int x, y, w, h; + float x, y, w, h; }; private: @@ -46,7 +46,7 @@ namespace opengl vertex vertices[4]; Viewport viewport; - int sw, sh; + float sw, sh; public: @@ -58,11 +58,11 @@ namespace opengl * @param sw Width of the source image. * @param sh Height of the source image. **/ - Quad(const Viewport & v, int sw, int sh); + Quad(const Viewport & v, float sw, float sh); virtual ~Quad(); - void refresh(const Viewport & v, int sw, int sh); + void refresh(const Viewport & v, float sw, float sh); void setViewport(const Viewport & v); Viewport getViewport() const; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 3187e4eab..6319835e4 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -226,12 +226,12 @@ namespace opengl int w_newQuad(lua_State * L) { - int x = luaL_checkint(L, 1); - int y = luaL_checkint(L, 2); - int w = luaL_checkint(L, 3); - int h = luaL_checkint(L, 4); - int sw = luaL_checkint(L, 5); - int sh = luaL_checkint(L, 6); + int x = luaL_checknumber(L, 1); + int y = luaL_checknumber(L, 2); + int w = luaL_checknumber(L, 3); + int h = luaL_checknumber(L, 4); + int sw = luaL_checknumber(L, 5); + int sh = luaL_checknumber(L, 6); Quad * frame = instance->newQuad(x, y, w, h, sw, sh); diff --git a/src/modules/graphics/opengl/wrap_Quad.cpp b/src/modules/graphics/opengl/wrap_Quad.cpp index 8d4075165..13f63a8d3 100644 --- a/src/modules/graphics/opengl/wrap_Quad.cpp +++ b/src/modules/graphics/opengl/wrap_Quad.cpp @@ -43,10 +43,10 @@ namespace opengl { Quad * quad = luax_checktype(L, 1, "Quad", GRAPHICS_QUAD_T); Quad::Viewport v; - v.x = luaL_checkint(L, 2); - v.y = luaL_checkint(L, 3); - v.w = luaL_checkint(L, 4); - v.h = luaL_checkint(L, 5); + v.x = luaL_checknumber(L, 2); + v.y = luaL_checknumber(L, 3); + v.w = luaL_checknumber(L, 4); + v.h = luaL_checknumber(L, 5); quad->setViewport(v); return 0; } @@ -55,10 +55,10 @@ namespace opengl { Quad * quad = luax_checktype(L, 1, "Quad", GRAPHICS_QUAD_T); Quad::Viewport v = quad->getViewport(); - lua_pushinteger(L, v.x); - lua_pushinteger(L, v.y); - lua_pushinteger(L, v.w); - lua_pushinteger(L, v.h); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + lua_pushnumber(L, v.w); + lua_pushnumber(L, v.h); return 4; } From b14ca7810970c4e779908e2791643a4c26d853bc Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 24 Aug 2011 12:11:08 +0200 Subject: [PATCH 149/384] Add string mapping for spritebatch usage parameter (issue #264) --- src/modules/graphics/opengl/SpriteBatch.cpp | 18 ++++++++++++++++++ src/modules/graphics/opengl/SpriteBatch.h | 12 ++++++++++-- src/modules/graphics/opengl/wrap_Graphics.cpp | 7 ++++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index 3bbe050d1..3976931b5 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -243,6 +243,24 @@ namespace opengl v[3].r = color.r; v[3].g = color.g; v[3].b = color.b; v[3].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/src/modules/graphics/opengl/SpriteBatch.h b/src/modules/graphics/opengl/SpriteBatch.h index 0c5fd55c0..40300ce9a 100644 --- a/src/modules/graphics/opengl/SpriteBatch.h +++ b/src/modules/graphics/opengl/SpriteBatch.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -73,9 +74,10 @@ namespace opengl enum UsageHint { - USAGE_DYNAMIC, + USAGE_DYNAMIC = 1, USAGE_STATIC, - USAGE_STREAM + USAGE_STREAM, + USAGE_MAX_ENUM }; SpriteBatch(Image * image, int size, int usage); @@ -108,6 +110,9 @@ namespace opengl // 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); @@ -121,6 +126,9 @@ namespace opengl */ void setColorv(vertex * v, const Color & color); + static StringMap::Entry usageHintEntries[]; + static StringMap usageHints; + }; // SpriteBatch } // opengl diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 6319835e4..ccc808b30 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -323,7 +323,12 @@ namespace opengl { Image * image = luax_checktype(L, 1, "Image", GRAPHICS_IMAGE_T); int size = luaL_optint(L, 2, 1000); - int usage = luaL_optint(L, 3, SpriteBatch::USAGE_DYNAMIC); + SpriteBatch::UsageHint usage = SpriteBatch::USAGE_DYNAMIC; + if (lua_gettop(L) > 2) + { + if (!SpriteBatch::getConstant(luaL_checkstring(L, 3), usage)) + usage = SpriteBatch::USAGE_DYNAMIC; + } SpriteBatch * t = NULL; try { t = instance->newSpriteBatch(image, size, usage); From 5c43ba2779bcf415f8ddee08e34932317749c709 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 25 Aug 2011 14:06:50 +0200 Subject: [PATCH 150/384] More float quad work (issue #285) --- src/modules/graphics/opengl/Graphics.cpp | 2 +- src/modules/graphics/opengl/Graphics.h | 2 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index c4d8e5526..4a166caab 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -492,7 +492,7 @@ namespace opengl return image; } - Quad * Graphics::newQuad(int x, int y, int w, int h, int sw, int sh) + Quad * Graphics::newQuad(float x, float y, float w, float h, float sw, float sh) { Quad::Viewport v; v.x = x; diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index 742802e43..2ade6ad3c 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -276,7 +276,7 @@ namespace opengl /** * Creates a Quad object. **/ - Quad * newQuad(int x, int y, int w, int h, int sw, int sh); + Quad * newQuad(float x, float y, float w, float h, float sw, float sh); /** * Creates a Font object. diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index ccc808b30..c7c435854 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -226,12 +226,12 @@ namespace opengl int w_newQuad(lua_State * L) { - int x = luaL_checknumber(L, 1); - int y = luaL_checknumber(L, 2); - int w = luaL_checknumber(L, 3); - int h = luaL_checknumber(L, 4); - int sw = luaL_checknumber(L, 5); - int sh = luaL_checknumber(L, 6); + 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 sw = (float) luaL_checknumber(L, 5); + float sh = (float) luaL_checknumber(L, 6); Quad * frame = instance->newQuad(x, y, w, h, sw, sh); From 0d174cfb81b8eb6c5df01be477eadc2b66a17389 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 26 Aug 2011 12:48:57 +0200 Subject: [PATCH 151/384] Fix compiler warnings --- src/modules/audio/openal/Source.cpp | 2 +- src/modules/filesystem/physfs/wrap_Filesystem.cpp | 2 +- src/modules/graphics/opengl/Font.cpp | 10 +++++----- src/modules/graphics/opengl/wrap_Quad.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 40f6f697a..c2a5894ce 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -389,7 +389,7 @@ namespace openal for(unsigned int i = 0; i < MAX_BUFFERS; i++) { - int decoded = streamAtomic(buffers[i], decoder); + streamAtomic(buffers[i], decoder); ++usedBuffers; if(decoder->isFinished()) break; diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index dd6c266ad..a7e21cfab 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -314,7 +314,7 @@ namespace physfs std::string tokenized_name(filename); std::string tokenized_function(filename); - for (int i = 0; i < tokenized_name.size(); i++) + for (unsigned int i = 0; i < tokenized_name.size(); i++) { if (tokenized_name[i] == '.') { diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 957b25a46..a713bdee3 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -104,11 +104,11 @@ namespace opengl glTexSubImage2D(GL_TEXTURE_2D, 0, texture_x, texture_y, w, h, (type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA), GL_UNSIGNED_BYTE, gd->getData()); Quad::Viewport v; - v.x = texture_x; - v.y = texture_y; - v.w = w; - v.h = h; - Quad * q = new Quad(v, TEXTURE_WIDTH, TEXTURE_HEIGHT); + v.x = (float) texture_x; + v.y = (float) texture_y; + v.w = (float) w; + v.h = (float) h; + Quad * q = new Quad(v, (const float) TEXTURE_WIDTH, (const float) TEXTURE_HEIGHT); const vertex * verts = q->getVertices(); glEnableClientState(GL_VERTEX_ARRAY); diff --git a/src/modules/graphics/opengl/wrap_Quad.cpp b/src/modules/graphics/opengl/wrap_Quad.cpp index 13f63a8d3..2d42ca6a6 100644 --- a/src/modules/graphics/opengl/wrap_Quad.cpp +++ b/src/modules/graphics/opengl/wrap_Quad.cpp @@ -43,10 +43,10 @@ namespace opengl { Quad * quad = luax_checktype(L, 1, "Quad", GRAPHICS_QUAD_T); Quad::Viewport v; - v.x = luaL_checknumber(L, 2); - v.y = luaL_checknumber(L, 3); - v.w = luaL_checknumber(L, 4); - v.h = luaL_checknumber(L, 5); + 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); quad->setViewport(v); return 0; } From 729cce93cd36fd57b11d68e2d9905e92f5698f0f Mon Sep 17 00:00:00 2001 From: rude Date: Fri, 26 Aug 2011 13:01:46 +0200 Subject: [PATCH 152/384] Prepared love.nsi for statically linked Lua. --- extra/nsis/love.nsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/nsis/love.nsi b/extra/nsis/love.nsi index 478ec16a2..96e95a133 100644 --- a/extra/nsis/love.nsi +++ b/extra/nsis/love.nsi @@ -42,7 +42,7 @@ Section "LOVE" MainProg File "${LOVEBINDIR}\DevIL.dll" File "${LOVEBINDIR}\SDL.dll" File "${LOVEBINDIR}\OpenAL32.dll" - File "${LOVEBINDIR}\lua51.dll" + # File "${LOVEBINDIR}\lua51.dll" File "${LOVEICODIR}\love.ico" File "${LOVEICODIR}\game.ico" @@ -89,7 +89,7 @@ Section "Uninstall" Delete $INSTDIR\"SDL.dll" Delete $INSTDIR\"love.exe" Delete $INSTDIR\"OpenAL32.dll" - Delete $INSTDIR\"lua51.dll" + # Delete $INSTDIR\"lua51.dll" Delete $INSTDIR\"game.ico" Delete $INSTDIR\"love.ico" RMDir $INSTDIR From 3d1fac07b27f5c4495a08011c356c304369daa63 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 28 Aug 2011 17:12:59 +0200 Subject: [PATCH 153/384] Switch love.timer.sleep to seconds --- src/modules/timer/sdl/Timer.cpp | 6 +++--- src/modules/timer/sdl/Timer.h | 4 ++-- src/modules/timer/sdl/wrap_Timer.cpp | 3 +-- src/scripts/boot.lua | 2 +- src/scripts/boot.lua.h | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/modules/timer/sdl/Timer.cpp b/src/modules/timer/sdl/Timer.cpp index ec6aa57bc..2428b5855 100644 --- a/src/modules/timer/sdl/Timer.cpp +++ b/src/modules/timer/sdl/Timer.cpp @@ -79,10 +79,10 @@ namespace sdl } } - void Timer::sleep(int ms) + void Timer::sleep(float seconds) { - if(ms > 0) - delay(ms); + if(seconds > 0) + delay((int) (seconds*1000)); } float Timer::getDelta() const diff --git a/src/modules/timer/sdl/Timer.h b/src/modules/timer/sdl/Timer.h index 21b339d30..cea9b28ff 100644 --- a/src/modules/timer/sdl/Timer.h +++ b/src/modules/timer/sdl/Timer.h @@ -88,9 +88,9 @@ namespace sdl /** * Tries to sleep for the specified amount of time. The precision is * usually 1ms. - * @param ms The number of milliseconds to sleep for. + * @param seconds The number of seconds to sleep for. **/ - void sleep(int ms); + void sleep(float seconds); /** * Gets the time between the last two frames, assuming step is called diff --git a/src/modules/timer/sdl/wrap_Timer.cpp b/src/modules/timer/sdl/wrap_Timer.cpp index af945fbab..402e646f1 100644 --- a/src/modules/timer/sdl/wrap_Timer.cpp +++ b/src/modules/timer/sdl/wrap_Timer.cpp @@ -49,8 +49,7 @@ namespace sdl int w_sleep(lua_State * L) { - int ms = luaL_checkint(L, 1); - instance->sleep(ms); + instance->sleep((float) luaL_checknumber(L, 1)); return 0; } diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 3c67661ab..725d9c9f9 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -350,7 +350,7 @@ function love.run() end end - if love.timer then love.timer.sleep(1) end + if love.timer then love.timer.sleep(0.001) end if love.graphics then love.graphics.present() end end diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index d39ec1bc5..64338e684 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -586,7 +586,7 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x31, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x70, 0x28, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,0x0a, From 7ab910f281e167cc3d4b9b742e26f1c4ae4db90b Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 30 Aug 2011 17:18:11 +0200 Subject: [PATCH 154/384] Update changelog --- changes.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/changes.txt b/changes.txt index 76d74f84e..75c714ef4 100644 --- a/changes.txt +++ b/changes.txt @@ -20,6 +20,10 @@ LOVE 0.8.0 [Rubber Piggy] * Added love.graphics.getRenderTarget. * 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. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. @@ -38,6 +42,9 @@ LOVE 0.8.0 [Rubber Piggy] * Fixed Source controls inconsistencies. * 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. * Renamed SpriteBatch's lock/unlock to bind/unbind. * Renamed Framebuffer to Canvas @@ -46,6 +53,7 @@ LOVE 0.8.0 [Rubber Piggy] * Updated love.thread to use get/set instead of send/receive. * Updated font engine. * Updated line drawing to a custom system. + * Updated love.timer.sleep to use seconds, like the rest of love. * Removed canvas auto-clearing. * Removed EncodedImageData. From cc7b6431eb751266cdd55d1f0848bb3df0bd10e0 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 31 Aug 2011 12:13:06 +0200 Subject: [PATCH 155/384] Change default segments for l.g.circle to max(10, r) --- changes.txt | 1 + src/modules/graphics/opengl/wrap_Graphics.cpp | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/changes.txt b/changes.txt index 75c714ef4..242c7b9c6 100644 --- a/changes.txt +++ b/changes.txt @@ -54,6 +54,7 @@ LOVE 0.8.0 [Rubber Piggy] * Updated font engine. * Updated line drawing to a custom system. * Updated love.timer.sleep to use seconds, like the rest of love. + * Updated love.graphics.circle to have max(10, r) as default for segments. * Removed canvas auto-clearing. * Removed EncodedImageData. diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index c7c435854..0de2d5e10 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -995,7 +995,11 @@ namespace opengl float x = (float)luaL_checknumber(L, 2); float y = (float)luaL_checknumber(L, 3); float radius = (float)luaL_checknumber(L, 4); - int points = luaL_optint(L, 5, 10); + int points; + if (lua_gettop(L) > 4) + points = lua_tointeger(L, 5); + else + points = radius > 10 ? radius : 10; instance->circle(mode, x, y, radius, points); return 0; } From f9084c4625ea955fe0cd30ebdb269c14ed9254f1 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 31 Aug 2011 12:28:56 +0200 Subject: [PATCH 156/384] Thread:getKeys needs to return a 1-indexed table --- src/modules/thread/wrap_Thread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/thread/wrap_Thread.cpp b/src/modules/thread/wrap_Thread.cpp index d82c26665..93a11bf32 100644 --- a/src/modules/thread/wrap_Thread.cpp +++ b/src/modules/thread/wrap_Thread.cpp @@ -135,7 +135,7 @@ namespace thread std::vector keys = t->getKeys(); t->unlock(); lua_createtable(L, keys.size(), 0); - int i = 0; + int i = 1; for (std::vector::iterator it = keys.begin(); it != keys.end(); it++) { lua_pushnumber(L, i++); From 190e11d0168b1e225cb73595d15e291d29513e3a Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 3 Sep 2011 14:31:31 +0200 Subject: [PATCH 157/384] Move wrapping to Font::getWrap and make printf use that (fixes issue #230) --- src/modules/graphics/opengl/Font.cpp | 75 +++++++++++++---------- src/modules/graphics/opengl/Font.h | 8 +-- src/modules/graphics/opengl/Graphics.cpp | 36 +---------- src/modules/graphics/opengl/wrap_Font.cpp | 7 ++- 4 files changed, 52 insertions(+), 74 deletions(-) diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index a713bdee3..2859ed49b 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -28,6 +28,8 @@ #include #include +#include + #include // for max namespace love @@ -221,45 +223,54 @@ namespace opengl return g->spacing; } - int Font::getWrap(const std::string & line, float wrap, int * lines) + std::vector Font::getWrap(const std::string text, float wrap, int * max_width) { - if(line.size() == 0) return 0; + using namespace std; + const float width_space = static_cast(getWidth(' ')); + vector lines_to_draw; int maxw = 0; - int linen = 1; - int temp = 0; - std::string text; - Glyph * g; - - utf8::iterator i (line.begin(), line.begin(), line.end()); - utf8::iterator end (line.end(), line.begin(), line.end()); - while (i != end) { - if(temp > wrap && text.find(" ") != std::string::npos) - { - unsigned int space = text.find_last_of(' '); - std::string tmp = text.substr(0, space); - int w = getWidth(tmp); - if(w > maxw) maxw = w; - text = text.substr(space+1); - temp = getWidth(text); - linen++; + //split text at newlines + istringstream iss( text ); + string line; + 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; + ostringstream string_builder; + vector::const_iterator word_iter; + for (word_iter = words.begin(); word_iter != words.end(); ++word_iter) { + string word( *word_iter ); + width += getWidth( word ); + + // on wordwrap, push line to line buffer and clear string builder + if (width >= wrap && oldwidth > 0) { + if (width > maxw) + maxw = width; + lines_to_draw.push_back( string_builder.str() ); + string_builder.str( "" ); + width = static_cast(getWidth( word )); + } + string_builder << word << " "; + width += width_space; + oldwidth = width; } - int c = *i++; - g = glyphs[c]; - if (!g) g = addGlyph(c); - temp += static_cast(g->spacing * mSpacing); - utf8::append(c, text.end()); + // push last line + if (width > maxw) + maxw = width; + lines_to_draw.push_back( string_builder.str() ); } - if(temp > maxw) maxw = temp; - if(lines) *lines = linen; + if (max_width) + *max_width = maxw; - return maxw; - } - - int Font::getWrap(const char * line, float wrap, int * lines) - { - return getWrap(std::string(line), wrap, lines); + return lines_to_draw; } void Font::setLineHeight(float height) diff --git a/src/modules/graphics/opengl/Font.h b/src/modules/graphics/opengl/Font.h index 8e64929f2..ef4d44a8e 100644 --- a/src/modules/graphics/opengl/Font.h +++ b/src/modules/graphics/opengl/Font.h @@ -135,12 +135,12 @@ namespace opengl * Returns the maximal width of a wrapped string * and optionally the number of lines * - * @param line A line of text + * @param text The input text * @param wrap The number of pixels to wrap at - * @param lines Optional output of the number of lines needed + * @param max_width Optional output of the maximum width + * Returns a vector with the lines. **/ - int getWrap(const std::string & line, float wrap, int *lines = 0); - int getWrap(const char * line, float wrap, int *lines = 0); + std::vector getWrap(const std::string text, float wrap, int * max_width = 0); /** * Sets the line height (which should be a number to multiply the font size by, diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 4a166caab..a8935ed7a 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -803,41 +803,7 @@ namespace opengl using namespace std; string text(str); - const float width_space = static_cast(currentFont->getWidth(' ')); - vector lines_to_draw; - - //split text at newlines - istringstream iss( text ); - string line; - 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; - ostringstream string_builder; - vector::const_iterator word_iter; - for (word_iter = words.begin(); word_iter != words.end(); ++word_iter) { - string word( *word_iter ); - width += currentFont->getWidth( word ); - - // on wordwrap, push line to line buffer and clear string builder - if (width >= wrap && oldwidth > 0) { - lines_to_draw.push_back( string_builder.str() ); - string_builder.str( "" ); - width = static_cast(currentFont->getWidth( word )); - } - string_builder << word << " "; - width += width_space; - oldwidth = width; - } - // push last line - lines_to_draw.push_back( string_builder.str() ); - } + vector lines_to_draw = currentFont->getWrap(text, wrap); // now for the actual printing vector::const_iterator line_iter, line_end = lines_to_draw.end(); diff --git a/src/modules/graphics/opengl/wrap_Font.cpp b/src/modules/graphics/opengl/wrap_Font.cpp index 9d391b0bf..d7efb23b0 100644 --- a/src/modules/graphics/opengl/wrap_Font.cpp +++ b/src/modules/graphics/opengl/wrap_Font.cpp @@ -52,9 +52,10 @@ namespace opengl Font * t = luax_checkfont(L, 1); const char * str = luaL_checkstring(L, 2); float wrap = (float) luaL_checknumber(L, 3); - int lines = 0; - lua_pushinteger(L, t->getWrap(str, wrap, &lines)); - lua_pushinteger(L, lines); + int max_width = 0; + std::vector lines = t->getWrap(str, wrap, &max_width); + lua_pushinteger(L, max_width); + lua_pushinteger(L, lines.size()); return 2; } From 6e630e8987edda58f3ed3635f83f87eeaca78131 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 3 Sep 2011 16:22:21 +0200 Subject: [PATCH 158/384] Fix width for getWrap and catch utf8 decoding errors in getWrap and getSize (issues #230 and #244) --- src/modules/graphics/opengl/Font.cpp | 27 +++++++++++++++-------- src/modules/graphics/opengl/wrap_Font.cpp | 23 +++++++++++++++---- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 2859ed49b..7b4386eb5 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -199,13 +199,20 @@ namespace opengl Glyph * g; - utf8::iterator i (line.begin(), line.begin(), line.end()); - utf8::iterator end (line.end(), line.begin(), line.end()); - while (i != end) { - int c = *i++; - g = glyphs[c]; - if (!g) g = addGlyph(c); - temp += static_cast(g->spacing * mSpacing); + try + { + utf8::iterator i (line.begin(), line.begin(), line.end()); + utf8::iterator end (line.end(), line.begin(), line.end()); + while (i != end) { + int c = *i++; + g = glyphs[c]; + if (!g) g = addGlyph(c); + temp += static_cast(g->spacing * mSpacing); + } + } + catch (utf8::invalid_utf8 e) + { + throw love::Exception(e.what()); } return temp; @@ -251,11 +258,13 @@ namespace opengl // on wordwrap, push line to line buffer and clear string builder if (width >= wrap && oldwidth > 0) { - if (width > maxw) - maxw = width; + int realw = width; lines_to_draw.push_back( string_builder.str() ); string_builder.str( "" ); width = static_cast(getWidth( word )); + realw -= width; + if (realw > maxw) + maxw = realw; } string_builder << word << " "; width += width_space; diff --git a/src/modules/graphics/opengl/wrap_Font.cpp b/src/modules/graphics/opengl/wrap_Font.cpp index d7efb23b0..8e6ee6723 100644 --- a/src/modules/graphics/opengl/wrap_Font.cpp +++ b/src/modules/graphics/opengl/wrap_Font.cpp @@ -43,7 +43,14 @@ namespace opengl { Font * t = luax_checkfont(L, 1); const char * str = luaL_checkstring(L, 2); - lua_pushinteger(L, t->getWidth(str)); + try + { + lua_pushinteger(L, t->getWidth(str)); + } + catch (love::Exception & e) + { + return luaL_error(L, e.what()); + } return 1; } @@ -52,10 +59,18 @@ namespace opengl Font * t = luax_checkfont(L, 1); const char * str = luaL_checkstring(L, 2); float wrap = (float) luaL_checknumber(L, 3); - int max_width = 0; - std::vector lines = t->getWrap(str, wrap, &max_width); + int max_width = 0, numlines = 0; + try + { + std::vector lines = t->getWrap(str, wrap, &max_width); + numlines = lines.size(); + } + catch (love::Exception & e) + { + return luaL_error(L, e.what()); + } lua_pushinteger(L, max_width); - lua_pushinteger(L, lines.size()); + lua_pushinteger(L, numlines); return 2; } From 915e3e9d8636aa751b324ef9c71c960c870befc2 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 3 Sep 2011 15:39:32 -0400 Subject: [PATCH 159/384] Updated to Box2D 2.2, added new joints, some other updates to match the API changes (still plenty more to go though) --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 133 +++- src/common/types.h | 12 + src/modules/physics/Joint.cpp | 3 +- src/modules/physics/Joint.h | 3 +- src/modules/physics/box2d/Box2D/Box2D.h | 11 +- .../Box2D/Collision/Shapes/b2ChainShape.cpp | 171 +++++ .../Box2D/Collision/Shapes/b2ChainShape.h | 117 +++ .../Box2D/Collision/Shapes/b2CircleShape.cpp | 23 +- .../Box2D/Collision/Shapes/b2CircleShape.h | 10 +- .../Box2D/Collision/Shapes/b2EdgeShape.cpp | 139 ++++ .../Box2D/Collision/Shapes/b2EdgeShape.h | 70 ++ .../Box2D/Collision/Shapes/b2PolygonShape.cpp | 245 +++--- .../Box2D/Collision/Shapes/b2PolygonShape.h | 56 +- .../box2d/Box2D/Collision/Shapes/b2Shape.h | 26 +- .../box2d/Box2D/Collision/b2BroadPhase.cpp | 8 +- .../box2d/Box2D/Collision/b2BroadPhase.h | 33 +- .../box2d/Box2D/Collision/b2CollideCircle.cpp | 2 +- .../box2d/Box2D/Collision/b2CollideEdge.cpp | 698 +++++++++++++++++ .../Box2D/Collision/b2CollidePolygon.cpp | 53 +- .../box2d/Box2D/Collision/b2Collision.cpp | 31 +- .../box2d/Box2D/Collision/b2Collision.h | 74 +- .../box2d/Box2D/Collision/b2Distance.cpp | 40 +- .../box2d/Box2D/Collision/b2Distance.h | 6 +- .../box2d/Box2D/Collision/b2DynamicTree.cpp | 642 +++++++++++++--- .../box2d/Box2D/Collision/b2DynamicTree.h | 96 ++- .../box2d/Box2D/Collision/b2TimeOfImpact.cpp | 42 +- .../box2d/Box2D/Collision/b2TimeOfImpact.h | 3 +- .../box2d/Box2D/Common/b2BlockAllocator.cpp | 18 +- .../box2d/Box2D/Common/b2BlockAllocator.h | 13 +- .../physics/box2d/Box2D/Common/b2Draw.cpp | 44 ++ .../physics/box2d/Box2D/Common/b2Draw.h | 81 ++ .../box2d/Box2D/Common/b2GrowableStack.h | 85 +++ .../physics/box2d/Box2D/Common/b2Math.cpp | 14 +- .../physics/box2d/Box2D/Common/b2Math.h | 289 ++++--- .../physics/box2d/Box2D/Common/b2Settings.cpp | 4 +- .../physics/box2d/Box2D/Common/b2Settings.h | 28 +- .../box2d/Box2D/Common/b2StackAllocator.cpp | 2 +- .../box2d/Box2D/Common/b2StackAllocator.h | 2 +- .../physics/box2d/Box2D/Common/b2Timer.cpp | 100 +++ .../b2TOISolver.h => Common/b2Timer.h} | 44 +- .../Contacts/b2ChainAndCircleContact.cpp | 54 ++ .../Contacts/b2ChainAndCircleContact.h | 39 + .../Contacts/b2ChainAndPolygonContact.cpp | 54 ++ .../Contacts/b2ChainAndPolygonContact.h | 39 + .../Dynamics/Contacts/b2CircleContact.cpp | 7 +- .../Box2D/Dynamics/Contacts/b2CircleContact.h | 5 +- .../Box2D/Dynamics/Contacts/b2Contact.cpp | 38 +- .../box2d/Box2D/Dynamics/Contacts/b2Contact.h | 105 ++- .../Dynamics/Contacts/b2ContactSolver.cpp | 715 +++++++++++------ .../Box2D/Dynamics/Contacts/b2ContactSolver.h | 54 +- .../Contacts/b2EdgeAndCircleContact.cpp | 50 ++ .../Contacts/b2EdgeAndCircleContact.h | 39 + .../Contacts/b2EdgeAndPolygonContact.cpp | 50 ++ .../Contacts/b2EdgeAndPolygonContact.h | 39 + .../Contacts/b2PolygonAndCircleContact.cpp | 10 +- .../Contacts/b2PolygonAndCircleContact.h | 4 +- .../Dynamics/Contacts/b2PolygonContact.cpp | 7 +- .../Dynamics/Contacts/b2PolygonContact.h | 5 +- .../Box2D/Dynamics/Contacts/b2TOISolver.cpp | 231 ------ .../Box2D/Dynamics/Joints/b2DistanceJoint.cpp | 139 ++-- .../Box2D/Dynamics/Joints/b2DistanceJoint.h | 37 +- .../Box2D/Dynamics/Joints/b2FrictionJoint.cpp | 114 +-- .../Box2D/Dynamics/Joints/b2FrictionJoint.h | 27 +- .../Box2D/Dynamics/Joints/b2GearJoint.cpp | 359 ++++++--- .../box2d/Box2D/Dynamics/Joints/b2GearJoint.h | 58 +- .../box2d/Box2D/Dynamics/Joints/b2Joint.cpp | 26 +- .../box2d/Box2D/Dynamics/Joints/b2Joint.h | 58 +- .../Box2D/Dynamics/Joints/b2LineJoint.cpp | 591 --------------- .../box2d/Box2D/Dynamics/Joints/b2LineJoint.h | 170 ----- .../Box2D/Dynamics/Joints/b2MouseJoint.cpp | 106 +-- .../Box2D/Dynamics/Joints/b2MouseJoint.h | 31 +- .../Dynamics/Joints/b2PrismaticJoint.cpp | 397 +++++----- .../Box2D/Dynamics/Joints/b2PrismaticJoint.h | 55 +- .../Box2D/Dynamics/Joints/b2PulleyJoint.cpp | 439 ++++------- .../Box2D/Dynamics/Joints/b2PulleyJoint.h | 74 +- .../Box2D/Dynamics/Joints/b2RevoluteJoint.cpp | 321 ++++---- .../Box2D/Dynamics/Joints/b2RevoluteJoint.h | 47 +- .../Box2D/Dynamics/Joints/b2RopeJoint.cpp | 226 ++++++ .../box2d/Box2D/Dynamics/Joints/b2RopeJoint.h | 104 +++ .../Box2D/Dynamics/Joints/b2WeldJoint.cpp | 172 +++-- .../box2d/Box2D/Dynamics/Joints/b2WeldJoint.h | 22 +- .../Box2D/Dynamics/Joints/b2WheelJoint.cpp | 404 ++++++++++ .../Box2D/Dynamics/Joints/b2WheelJoint.h | 199 +++++ .../physics/box2d/Box2D/Dynamics/b2Body.cpp | 74 +- .../physics/box2d/Box2D/Dynamics/b2Body.h | 77 +- .../box2d/Box2D/Dynamics/b2ContactManager.cpp | 45 +- .../box2d/Box2D/Dynamics/b2ContactManager.h | 2 +- .../box2d/Box2D/Dynamics/b2Fixture.cpp | 127 +++- .../physics/box2d/Box2D/Dynamics/b2Fixture.h | 48 +- .../physics/box2d/Box2D/Dynamics/b2Island.cpp | 381 +++++++--- .../physics/box2d/Box2D/Dynamics/b2Island.h | 30 +- .../physics/box2d/Box2D/Dynamics/b2TimeStep.h | 55 +- .../physics/box2d/Box2D/Dynamics/b2World.cpp | 717 +++++++++++------- .../physics/box2d/Box2D/Dynamics/b2World.h | 86 ++- .../box2d/Box2D/Dynamics/b2WorldCallbacks.cpp | 27 +- .../box2d/Box2D/Dynamics/b2WorldCallbacks.h | 66 +- .../physics/box2d/Box2D/Rope/b2Rope.cpp | 259 +++++++ src/modules/physics/box2d/Box2D/Rope/b2Rope.h | 115 +++ src/modules/physics/box2d/FrictionJoint.cpp | 72 ++ src/modules/physics/box2d/FrictionJoint.h | 78 ++ src/modules/physics/box2d/Joint.cpp | 13 + src/modules/physics/box2d/Joint.h | 2 + src/modules/physics/box2d/Physics.cpp | 5 + src/modules/physics/box2d/Physics.h | 8 + src/modules/physics/box2d/PrismaticJoint.cpp | 16 +- src/modules/physics/box2d/PrismaticJoint.h | 3 +- src/modules/physics/box2d/WeldJoint.cpp | 51 ++ src/modules/physics/box2d/WeldJoint.h | 58 ++ src/modules/physics/box2d/WheelJoint.cpp | 116 +++ src/modules/physics/box2d/WheelJoint.h | 127 ++++ .../physics/box2d/wrap_DistanceJoint.cpp | 1 - .../physics/box2d/wrap_FrictionJoint.cpp | 86 +++ .../physics/box2d/wrap_FrictionJoint.h | 46 ++ src/modules/physics/box2d/wrap_GearJoint.cpp | 1 - src/modules/physics/box2d/wrap_Joint.cpp | 9 - src/modules/physics/box2d/wrap_Joint.h | 1 - src/modules/physics/box2d/wrap_MouseJoint.cpp | 1 - src/modules/physics/box2d/wrap_Physics.cpp | 13 + src/modules/physics/box2d/wrap_Physics.h | 2 + .../physics/box2d/wrap_PrismaticJoint.cpp | 1 - .../physics/box2d/wrap_PulleyJoint.cpp | 1 - .../physics/box2d/wrap_RevoluteJoint.cpp | 1 - src/modules/physics/box2d/wrap_WeldJoint.cpp | 52 ++ src/modules/physics/box2d/wrap_WeldJoint.h | 42 + src/modules/physics/box2d/wrap_WheelJoint.cpp | 188 +++++ src/modules/physics/box2d/wrap_WheelJoint.h | 58 ++ 126 files changed, 8581 insertions(+), 3772 deletions(-) mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Box2D.h create mode 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp create mode 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h create mode 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.cpp create mode 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp create mode 100755 src/modules/physics/box2d/Box2D/Collision/b2CollideEdge.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2Collision.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2Distance.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h create mode 100755 src/modules/physics/box2d/Box2D/Common/b2Draw.cpp create mode 100755 src/modules/physics/box2d/Box2D/Common/b2Draw.h create mode 100755 src/modules/physics/box2d/Box2D/Common/b2GrowableStack.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2Math.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2Math.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2Settings.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2Settings.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h create mode 100755 src/modules/physics/box2d/Box2D/Common/b2Timer.cpp rename src/modules/physics/box2d/Box2D/{Dynamics/Contacts/b2TOISolver.h => Common/b2Timer.h} (54%) mode change 100644 => 100755 create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h delete mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h delete mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp delete mode 100644 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp create mode 100755 src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2Body.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2Island.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2World.h mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp mode change 100644 => 100755 src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h create mode 100755 src/modules/physics/box2d/Box2D/Rope/b2Rope.cpp create mode 100755 src/modules/physics/box2d/Box2D/Rope/b2Rope.h create mode 100644 src/modules/physics/box2d/FrictionJoint.cpp create mode 100644 src/modules/physics/box2d/FrictionJoint.h create mode 100644 src/modules/physics/box2d/WeldJoint.cpp create mode 100644 src/modules/physics/box2d/WeldJoint.h create mode 100644 src/modules/physics/box2d/WheelJoint.cpp create mode 100644 src/modules/physics/box2d/WheelJoint.h create mode 100644 src/modules/physics/box2d/wrap_FrictionJoint.cpp create mode 100644 src/modules/physics/box2d/wrap_FrictionJoint.h create mode 100644 src/modules/physics/box2d/wrap_WeldJoint.cpp create mode 100644 src/modules/physics/box2d/wrap_WeldJoint.h create mode 100644 src/modules/physics/box2d/wrap_WheelJoint.cpp create mode 100644 src/modules/physics/box2d/wrap_WheelJoint.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 933c8eeaa..77cba2653 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -147,6 +147,22 @@ A968F0D91083A9FC00A895AA /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D81083A9FC00A895AA /* Mouse.cpp */; }; A968F0DD1083AA6600A895AA /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DB1083AA6600A895AA /* Shape.cpp */; }; A968F0DE1083AA6600A895AA /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DC1083AA6600A895AA /* Joint.cpp */; }; + A96F416014127E340067FE9A /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F415C14127E310067FE9A /* b2RopeJoint.cpp */; }; + A96F416114127E340067FE9A /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F415E14127E320067FE9A /* b2WheelJoint.cpp */; }; + A96F416514127E720067FE9A /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416314127E720067FE9A /* b2Rope.cpp */; }; + A96F416B14127E9C0067FE9A /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416614127E9C0067FE9A /* b2Draw.cpp */; }; + A96F416C14127E9C0067FE9A /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416914127E9C0067FE9A /* b2Timer.cpp */; }; + A96F416E14127EB20067FE9A /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */; }; + A96F417114127EC00067FE9A /* b2ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416F14127EC00067FE9A /* b2ChainShape.cpp */; }; + A96F417614127EE70067FE9A /* b2ChainAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */; }; + A96F417714127EE70067FE9A /* b2ChainAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */; }; + A96F417C14127EFD0067FE9A /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */; }; + A96F417D14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */; }; + A96F418014127FC20067FE9A /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */; }; + A96F41831412AFE20067FE9A /* wrap_WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */; }; + A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41841412AFEB0067FE9A /* WeldJoint.cpp */; }; + A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */; }; + A96F418C1412B3AD0067FE9A /* WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F418A1412B3A30067FE9A /* WheelJoint.cpp */; }; A986DEB5113249A800810279 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB1113249A800810279 /* Thread.cpp */; }; A986DEB6113249A800810279 /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB3113249A800810279 /* wrap_Thread.cpp */; }; A986EC64132CE6DB00F048C8 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */; }; @@ -173,12 +189,10 @@ A986EC79132CE6DB00F048C8 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */; }; A986EC7A132CE6DB00F048C8 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */; }; A986EC7B132CE6DB00F048C8 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */; }; - A986EC7C132CE6DB00F048C8 /* b2TOISolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFC132CE6D800F048C8 /* b2TOISolver.cpp */; }; A986EC7D132CE6DB00F048C8 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */; }; A986EC7E132CE6DB00F048C8 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */; }; A986EC7F132CE6DB00F048C8 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC03132CE6D800F048C8 /* b2GearJoint.cpp */; }; A986EC80132CE6DB00F048C8 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC05132CE6D800F048C8 /* b2Joint.cpp */; }; - A986EC81132CE6DB00F048C8 /* b2LineJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC07132CE6D800F048C8 /* b2LineJoint.cpp */; }; A986EC82132CE6DB00F048C8 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */; }; A986EC83132CE6DB00F048C8 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */; }; A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */; }; @@ -188,6 +202,8 @@ A98D914410507C97008E03F2 /* EncodedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98D914310507C97008E03F2 /* EncodedImageData.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; A9B4BA9D1045937F001DBC80 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */; }; + A9B6432C13BF83AB00DC3C7E /* FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B6432A13BF833900DC3C7E /* FrictionJoint.cpp */; }; + A9B6432F13BF87F100DC3C7E /* wrap_FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B6432D13BF87E400DC3C7E /* wrap_FrictionJoint.cpp */; }; A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9BD60701226C988007DEC63 /* Framebuffer.cpp */; }; A9BD60751226C988007DEC63 /* wrap_Framebuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9BD60721226C988007DEC63 /* wrap_Framebuffer.cpp */; }; A9CF0E8610B9EB1000E6F37E /* utf8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9CF0E8510B9EB1000E6F37E /* utf8.cpp */; }; @@ -523,6 +539,38 @@ A968F0D81083A9FC00A895AA /* Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; A968F0DB1083AA6600A895AA /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = ""; }; A968F0DC1083AA6600A895AA /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; + A96F415C14127E310067FE9A /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2RopeJoint.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2RopeJoint.cpp; sourceTree = ""; }; + A96F415D14127E320067FE9A /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2RopeJoint.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2RopeJoint.h; sourceTree = ""; }; + A96F415E14127E320067FE9A /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2WheelJoint.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2WheelJoint.cpp; sourceTree = ""; }; + A96F415F14127E320067FE9A /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2WheelJoint.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2WheelJoint.h; sourceTree = ""; }; + A96F416314127E720067FE9A /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = ""; }; + A96F416414127E720067FE9A /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = ""; }; + A96F416614127E9C0067FE9A /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2Draw.cpp; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Draw.cpp; sourceTree = ""; }; + A96F416714127E9C0067FE9A /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2Draw.h; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Draw.h; sourceTree = ""; }; + A96F416814127E9C0067FE9A /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2GrowableStack.h; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2GrowableStack.h; sourceTree = ""; }; + A96F416914127E9C0067FE9A /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2Timer.cpp; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Timer.cpp; sourceTree = ""; }; + A96F416A14127E9C0067FE9A /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2Timer.h; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Timer.h; sourceTree = ""; }; + A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2CollideEdge.cpp; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/b2CollideEdge.cpp; sourceTree = ""; }; + A96F416F14127EC00067FE9A /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2ChainShape.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2ChainShape.cpp; sourceTree = ""; }; + A96F417014127EC00067FE9A /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2ChainShape.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2ChainShape.h; sourceTree = ""; }; + A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2ChainAndCircleContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp; sourceTree = ""; }; + A96F417314127EE70067FE9A /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2ChainAndCircleContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h; sourceTree = ""; }; + A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2ChainAndPolygonContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp; sourceTree = ""; }; + A96F417514127EE70067FE9A /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2ChainAndPolygonContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h; sourceTree = ""; }; + A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2EdgeAndCircleContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp; sourceTree = ""; }; + A96F417914127EFD0067FE9A /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2EdgeAndCircleContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h; sourceTree = ""; }; + A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2EdgeAndPolygonContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; + A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2EdgeAndPolygonContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h; sourceTree = ""; }; + A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2EdgeShape.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2EdgeShape.cpp; sourceTree = ""; }; + A96F417F14127FC20067FE9A /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2EdgeShape.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2EdgeShape.h; sourceTree = ""; }; + A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = ""; }; + A96F41821412AFC60067FE9A /* wrap_WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = ""; }; + A96F41841412AFEB0067FE9A /* WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = ""; }; + A96F41851412AFEE0067FE9A /* WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeldJoint.h; sourceTree = ""; }; + A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WheelJoint.cpp; sourceTree = ""; }; + A96F41881412B3610067FE9A /* wrap_WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WheelJoint.h; sourceTree = ""; }; + A96F418A1412B3A30067FE9A /* WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WheelJoint.cpp; sourceTree = ""; }; + A96F418B1412B3A80067FE9A /* WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelJoint.h; sourceTree = ""; }; A97E3842132A9EDE00198A2F /* love-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "love-Info.plist"; sourceTree = ""; }; A986DEB1113249A800810279 /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Thread.cpp; sourceTree = ""; }; A986DEB2113249A800810279 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; @@ -576,8 +624,6 @@ A986EBF9132CE6D800F048C8 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; A986EBFB132CE6D800F048C8 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; - A986EBFC132CE6D800F048C8 /* b2TOISolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TOISolver.cpp; sourceTree = ""; }; - A986EBFD132CE6D800F048C8 /* b2TOISolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TOISolver.h; sourceTree = ""; }; A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; A986EC00132CE6D800F048C8 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; @@ -586,8 +632,6 @@ A986EC04132CE6D800F048C8 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; A986EC05132CE6D800F048C8 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; A986EC06132CE6D800F048C8 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; - A986EC07132CE6D800F048C8 /* b2LineJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LineJoint.cpp; sourceTree = ""; }; - A986EC08132CE6D800F048C8 /* b2LineJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LineJoint.h; sourceTree = ""; }; A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; A986EC0A132CE6D800F048C8 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; @@ -608,6 +652,10 @@ A9B4BA991045937F001DBC80 /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = ""; }; A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleSystem.cpp; sourceTree = ""; }; A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ParticleSystem.cpp; sourceTree = ""; }; + A9B6432A13BF833900DC3C7E /* FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FrictionJoint.cpp; sourceTree = ""; }; + A9B6432B13BF837800DC3C7E /* FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrictionJoint.h; sourceTree = ""; }; + A9B6432D13BF87E400DC3C7E /* wrap_FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_FrictionJoint.cpp; sourceTree = ""; }; + A9B6432E13BF87EA00DC3C7E /* wrap_FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_FrictionJoint.h; sourceTree = ""; }; A9BD60701226C988007DEC63 /* Framebuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Framebuffer.cpp; sourceTree = ""; }; A9BD60711226C988007DEC63 /* Framebuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Framebuffer.h; sourceTree = ""; }; A9BD60721226C988007DEC63 /* wrap_Framebuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Framebuffer.cpp; sourceTree = ""; }; @@ -1149,6 +1197,8 @@ A93E6AF210420AC7007D418B /* DistanceJoint.h */, A986ECAD132CEB9300F048C8 /* Fixture.cpp */, A986ECAE132CEB9B00F048C8 /* Fixture.h */, + A9B6432A13BF833900DC3C7E /* FrictionJoint.cpp */, + A9B6432B13BF837800DC3C7E /* FrictionJoint.h */, A93E6AF310420AC7007D418B /* GearJoint.cpp */, A93E6AF410420AC7007D418B /* GearJoint.h */, A93E6AF510420AC7007D418B /* graham */, @@ -1168,6 +1218,10 @@ A93E6B0710420AC8007D418B /* RevoluteJoint.h */, A93E6B0810420AC8007D418B /* Shape.cpp */, A93E6B0910420AC8007D418B /* Shape.h */, + A96F41841412AFEB0067FE9A /* WeldJoint.cpp */, + A96F41851412AFEE0067FE9A /* WeldJoint.h */, + A96F418A1412B3A30067FE9A /* WheelJoint.cpp */, + A96F418B1412B3A80067FE9A /* WheelJoint.h */, A93E6B4E10420ACA007D418B /* World.cpp */, A93E6B4F10420ACA007D418B /* World.h */, A93E6B5010420ACA007D418B /* wrap_Body.cpp */, @@ -1178,6 +1232,8 @@ A93E6B5510420ACA007D418B /* wrap_Contact.h */, A93E6B5610420ACA007D418B /* wrap_DistanceJoint.cpp */, A93E6B5710420ACA007D418B /* wrap_DistanceJoint.h */, + A9B6432D13BF87E400DC3C7E /* wrap_FrictionJoint.cpp */, + A9B6432E13BF87EA00DC3C7E /* wrap_FrictionJoint.h */, A93E6B5810420ACA007D418B /* wrap_GearJoint.cpp */, A93E6B5910420ACA007D418B /* wrap_GearJoint.h */, A93E6B5A10420ACA007D418B /* wrap_Joint.cpp */, @@ -1196,6 +1252,10 @@ A93E6B6710420ACA007D418B /* wrap_RevoluteJoint.h */, A93E6B6810420ACA007D418B /* wrap_Shape.cpp */, A93E6B6910420ACA007D418B /* wrap_Shape.h */, + A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */, + A96F41821412AFC60067FE9A /* wrap_WeldJoint.h */, + A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */, + A96F41881412B3610067FE9A /* wrap_WheelJoint.h */, A93E6B6A10420ACA007D418B /* wrap_World.cpp */, A93E6B6B10420ACB007D418B /* wrap_World.h */, ); @@ -1300,6 +1360,16 @@ path = utf8; sourceTree = ""; }; + A96F416214127E720067FE9A /* Rope */ = { + isa = PBXGroup; + children = ( + A96F416314127E720067FE9A /* b2Rope.cpp */, + A96F416414127E720067FE9A /* b2Rope.h */, + ); + name = Rope; + path = ../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Rope; + sourceTree = ""; + }; A986DEAF113249A700810279 /* thread */ = { isa = PBXGroup; children = ( @@ -1327,6 +1397,7 @@ A986EBC7132CE6D800F048C8 /* Collision */, A986EBDA132CE6D800F048C8 /* Common */, A986EBE3132CE6D800F048C8 /* Dynamics */, + A96F416214127E720067FE9A /* Rope */, ); path = Box2D; sourceTree = ""; @@ -1337,6 +1408,7 @@ A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */, A986EBC9132CE6D800F048C8 /* b2BroadPhase.h */, A986EBCA132CE6D800F048C8 /* b2CollideCircle.cpp */, + A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */, A986EBCB132CE6D800F048C8 /* b2CollidePolygon.cpp */, A986EBCC132CE6D800F048C8 /* b2Collision.cpp */, A986EBCD132CE6D800F048C8 /* b2Collision.h */, @@ -1354,8 +1426,12 @@ A986EBD4132CE6D800F048C8 /* Shapes */ = { isa = PBXGroup; children = ( + A96F416F14127EC00067FE9A /* b2ChainShape.cpp */, + A96F417014127EC00067FE9A /* b2ChainShape.h */, A986EBD5132CE6D800F048C8 /* b2CircleShape.cpp */, A986EBD6132CE6D800F048C8 /* b2CircleShape.h */, + A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */, + A96F417F14127FC20067FE9A /* b2EdgeShape.h */, A986EBD7132CE6D800F048C8 /* b2PolygonShape.cpp */, A986EBD8132CE6D800F048C8 /* b2PolygonShape.h */, A986EBD9132CE6D800F048C8 /* b2Shape.h */, @@ -1368,12 +1444,17 @@ children = ( A986EBDB132CE6D800F048C8 /* b2BlockAllocator.cpp */, A986EBDC132CE6D800F048C8 /* b2BlockAllocator.h */, + A96F416614127E9C0067FE9A /* b2Draw.cpp */, + A96F416714127E9C0067FE9A /* b2Draw.h */, + A96F416814127E9C0067FE9A /* b2GrowableStack.h */, A986EBDD132CE6D800F048C8 /* b2Math.cpp */, A986EBDE132CE6D800F048C8 /* b2Math.h */, A986EBDF132CE6D800F048C8 /* b2Settings.cpp */, A986EBE0132CE6D800F048C8 /* b2Settings.h */, A986EBE1132CE6D800F048C8 /* b2StackAllocator.cpp */, A986EBE2132CE6D800F048C8 /* b2StackAllocator.h */, + A96F416914127E9C0067FE9A /* b2Timer.cpp */, + A96F416A14127E9C0067FE9A /* b2Timer.h */, ); path = Common; sourceTree = ""; @@ -1403,18 +1484,24 @@ A986EBF1132CE6D800F048C8 /* Contacts */ = { isa = PBXGroup; children = ( + A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */, + A96F417314127EE70067FE9A /* b2ChainAndCircleContact.h */, + A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */, + A96F417514127EE70067FE9A /* b2ChainAndPolygonContact.h */, A986EBF2132CE6D800F048C8 /* b2CircleContact.cpp */, A986EBF3132CE6D800F048C8 /* b2CircleContact.h */, A986EBF4132CE6D800F048C8 /* b2Contact.cpp */, A986EBF5132CE6D800F048C8 /* b2Contact.h */, A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */, A986EBF7132CE6D800F048C8 /* b2ContactSolver.h */, + A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */, + A96F417914127EFD0067FE9A /* b2EdgeAndCircleContact.h */, + A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */, + A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */, A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */, A986EBF9132CE6D800F048C8 /* b2PolygonAndCircleContact.h */, A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */, A986EBFB132CE6D800F048C8 /* b2PolygonContact.h */, - A986EBFC132CE6D800F048C8 /* b2TOISolver.cpp */, - A986EBFD132CE6D800F048C8 /* b2TOISolver.h */, ); path = Contacts; sourceTree = ""; @@ -1430,8 +1517,6 @@ A986EC04132CE6D800F048C8 /* b2GearJoint.h */, A986EC05132CE6D800F048C8 /* b2Joint.cpp */, A986EC06132CE6D800F048C8 /* b2Joint.h */, - A986EC07132CE6D800F048C8 /* b2LineJoint.cpp */, - A986EC08132CE6D800F048C8 /* b2LineJoint.h */, A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */, A986EC0A132CE6D800F048C8 /* b2MouseJoint.h */, A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */, @@ -1440,8 +1525,12 @@ A986EC0E132CE6D800F048C8 /* b2PulleyJoint.h */, A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */, A986EC10132CE6D800F048C8 /* b2RevoluteJoint.h */, + A96F415C14127E310067FE9A /* b2RopeJoint.cpp */, + A96F415D14127E320067FE9A /* b2RopeJoint.h */, A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */, A986EC12132CE6D800F048C8 /* b2WeldJoint.h */, + A96F415E14127E320067FE9A /* b2WheelJoint.cpp */, + A96F415F14127E320067FE9A /* b2WheelJoint.h */, ); path = Joints; sourceTree = ""; @@ -1473,6 +1562,9 @@ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 0410; + }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "love" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; @@ -1666,18 +1758,34 @@ A986EC79132CE6DB00F048C8 /* b2ContactSolver.cpp in Sources */, A986EC7A132CE6DB00F048C8 /* b2PolygonAndCircleContact.cpp in Sources */, A986EC7B132CE6DB00F048C8 /* b2PolygonContact.cpp in Sources */, - A986EC7C132CE6DB00F048C8 /* b2TOISolver.cpp in Sources */, A986EC7D132CE6DB00F048C8 /* b2DistanceJoint.cpp in Sources */, A986EC7E132CE6DB00F048C8 /* b2FrictionJoint.cpp in Sources */, A986EC7F132CE6DB00F048C8 /* b2GearJoint.cpp in Sources */, A986EC80132CE6DB00F048C8 /* b2Joint.cpp in Sources */, - A986EC81132CE6DB00F048C8 /* b2LineJoint.cpp in Sources */, A986EC82132CE6DB00F048C8 /* b2MouseJoint.cpp in Sources */, A986EC83132CE6DB00F048C8 /* b2PrismaticJoint.cpp in Sources */, A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */, A986EC85132CE6DB00F048C8 /* b2RevoluteJoint.cpp in Sources */, A986EC86132CE6DB00F048C8 /* b2WeldJoint.cpp in Sources */, A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */, + A9B6432C13BF83AB00DC3C7E /* FrictionJoint.cpp in Sources */, + A9B6432F13BF87F100DC3C7E /* wrap_FrictionJoint.cpp in Sources */, + A96F416014127E340067FE9A /* b2RopeJoint.cpp in Sources */, + A96F416114127E340067FE9A /* b2WheelJoint.cpp in Sources */, + A96F416514127E720067FE9A /* b2Rope.cpp in Sources */, + A96F416B14127E9C0067FE9A /* b2Draw.cpp in Sources */, + A96F416C14127E9C0067FE9A /* b2Timer.cpp in Sources */, + A96F416E14127EB20067FE9A /* b2CollideEdge.cpp in Sources */, + A96F417114127EC00067FE9A /* b2ChainShape.cpp in Sources */, + A96F417614127EE70067FE9A /* b2ChainAndCircleContact.cpp in Sources */, + A96F417714127EE70067FE9A /* b2ChainAndPolygonContact.cpp in Sources */, + A96F417C14127EFD0067FE9A /* b2EdgeAndCircleContact.cpp in Sources */, + A96F417D14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp in Sources */, + A96F418014127FC20067FE9A /* b2EdgeShape.cpp in Sources */, + A96F41831412AFE20067FE9A /* wrap_WeldJoint.cpp in Sources */, + A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */, + A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */, + A96F418C1412B3AD0067FE9A /* WheelJoint.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1743,6 +1851,7 @@ ); ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = love; + SDKROOT = macosx; }; name = Release; }; diff --git a/src/common/types.h b/src/common/types.h index 7009baa14..567d93744 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -72,6 +72,8 @@ namespace love 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, @@ -79,6 +81,10 @@ namespace love 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, // Thread THREAD_THREAD_ID, @@ -137,6 +143,8 @@ namespace love 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; @@ -144,6 +152,10 @@ namespace love 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; // Thread. const bits THREAD_THREAD_T = (bits(1) << THREAD_THREAD_ID) | OBJECT_T; diff --git a/src/modules/physics/Joint.cpp b/src/modules/physics/Joint.cpp index add6b33bf..f25b61e7d 100644 --- a/src/modules/physics/Joint.cpp +++ b/src/modules/physics/Joint.cpp @@ -47,8 +47,9 @@ namespace physics {"pulley", Joint::JOINT_PULLEY}, {"gear", Joint::JOINT_GEAR}, {"friction", Joint::JOINT_FRICTION}, - {"line", Joint::JOINT_LINE}, {"weld", Joint::JOINT_WELD}, + {"wheel", Joint::JOINT_WHEEL}, + {"rope", Joint::JOINT_ROPE}, }; StringMap Joint::types(Joint::typeEntries, sizeof(Joint::typeEntries)); diff --git a/src/modules/physics/Joint.h b/src/modules/physics/Joint.h index efa89bec3..a37d29350 100644 --- a/src/modules/physics/Joint.h +++ b/src/modules/physics/Joint.h @@ -43,8 +43,9 @@ namespace physics JOINT_PULLEY, JOINT_GEAR, JOINT_FRICTION, - JOINT_LINE, JOINT_WELD, + JOINT_WHEEL, + JOINT_ROPE, JOINT_MAX_ENUM }; diff --git a/src/modules/physics/box2d/Box2D/Box2D.h b/src/modules/physics/box2d/Box2D/Box2D.h old mode 100644 new mode 100755 index dc5701f51..817cd1ccf --- a/src/modules/physics/box2d/Box2D/Box2D.h +++ b/src/modules/physics/box2d/Box2D/Box2D.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -32,8 +32,12 @@ For discussion please visit http://box2d.org/forum // These include files constitute the main Box2D API #include +#include +#include #include +#include +#include #include #include @@ -52,11 +56,14 @@ For discussion please visit http://box2d.org/forum #include #include #include -#include +#include #include #include #include #include +#include #include +#include + #endif diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp new file mode 100755 index 000000000..f7bbe06b6 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp @@ -0,0 +1,171 @@ +/* +* 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 +using namespace std; + +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); + 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); + m_count = count; + m_vertices = (b2Vec2*)b2Alloc(count * sizeof(b2Vec2)); + memcpy(m_vertices, vertices, m_count * sizeof(b2Vec2)); + m_hasPrevVertex = false; + m_hasNextVertex = false; +} + +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/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h new file mode 100755 index 000000000..34593e2b8 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h @@ -0,0 +1,117 @@ +/* +* 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; + + /// Get the number of vertices. + int32 GetVertexCount() const { return m_count; } + + /// Get the vertices (read-only). + const b2Vec2& GetVertex(int32 index) const + { + b2Assert(0 <= index && index < m_count); + return m_vertices[index]; + } + + /// Get the vertices (read-only). + const b2Vec2* GetVertices() const { return m_vertices; } + +protected: + + /// 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 = NULL; + m_hasNextVertex = NULL; +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp old mode 100644 new mode 100755 index a950b0be5..c03d662df --- a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -18,6 +18,7 @@ #include #include +using namespace std; b2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const { @@ -27,9 +28,14 @@ b2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const return clone; } +int32 b2CircleShape::GetChildCount() const +{ + return 1; +} + bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const { - b2Vec2 center = transform.position + b2Mul(transform.R, m_p); + b2Vec2 center = transform.p + b2Mul(transform.q, m_p); b2Vec2 d = p - center; return b2Dot(d, d) <= m_radius * m_radius; } @@ -38,9 +44,12 @@ bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) con // From Section 3.1.2 // x = s + a * r // norm(x) = radius -bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const +bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const { - b2Vec2 position = transform.position + b2Mul(transform.R, m_p); + 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; @@ -72,9 +81,11 @@ bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input return false; } -void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform) const +void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const { - b2Vec2 p = transform.position + b2Mul(transform.R, m_p); + 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); } diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h old mode 100644 new mode 100755 index bb31da898..6c1fd543a --- a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -30,14 +30,18 @@ public: /// 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) const; + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const; /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; + void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; /// @see b2Shape::ComputeMass void ComputeMass(b2MassData* massData, float32 density) const; diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.cpp b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.cpp new file mode 100755 index 000000000..e204160b0 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.cpp @@ -0,0 +1,139 @@ +/* +* 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 +using namespace std; + +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 = -normal; + } + else + { + output->normal = 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/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h new file mode 100755 index 000000000..780eb2c5c --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h @@ -0,0 +1,70 @@ +/* +* 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_hasVertex0 = false; + m_hasVertex3 = false; +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp old mode 100644 new mode 100755 index 429e64704..8be813338 --- a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -55,41 +55,29 @@ void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, floa m_centroid = center; b2Transform xf; - xf.position = center; - xf.R.Set(angle); + xf.p = center; + xf.q.Set(angle); // Transform vertices and normals. for (int32 i = 0; i < m_vertexCount; ++i) { m_vertices[i] = b2Mul(xf, m_vertices[i]); - m_normals[i] = b2Mul(xf.R, m_normals[i]); + m_normals[i] = b2Mul(xf.q, m_normals[i]); } } -void b2PolygonShape::SetAsEdge(const b2Vec2& v1, const b2Vec2& v2) +int32 b2PolygonShape::GetChildCount() const { - m_vertexCount = 2; - m_vertices[0] = v1; - m_vertices[1] = v2; - m_centroid = 0.5f * (v1 + v2); - m_normals[0] = b2Cross(v2 - v1, 1.0f); - m_normals[0].Normalize(); - m_normals[1] = -m_normals[0]; + return 1; } static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) { - b2Assert(count >= 2); + b2Assert(count >= 3); b2Vec2 c; c.Set(0.0f, 0.0f); float32 area = 0.0f; - if (count == 2) - { - c = 0.5f * (vs[0] + vs[1]); - return c; - } - // 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); @@ -131,7 +119,7 @@ static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) void b2PolygonShape::Set(const b2Vec2* vertices, int32 count) { - b2Assert(2 <= count && count <= b2_maxPolygonVertices); + b2Assert(3 <= count && count <= b2_maxPolygonVertices); m_vertexCount = count; // Copy vertices. @@ -170,10 +158,10 @@ void b2PolygonShape::Set(const b2Vec2* vertices, int32 count) b2Vec2 r = m_vertices[j] - m_vertices[i1]; - // Your polygon is non-convex (it has an indentation) or - // has colinear edges. + // If this crashes, your polygon is non-convex, has colinear edges, + // or the winding order is wrong. float32 s = b2Cross(edge, r); - b2Assert(s > 0.0f); + b2Assert(s > 0.0f && "ERROR: Please ensure your polygon is convex and has a CCW winding order"); } } #endif @@ -184,7 +172,7 @@ void b2PolygonShape::Set(const b2Vec2* vertices, int32 count) bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const { - b2Vec2 pLocal = b2MulT(xf.R, p - xf.position); + b2Vec2 pLocal = b2MulT(xf.q, p - xf.p); for (int32 i = 0; i < m_vertexCount; ++i) { @@ -198,131 +186,82 @@ bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const return true; } -bool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& xf) const +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.R, input.p1 - xf.position); - b2Vec2 p2 = b2MulT(xf.R, input.p2 - xf.position); + b2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p); + b2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p); b2Vec2 d = p2 - p1; - if (m_vertexCount == 2) - { - b2Vec2 v1 = m_vertices[0]; - b2Vec2 v2 = m_vertices[1]; - b2Vec2 normal = m_normals[0]; + float32 lower = 0.0f, upper = input.maxFraction; - // 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); + int32 index = -1; + + for (int32 i = 0; i < m_vertexCount; ++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) - { - return false; - } - - float32 t = numerator / denominator; - if (t < 0.0f || 1.0f < 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 = -normal; - } - else - { - output->normal = normal; - } - return true; - } - else - { - float32 lower = 0.0f, upper = input.maxFraction; - - int32 index = -1; - - for (int32 i = 0; i < m_vertexCount; ++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) + { + if (numerator < 0.0f) { return false; } } - - b2Assert(0.0f <= lower && lower <= input.maxFraction); - - if (index >= 0) + else { - output->fraction = lower; - output->normal = b2Mul(xf.R, m_normals[index]); - return true; + // 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) const +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; @@ -364,44 +303,30 @@ void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const // // The rest of the derivation is handled by computer algebra. - b2Assert(m_vertexCount >= 2); - - // A line segment has zero mass. - if (m_vertexCount == 2) - { - massData->center = 0.5f * (m_vertices[0] + m_vertices[1]); - massData->mass = 0.0f; - massData->I = 0.0f; - return; - } + b2Assert(m_vertexCount >= 3); b2Vec2 center; center.Set(0.0f, 0.0f); float32 area = 0.0f; float32 I = 0.0f; - // pRef is the reference point for forming triangles. + // s 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 + b2Vec2 s(0.0f, 0.0f); + // This code would put the reference point inside the polygon. for (int32 i = 0; i < m_vertexCount; ++i) { - pRef += m_vertices[i]; + s += m_vertices[i]; } - pRef *= 1.0f / count; -#endif + s *= 1.0f / m_vertexCount; const float32 k_inv3 = 1.0f / 3.0f; for (int32 i = 0; i < m_vertexCount; ++i) { // Triangle vertices. - b2Vec2 p1 = pRef; - b2Vec2 p2 = m_vertices[i]; - b2Vec2 p3 = i + 1 < m_vertexCount ? m_vertices[i+1] : m_vertices[0]; - - b2Vec2 e1 = p2 - p1; - b2Vec2 e2 = p3 - p1; + b2Vec2 e1 = m_vertices[i] - s; + b2Vec2 e2 = i + 1 < m_vertexCount ? m_vertices[i+1] - s : m_vertices[0] - s; float32 D = b2Cross(e1, e2); @@ -409,16 +334,15 @@ void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const area += triangleArea; // Area weighted centroid - center += triangleArea * k_inv3 * (p1 + p2 + p3); + center += triangleArea * k_inv3 * (e1 + e2); - float32 px = p1.x, py = p1.y; float32 ex1 = e1.x, ey1 = e1.y; float32 ex2 = e2.x, ey2 = e2.y; - float32 intx2 = k_inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; - float32 inty2 = k_inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; + float32 intx2 = ex1*ex1 + ex2*ex1 + ex2*ex2; + float32 inty2 = ey1*ey1 + ey2*ey1 + ey2*ey2; - I += D * (intx2 + inty2); + I += (0.25f * k_inv3 * D) * (intx2 + inty2); } // Total mass @@ -427,8 +351,11 @@ void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const // Center of mass b2Assert(area > b2_epsilon); center *= 1.0f / area; - massData->center = center; + massData->center = center + s; - // Inertia tensor relative to the local origin. + // 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)); } diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h old mode 100644 new mode 100755 index 564d4b083..fd11bd162 --- a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -23,6 +23,8 @@ /// 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: @@ -31,8 +33,12 @@ public: /// Implement b2Shape. b2Shape* Clone(b2BlockAllocator* allocator) const; + /// @see b2Shape::GetChildCount + int32 GetChildCount() const; + /// Copy vertices. This assumes the vertices define a convex polygon. /// It is assumed that the exterior is the the right of each edge. + /// The count must be in the range [3, b2_maxPolygonVertices]. void Set(const b2Vec2* vertices, int32 vertexCount); /// Build vertices to represent an axis-aligned box. @@ -47,27 +53,19 @@ public: /// @param angle the rotation of the box in local coordinates. void SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle); - /// Set this as a single edge. - void SetAsEdge(const b2Vec2& v1, const b2Vec2& v2); - /// @see b2Shape::TestPoint bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; /// Implement b2Shape. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const; /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; + 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 m_vertexCount; } @@ -88,40 +86,6 @@ inline b2PolygonShape::b2PolygonShape() m_centroid.SetZero(); } -inline int32 b2PolygonShape::GetSupport(const b2Vec2& d) const -{ - int32 bestIndex = 0; - float32 bestValue = b2Dot(m_vertices[0], d); - for (int32 i = 1; i < m_vertexCount; ++i) - { - float32 value = b2Dot(m_vertices[i], d); - if (value > bestValue) - { - bestIndex = i; - bestValue = value; - } - } - - return bestIndex; -} - -inline const b2Vec2& b2PolygonShape::GetSupportVertex(const b2Vec2& d) const -{ - int32 bestIndex = 0; - float32 bestValue = b2Dot(m_vertices[0], d); - for (int32 i = 1; i < m_vertexCount; ++i) - { - float32 value = b2Dot(m_vertices[i], d); - if (value > bestValue) - { - bestIndex = i; - bestValue = value; - } - } - - return m_vertices[bestIndex]; -} - inline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const { b2Assert(0 <= index && index < m_vertexCount); diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h old mode 100644 new mode 100755 index 9082c0ef9..fd7de2626 --- a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -38,20 +38,20 @@ struct b2MassData /// 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. +/// is created. Shapes may encapsulate a one or more child shapes. class b2Shape { public: enum Type { - e_unknown= -1, e_circle = 0, - e_polygon = 1, - e_typeCount = 2, + e_edge = 1, + e_polygon = 2, + e_chain = 3, + e_typeCount = 4 }; - b2Shape() { m_type = e_unknown; } virtual ~b2Shape() {} /// Clone the concrete shape using the provided allocator. @@ -61,21 +61,27 @@ public: /// @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 this shape. + /// 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. - virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const = 0; + /// @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 this shape. + /// 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. - virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf) const = 0; + /// @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. diff --git a/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp old mode 100644 new mode 100755 index 12c79678d..2aa62f948 --- a/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -18,6 +18,7 @@ #include #include +using namespace std; b2BroadPhase::b2BroadPhase() { @@ -62,6 +63,11 @@ void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& di } } +void b2BroadPhase::TouchProxy(int32 proxyId) +{ + BufferMove(proxyId); +} + void b2BroadPhase::BufferMove(int32 proxyId) { if (m_moveCount == m_moveCapacity) diff --git a/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h old mode 100644 new mode 100755 index bff188e88..c7398c97a --- a/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h +++ b/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -40,7 +40,7 @@ public: enum { - e_nullProxy = -1, + e_nullProxy = -1 }; b2BroadPhase(); @@ -57,6 +57,9 @@ public: /// 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; @@ -88,8 +91,14 @@ public: template void RayCast(T* callback, const b2RayCastInput& input) const; - /// Compute the height of the embedded tree. - int32 ComputeHeight() 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; private: @@ -153,9 +162,19 @@ inline int32 b2BroadPhase::GetProxyCount() const return m_proxyCount; } -inline int32 b2BroadPhase::ComputeHeight() const +inline int32 b2BroadPhase::GetTreeHeight() const { - return m_tree.ComputeHeight(); + return m_tree.GetHeight(); +} + +inline int32 b2BroadPhase::GetTreeBalance() const +{ + return m_tree.GetMaxBalance(); +} + +inline float32 b2BroadPhase::GetTreeQuality() const +{ + return m_tree.GetAreaRatio(); } template @@ -211,7 +230,7 @@ void b2BroadPhase::UpdatePairs(T* callback) } // Try to keep the tree balanced. - m_tree.Rebalance(4); + //m_tree.Rebalance(4); } template diff --git a/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp b/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp old mode 100644 new mode 100755 index 6edf89d7b..0ad58f000 --- a/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* 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 diff --git a/src/modules/physics/box2d/Box2D/Collision/b2CollideEdge.cpp b/src/modules/physics/box2d/Box2D/Collision/b2CollideEdge.cpp new file mode 100755 index 000000000..281967183 --- /dev/null +++ b/src/modules/physics/box2d/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_vertexCount; + for (int32 i = 0; i < polygonB->m_vertexCount; ++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 = 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 = 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 = 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 = 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/src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp b/src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp old mode 100644 new mode 100755 index b37b7ba92..2f0946b92 --- a/src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -23,18 +23,17 @@ static float32 b2EdgeSeparation(const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, const b2PolygonShape* poly2, const b2Transform& xf2) { - int32 count1 = poly1->m_vertexCount; const b2Vec2* vertices1 = poly1->m_vertices; const b2Vec2* normals1 = poly1->m_normals; int32 count2 = poly2->m_vertexCount; const b2Vec2* vertices2 = poly2->m_vertices; - b2Assert(0 <= edge1 && edge1 < count1); + b2Assert(0 <= edge1 && edge1 < poly1->m_vertexCount); // Convert normal from poly1's frame into poly2's frame. - b2Vec2 normal1World = b2Mul(xf1.R, normals1[edge1]); - b2Vec2 normal1 = b2MulT(xf2.R, normal1World); + b2Vec2 normal1World = b2Mul(xf1.q, normals1[edge1]); + b2Vec2 normal1 = b2MulT(xf2.q, normal1World); // Find support vertex on poly2 for -normal. int32 index = 0; @@ -66,7 +65,7 @@ static float32 b2FindMaxSeparation(int32* edgeIndex, // Vector pointing from the centroid of poly1 to the centroid of poly2. b2Vec2 d = b2Mul(xf2, poly2->m_centroid) - b2Mul(xf1, poly1->m_centroid); - b2Vec2 dLocal1 = b2MulT(xf1.R, d); + b2Vec2 dLocal1 = b2MulT(xf1.q, d); // Find edge normal on poly1 that has the largest projection onto d. int32 edge = 0; @@ -143,17 +142,16 @@ static void b2FindIncidentEdge(b2ClipVertex c[2], const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, const b2PolygonShape* poly2, const b2Transform& xf2) { - int32 count1 = poly1->m_vertexCount; const b2Vec2* normals1 = poly1->m_normals; int32 count2 = poly2->m_vertexCount; const b2Vec2* vertices2 = poly2->m_vertices; const b2Vec2* normals2 = poly2->m_normals; - b2Assert(0 <= edge1 && edge1 < count1); + b2Assert(0 <= edge1 && edge1 < poly1->m_vertexCount); // Get the normal of the reference edge in poly2's frame. - b2Vec2 normal1 = b2MulT(xf2.R, b2Mul(xf1.R, normals1[edge1])); + b2Vec2 normal1 = b2MulT(xf2.q, b2Mul(xf1.q, normals1[edge1])); // Find the incident edge on poly2. int32 index = 0; @@ -173,14 +171,16 @@ static void b2FindIncidentEdge(b2ClipVertex c[2], int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0; c[0].v = b2Mul(xf2, vertices2[i1]); - c[0].id.features.referenceEdge = (uint8)edge1; - c[0].id.features.incidentEdge = (uint8)i1; - c[0].id.features.incidentVertex = 0; + 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.features.referenceEdge = (uint8)edge1; - c[1].id.features.incidentEdge = (uint8)i2; - c[1].id.features.incidentVertex = 1; + 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 @@ -242,8 +242,11 @@ void b2CollidePolygons(b2Manifold* manifold, int32 count1 = poly1->m_vertexCount; const b2Vec2* vertices1 = poly1->m_vertices; - b2Vec2 v11 = vertices1[edge1]; - b2Vec2 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; + 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(); @@ -251,7 +254,7 @@ void b2CollidePolygons(b2Manifold* manifold, b2Vec2 localNormal = b2Cross(localTangent, 1.0f); b2Vec2 planePoint = 0.5f * (v11 + v12); - b2Vec2 tangent = b2Mul(xf1.R, localTangent); + b2Vec2 tangent = b2Mul(xf1.q, localTangent); b2Vec2 normal = b2Cross(tangent, 1.0f); v11 = b2Mul(xf1, v11); @@ -270,13 +273,13 @@ void b2CollidePolygons(b2Manifold* manifold, int np; // Clip to box side 1 - np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1); + np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1); if (np < 2) return; // Clip to negative box side 1 - np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2); + np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); if (np < 2) { @@ -297,7 +300,15 @@ void b2CollidePolygons(b2Manifold* manifold, b2ManifoldPoint* cp = manifold->points + pointCount; cp->localPoint = b2MulT(xf2, clipPoints2[i].v); cp->id = clipPoints2[i].id; - cp->id.features.flip = flip; + 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; } } diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp b/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp old mode 100644 new mode 100755 index a86c7c5a8..4b092f0cb --- a/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* 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 @@ -49,7 +49,7 @@ void b2WorldManifold::Initialize(const b2Manifold* manifold, case b2Manifold::e_faceA: { - normal = b2Mul(xfA.R, manifold->localNormal); + normal = b2Mul(xfA.q, manifold->localNormal); b2Vec2 planePoint = b2Mul(xfA, manifold->localPoint); for (int32 i = 0; i < manifold->pointCount; ++i) @@ -64,7 +64,7 @@ void b2WorldManifold::Initialize(const b2Manifold* manifold, case b2Manifold::e_faceB: { - normal = b2Mul(xfB.R, manifold->localNormal); + normal = b2Mul(xfB.q, manifold->localNormal); b2Vec2 planePoint = b2Mul(xfB, manifold->localPoint); for (int32 i = 0; i < manifold->pointCount; ++i) @@ -196,7 +196,7 @@ bool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const // Sutherland-Hodgman clipping. int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], - const b2Vec2& normal, float32 offset) + const b2Vec2& normal, float32 offset, int32 vertexIndexA) { // Start with no output points int32 numOut = 0; @@ -215,26 +215,25 @@ int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], // 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); - if (distance0 > 0.0f) - { - vOut[numOut].id = vIn[0].id; - } - else - { - vOut[numOut].id = vIn[1].id; - } + + // VertexA is hitting edgeB. + vOut[numOut].id.cf.indexA = 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, const b2Shape* shapeB, - const b2Transform& xfA, const b2Transform& xfB) +bool b2TestOverlap( const b2Shape* shapeA, int32 indexA, + const b2Shape* shapeB, int32 indexB, + const b2Transform& xfA, const b2Transform& xfB) { b2DistanceInput input; - input.proxyA.Set(shapeA); - input.proxyB.Set(shapeB); + input.proxyA.Set(shapeA, indexA); + input.proxyB.Set(shapeB, indexB); input.transformA = xfA; input.transformB = xfB; input.useRadii = true; diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Collision.h b/src/modules/physics/box2d/Box2D/Collision/b2Collision.h old mode 100644 new mode 100755 index baffdbde0..27897f70a --- a/src/modules/physics/box2d/Box2D/Collision/b2Collision.h +++ b/src/modules/physics/box2d/Box2D/Collision/b2Collision.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -28,21 +28,31 @@ 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 { - /// The features that intersect to form the contact point - struct Features - { - uint8 referenceEdge; ///< The edge that defines the outward contact normal. - uint8 incidentEdge; ///< The edge most anti-parallel to the reference edge. - uint8 incidentVertex; ///< The vertex (0 or 1) on the incident edge that was clipped. - uint8 flip; ///< A value of 1 indicates that the reference edge is on shape2. - } features; + b2ContactFeature cf; uint32 key; ///< Used to quickly compare contact ids. }; @@ -107,7 +117,7 @@ struct b2WorldManifold const b2Transform& xfA, float32 radiusA, const b2Transform& xfB, float32 radiusB); - b2Vec2 normal; ///< world vector pointing from A to B + b2Vec2 normal; ///< world vector pointing from A to B b2Vec2 points[b2_maxManifoldPoints]; ///< world contact point (point of intersection) }; @@ -165,6 +175,21 @@ struct b2AABB 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) { @@ -191,26 +216,37 @@ struct b2AABB /// Compute the collision manifold between two circles. void b2CollideCircles(b2Manifold* manifold, - const b2CircleShape* circle1, const b2Transform& xf1, - const b2CircleShape* circle2, const b2Transform& xf2); + 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* polygon, const b2Transform& xf1, - const b2CircleShape* circle, const b2Transform& xf2); + 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* polygon1, const b2Transform& xf1, - const b2PolygonShape* polygon2, const b2Transform& xf2); + 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); + const b2Vec2& normal, float32 offset, int32 vertexIndexA); /// Determine if two generic shapes overlap. -bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, - const b2Transform& xfA, const b2Transform& xfB); +bool b2TestOverlap( const b2Shape* shapeA, int32 indexA, + const b2Shape* shapeB, int32 indexB, + const b2Transform& xfA, const b2Transform& xfB); // ---------------- Inline Functions ------------------------------------------ diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp b/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp old mode 100644 new mode 100755 index f95c82f21..2bfb7598a --- a/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* 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 @@ -18,12 +18,14 @@ #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) +void b2DistanceProxy::Set(const b2Shape* shape, int32 index) { switch (shape->GetType()) { @@ -45,6 +47,36 @@ void b2DistanceProxy::Set(const b2Shape* shape) } break; + case b2Shape::e_chain: + { + const b2ChainShape* chain = (b2ChainShape*)shape; + b2Assert(0 <= index && index < chain->GetVertexCount()); + + m_buffer[0] = chain->GetVertex(index); + if (index + 1 < chain->GetVertexCount()) + { + m_buffer[1] = chain->GetVertex(index + 1); + } + else + { + m_buffer[1] = chain->GetVertex(0); + } + + m_vertices = m_buffer; + m_count = 2; + m_radius = chain->m_radius; + } + break; + + case b2Shape::e_edge: + { + const b2EdgeShape* edge = (b2EdgeShape*)shape; + m_vertices = &edge->m_vertex1; + m_count = 2; + m_radius = edge->m_radius; + } + break; + default: b2Assert(false); } @@ -500,10 +532,10 @@ void b2Distance(b2DistanceOutput* output, // Compute a tentative new simplex vertex using support points. b2SimplexVertex* vertex = vertices + simplex.m_count; - vertex->indexA = proxyA->GetSupport(b2MulT(transformA.R, -d)); + vertex->indexA = proxyA->GetSupport(b2MulT(transformA.q, -d)); vertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA)); b2Vec2 wBLocal; - vertex->indexB = proxyB->GetSupport(b2MulT(transformB.R, d)); + vertex->indexB = proxyB->GetSupport(b2MulT(transformB.q, d)); vertex->wB = b2Mul(transformB, proxyB->GetVertex(vertex->indexB)); vertex->w = vertex->wB - vertex->wA; diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Distance.h b/src/modules/physics/box2d/Box2D/Collision/b2Distance.h old mode 100644 new mode 100755 index e56ea0a7b..54ed1e136 --- a/src/modules/physics/box2d/Box2D/Collision/b2Distance.h +++ b/src/modules/physics/box2d/Box2D/Collision/b2Distance.h @@ -1,6 +1,6 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -21,7 +21,6 @@ #define B2_DISTANCE_H #include -#include class b2Shape; @@ -33,7 +32,7 @@ struct b2DistanceProxy /// Initialize the proxy using the given shape. The shape /// must remain in scope while the proxy is in use. - void Set(const b2Shape* shape); + void Set(const b2Shape* shape, int32 index); /// Get the supporting vertex index in the given direction. int32 GetSupport(const b2Vec2& d) const; @@ -47,6 +46,7 @@ struct b2DistanceProxy /// 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; diff --git a/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp old mode 100644 new mode 100755 index d8a05ebdf..1a42c3a5f --- a/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Erin Catto http://www.gphysics.com +* 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 @@ -19,6 +19,8 @@ #include #include #include +using namespace std; + b2DynamicTree::b2DynamicTree() { @@ -26,15 +28,17 @@ b2DynamicTree::b2DynamicTree() m_nodeCapacity = 16; m_nodeCount = 0; - m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); - memset(m_nodes, 0, m_nodeCapacity * sizeof(b2DynamicTreeNode)); + 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; @@ -57,10 +61,10 @@ int32 b2DynamicTree::AllocateNode() b2Assert(m_nodeCount == m_nodeCapacity); // The free list is empty. Rebuild a bigger pool. - b2DynamicTreeNode* oldNodes = m_nodes; + b2TreeNode* oldNodes = m_nodes; m_nodeCapacity *= 2; - m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); - memcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2DynamicTreeNode)); + 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 @@ -68,8 +72,10 @@ int32 b2DynamicTree::AllocateNode() 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; } @@ -79,6 +85,8 @@ int32 b2DynamicTree::AllocateNode() 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; } @@ -89,6 +97,7 @@ 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; } @@ -105,20 +114,10 @@ int32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData) 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); - // Rebalance if necessary. - int32 iterationCount = m_nodeCount >> 4; - int32 tryCount = 0; - int32 height = ComputeHeight(); - while (height > 64 && tryCount < 10) - { - Rebalance(iterationCount); - height = ComputeHeight(); - ++tryCount; - } - return proxyId; } @@ -188,79 +187,133 @@ void b2DynamicTree::InsertLeaf(int32 leaf) return; } - // Find the best sibling for this node. - b2Vec2 center = m_nodes[leaf].aabb.GetCenter(); - int32 sibling = m_root; - if (m_nodes[sibling].IsLeaf() == false) + // Find the best sibling for this node + b2AABB leafAABB = m_nodes[leaf].aabb; + int32 index = m_root; + while (m_nodes[index].IsLeaf() == false) { - do + 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()) { - int32 child1 = m_nodes[sibling].child1; - int32 child2 = m_nodes[sibling].child2; - - b2Vec2 delta1 = b2Abs(m_nodes[child1].aabb.GetCenter() - center); - b2Vec2 delta2 = b2Abs(m_nodes[child2].aabb.GetCenter() - center); - - float32 norm1 = delta1.x + delta1.y; - float32 norm2 = delta2.x + delta2.y; - - if (norm1 < norm2) - { - sibling = child1; - } - else - { - sibling = child2; - } - - } - while(m_nodes[sibling].IsLeaf() == false); - } - - // Create a parent for the siblings. - int32 node1 = m_nodes[sibling].parent; - int32 node2 = AllocateNode(); - m_nodes[node2].parent = node1; - m_nodes[node2].userData = NULL; - m_nodes[node2].aabb.Combine(m_nodes[leaf].aabb, m_nodes[sibling].aabb); - - if (node1 != b2_nullNode) - { - if (m_nodes[m_nodes[sibling].parent].child1 == sibling) - { - m_nodes[node1].child1 = node2; + b2AABB aabb; + aabb.Combine(leafAABB, m_nodes[child1].aabb); + cost1 = aabb.GetPerimeter() + inheritanceCost; } else { - m_nodes[node1].child2 = node2; + b2AABB aabb; + aabb.Combine(leafAABB, m_nodes[child1].aabb); + float32 oldArea = m_nodes[child1].aabb.GetPerimeter(); + float32 newArea = aabb.GetPerimeter(); + cost1 = (newArea - oldArea) + inheritanceCost; } - m_nodes[node2].child1 = sibling; - m_nodes[node2].child2 = leaf; - m_nodes[sibling].parent = node2; - m_nodes[leaf].parent = node2; - - do + // Cost of descending into child2 + float32 cost2; + if (m_nodes[child2].IsLeaf()) { - if (m_nodes[node1].aabb.Contains(m_nodes[node2].aabb)) - { - break; - } - - m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); - node2 = node1; - node1 = m_nodes[node1].parent; + b2AABB aabb; + aabb.Combine(leafAABB, m_nodes[child2].aabb); + cost2 = aabb.GetPerimeter() + inheritanceCost; } - while(node1 != b2_nullNode); + 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 { - m_nodes[node2].child1 = sibling; - m_nodes[node2].child2 = leaf; - m_nodes[sibling].parent = node2; - m_nodes[leaf].parent = node2; - m_root = node2; + // 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) @@ -271,89 +324,250 @@ void b2DynamicTree::RemoveLeaf(int32 leaf) return; } - int32 node2 = m_nodes[leaf].parent; - int32 node1 = m_nodes[node2].parent; + int32 parent = m_nodes[leaf].parent; + int32 grandParent = m_nodes[parent].parent; int32 sibling; - if (m_nodes[node2].child1 == leaf) + if (m_nodes[parent].child1 == leaf) { - sibling = m_nodes[node2].child2; + sibling = m_nodes[parent].child2; } else { - sibling = m_nodes[node2].child1; + sibling = m_nodes[parent].child1; } - if (node1 != b2_nullNode) + if (grandParent != b2_nullNode) { - // Destroy node2 and connect node1 to sibling. - if (m_nodes[node1].child1 == node2) + // Destroy parent and connect sibling to grandParent. + if (m_nodes[grandParent].child1 == parent) { - m_nodes[node1].child1 = sibling; + m_nodes[grandParent].child1 = sibling; } else { - m_nodes[node1].child2 = sibling; + m_nodes[grandParent].child2 = sibling; } - m_nodes[sibling].parent = node1; - FreeNode(node2); + m_nodes[sibling].parent = grandParent; + FreeNode(parent); // Adjust ancestor bounds. - while (node1 != b2_nullNode) + int32 index = grandParent; + while (index != b2_nullNode) { - b2AABB oldAABB = m_nodes[node1].aabb; - m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); + index = Balance(index); - if (oldAABB.Contains(m_nodes[node1].aabb)) - { - break; - } + int32 child1 = m_nodes[index].child1; + int32 child2 = m_nodes[index].child2; - node1 = m_nodes[node1].parent; + 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(node2); + FreeNode(parent); } + + //Validate(); } -void b2DynamicTree::Rebalance(int32 iterations) +// 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; + return 0; } - for (int32 i = 0; i < iterations; ++i) + return m_nodes[m_root].height; +} + +// +float32 b2DynamicTree::GetAreaRatio() const +{ + if (m_root == b2_nullNode) { - int32 node = m_root; - - uint32 bit = 0; - while (m_nodes[node].IsLeaf() == false) - { - int32* children = &m_nodes[node].child1; - node = children[(m_path >> bit) & 1]; - bit = (bit + 1) & (8* sizeof(uint32) - 1); - } - ++m_path; - - RemoveLeaf(node); - InsertLeaf(node); + 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 { - if (nodeId == b2_nullNode) + b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); + b2TreeNode* node = m_nodes + nodeId; + + if (node->IsLeaf()) { return 0; } - b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); - b2DynamicTreeNode* node = m_nodes + nodeId; int32 height1 = ComputeHeight(node->child1); int32 height2 = ComputeHeight(node->child2); return 1 + b2Max(height1, height2); @@ -361,5 +575,197 @@ int32 b2DynamicTree::ComputeHeight(int32 nodeId) const int32 b2DynamicTree::ComputeHeight() const { - return ComputeHeight(m_root); + 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(); } diff --git a/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h old mode 100644 new mode 100755 index b67686b5c..a9bfbf379 --- a/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h +++ b/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Erin Catto http://www.gphysics.com +* 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 @@ -20,23 +20,21 @@ #define B2_DYNAMIC_TREE_H #include - -/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. +#include #define b2_nullNode (-1) /// A node in the dynamic tree. The client does not interact with this directly. -struct b2DynamicTreeNode +struct b2TreeNode { bool IsLeaf() const { return child1 == b2_nullNode; } - /// This is the fattened AABB. + /// Enlarged AABB b2AABB aabb; - //int32 userData; void* userData; union @@ -47,8 +45,12 @@ struct b2DynamicTreeNode 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 @@ -59,7 +61,6 @@ struct b2DynamicTreeNode class b2DynamicTree { public: - /// Constructing the tree initializes the node pool. b2DynamicTree(); @@ -78,9 +79,6 @@ public: /// @return true if the proxy was re-inserted. bool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement); - /// Perform some iterations to re-balance the tree. - void Rebalance(int32 iterations); - /// Get proxy user data. /// @return the proxy user data or 0 if the id is invalid. void* GetUserData(int32 proxyId) const; @@ -88,9 +86,6 @@ public: /// Get the fat AABB for a proxy. const b2AABB& GetFatAABB(int32 proxyId) const; - /// Compute the height of the tree. - int32 ComputeHeight() const; - /// Query an AABB for overlapping proxies. The callback class /// is called for each proxy that overlaps the supplied AABB. template @@ -106,6 +101,23 @@ public: 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(); + private: int32 AllocateNode(); @@ -114,17 +126,23 @@ private: 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; - b2DynamicTreeNode* m_nodes; + b2TreeNode* m_nodes; int32 m_nodeCount; int32 m_nodeCapacity; int32 m_freeList; - /// This is used incrementally traverse the tree for re-balancing. + /// This is used to incrementally traverse the tree for re-balancing. uint32 m_path; int32 m_insertionCount; @@ -145,21 +163,18 @@ inline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const template inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const { - const int32 k_stackSize = 128; - int32 stack[k_stackSize]; + b2GrowableStack stack; + stack.Push(m_root); - int32 count = 0; - stack[count++] = m_root; - - while (count > 0) + while (stack.GetCount() > 0) { - int32 nodeId = stack[--count]; + int32 nodeId = stack.Pop(); if (nodeId == b2_nullNode) { continue; } - const b2DynamicTreeNode* node = m_nodes + nodeId; + const b2TreeNode* node = m_nodes + nodeId; if (b2TestOverlap(node->aabb, aabb)) { @@ -173,15 +188,8 @@ inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const } else { - if (count < k_stackSize) - { - stack[count++] = node->child1; - } - - if (count < k_stackSize) - { - stack[count++] = node->child2; - } + stack.Push(node->child1); + stack.Push(node->child2); } } } @@ -213,21 +221,18 @@ inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) con segmentAABB.upperBound = b2Max(p1, t); } - const int32 k_stackSize = 128; - int32 stack[k_stackSize]; + b2GrowableStack stack; + stack.Push(m_root); - int32 count = 0; - stack[count++] = m_root; - - while (count > 0) + while (stack.GetCount() > 0) { - int32 nodeId = stack[--count]; + int32 nodeId = stack.Pop(); if (nodeId == b2_nullNode) { continue; } - const b2DynamicTreeNode* node = m_nodes + nodeId; + const b2TreeNode* node = m_nodes + nodeId; if (b2TestOverlap(node->aabb, segmentAABB) == false) { @@ -270,15 +275,8 @@ inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) con } else { - if (count < k_stackSize) - { - stack[count++] = node->child1; - } - - if (count < k_stackSize) - { - stack[count++] = node->child2; - } + stack.Push(node->child1); + stack.Push(node->child2); } } } diff --git a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp old mode 100644 new mode 100755 index b1f2f4e5a..5c33e828c --- a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* 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 @@ -23,12 +23,11 @@ #include #include +using namespace std; int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; int32 b2_toiRootIters, b2_toiMaxRootIters; -int32 b2_toiMaxOptIters; - struct b2SeparationFunction { enum Type @@ -42,7 +41,8 @@ struct b2SeparationFunction float32 Initialize(const b2SimplexCache* cache, const b2DistanceProxy* proxyA, const b2Sweep& sweepA, - const b2DistanceProxy* proxyB, const b2Sweep& sweepB) + const b2DistanceProxy* proxyB, const b2Sweep& sweepB, + float32 t1) { m_proxyA = proxyA; m_proxyB = proxyB; @@ -53,8 +53,8 @@ struct b2SeparationFunction m_sweepB = sweepB; b2Transform xfA, xfB; - m_sweepA.GetTransform(&xfA, 0.0f); - m_sweepB.GetTransform(&xfB, 0.0f); + m_sweepA.GetTransform(&xfA, t1); + m_sweepB.GetTransform(&xfB, t1); if (count == 1) { @@ -76,7 +76,7 @@ struct b2SeparationFunction m_axis = b2Cross(localPointB2 - localPointB1, 1.0f); m_axis.Normalize(); - b2Vec2 normal = b2Mul(xfB.R, m_axis); + b2Vec2 normal = b2Mul(xfB.q, m_axis); m_localPoint = 0.5f * (localPointB1 + localPointB2); b2Vec2 pointB = b2Mul(xfB, m_localPoint); @@ -101,7 +101,7 @@ struct b2SeparationFunction m_axis = b2Cross(localPointA2 - localPointA1, 1.0f); m_axis.Normalize(); - b2Vec2 normal = b2Mul(xfA.R, m_axis); + b2Vec2 normal = b2Mul(xfA.q, m_axis); m_localPoint = 0.5f * (localPointA1 + localPointA2); b2Vec2 pointA = b2Mul(xfA, m_localPoint); @@ -129,8 +129,8 @@ struct b2SeparationFunction { case e_points: { - b2Vec2 axisA = b2MulT(xfA.R, m_axis); - b2Vec2 axisB = b2MulT(xfB.R, -m_axis); + b2Vec2 axisA = b2MulT(xfA.q, m_axis); + b2Vec2 axisB = b2MulT(xfB.q, -m_axis); *indexA = m_proxyA->GetSupport(axisA); *indexB = m_proxyB->GetSupport(axisB); @@ -147,10 +147,10 @@ struct b2SeparationFunction case e_faceA: { - b2Vec2 normal = b2Mul(xfA.R, m_axis); + b2Vec2 normal = b2Mul(xfA.q, m_axis); b2Vec2 pointA = b2Mul(xfA, m_localPoint); - b2Vec2 axisB = b2MulT(xfB.R, -normal); + b2Vec2 axisB = b2MulT(xfB.q, -normal); *indexA = -1; *indexB = m_proxyB->GetSupport(axisB); @@ -164,10 +164,10 @@ struct b2SeparationFunction case e_faceB: { - b2Vec2 normal = b2Mul(xfB.R, m_axis); + b2Vec2 normal = b2Mul(xfB.q, m_axis); b2Vec2 pointB = b2Mul(xfB, m_localPoint); - b2Vec2 axisA = b2MulT(xfA.R, -normal); + b2Vec2 axisA = b2MulT(xfA.q, -normal); *indexB = -1; *indexA = m_proxyA->GetSupport(axisA); @@ -197,8 +197,8 @@ struct b2SeparationFunction { case e_points: { - b2Vec2 axisA = b2MulT(xfA.R, m_axis); - b2Vec2 axisB = b2MulT(xfB.R, -m_axis); + b2Vec2 axisA = b2MulT(xfA.q, m_axis); + b2Vec2 axisB = b2MulT(xfB.q, -m_axis); b2Vec2 localPointA = m_proxyA->GetVertex(indexA); b2Vec2 localPointB = m_proxyB->GetVertex(indexB); @@ -212,10 +212,10 @@ struct b2SeparationFunction case e_faceA: { - b2Vec2 normal = b2Mul(xfA.R, m_axis); + b2Vec2 normal = b2Mul(xfA.q, m_axis); b2Vec2 pointA = b2Mul(xfA, m_localPoint); - b2Vec2 axisB = b2MulT(xfB.R, -normal); + b2Vec2 axisB = b2MulT(xfB.q, -normal); b2Vec2 localPointB = m_proxyB->GetVertex(indexB); b2Vec2 pointB = b2Mul(xfB, localPointB); @@ -226,10 +226,10 @@ struct b2SeparationFunction case e_faceB: { - b2Vec2 normal = b2Mul(xfB.R, m_axis); + b2Vec2 normal = b2Mul(xfB.q, m_axis); b2Vec2 pointB = b2Mul(xfB, m_localPoint); - b2Vec2 axisA = b2MulT(xfA.R, -normal); + b2Vec2 axisA = b2MulT(xfA.q, -normal); b2Vec2 localPointA = m_proxyA->GetVertex(indexA); b2Vec2 pointA = b2Mul(xfA, localPointA); @@ -325,7 +325,7 @@ void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input) // Initialize the separating axis. b2SeparationFunction fcn; - fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB); + fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB, t1); #if 0 // Dump the curve seen by the root finder { diff --git a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h old mode 100644 new mode 100755 index b59fb831c..179a1700e --- a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h +++ b/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -21,7 +21,6 @@ #include #include -#include /// Input parameters for b2TimeOfImpact struct b2TOIInput diff --git a/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp old mode 100644 new mode 100755 index ba06f0494..f5060daa2 --- a/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -21,6 +21,7 @@ #include #include #include +using namespace std; int32 b2BlockAllocator::s_blockSizes[b2_blockSizes] = { @@ -100,7 +101,12 @@ void* b2BlockAllocator::Allocate(int32 size) if (size == 0) return NULL; - b2Assert(0 < size && size <= b2_maxBlockSize); + b2Assert(0 < size); + + if (size > b2_maxBlockSize) + { + return b2Alloc(size); + } int32 index = s_blockSizeLookup[size]; b2Assert(0 <= index && index < b2_blockSizes); @@ -155,7 +161,13 @@ void b2BlockAllocator::Free(void* p, int32 size) return; } - b2Assert(0 < size && size <= b2_maxBlockSize); + b2Assert(0 < size); + + if (size > b2_maxBlockSize) + { + b2Free(p); + return; + } int32 index = s_blockSizeLookup[size]; b2Assert(0 <= index && index < b2_blockSizes); diff --git a/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h old mode 100644 new mode 100755 index 93eb2e311..8ba29a5e9 --- a/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h +++ b/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -21,7 +21,7 @@ #include -const int32 b2_chunkSize = 4096; +const int32 b2_chunkSize = 16 * 1024; const int32 b2_maxBlockSize = 640; const int32 b2_blockSizes = 14; const int32 b2_chunkArrayIncrement = 128; @@ -29,16 +29,19 @@ 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 +/// 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(); diff --git a/src/modules/physics/box2d/Box2D/Common/b2Draw.cpp b/src/modules/physics/box2d/Box2D/Common/b2Draw.cpp new file mode 100755 index 000000000..327b58079 --- /dev/null +++ b/src/modules/physics/box2d/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/src/modules/physics/box2d/Box2D/Common/b2Draw.h b/src/modules/physics/box2d/Box2D/Common/b2Draw.h new file mode 100755 index 000000000..de62dd611 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Common/b2Draw.h @@ -0,0 +1,81 @@ +/* +* 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 + +/// 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; +}; diff --git a/src/modules/physics/box2d/Box2D/Common/b2GrowableStack.h b/src/modules/physics/box2d/Box2D/Common/b2GrowableStack.h new file mode 100755 index 000000000..d2e07120f --- /dev/null +++ b/src/modules/physics/box2d/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)); + std::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/src/modules/physics/box2d/Box2D/Common/b2Math.cpp b/src/modules/physics/box2d/Box2D/Common/b2Math.cpp old mode 100644 new mode 100755 index f15a43bd5..b06111dc4 --- a/src/modules/physics/box2d/Box2D/Common/b2Math.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2Math.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com +* 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 @@ -19,22 +19,20 @@ #include const b2Vec2 b2Vec2_zero(0.0f, 0.0f); -const b2Mat22 b2Mat22_identity(1.0f, 0.0f, 0.0f, 1.0f); -const b2Transform b2Transform_identity(b2Vec2_zero, b2Mat22_identity); /// 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(col1, b2Cross(col2, col3)); + float32 det = b2Dot(ex, b2Cross(ey, ez)); if (det != 0.0f) { det = 1.0f / det; } b2Vec3 x; - x.x = det * b2Dot(b, b2Cross(col2, col3)); - x.y = det * b2Dot(col1, b2Cross(b, col3)); - x.z = det * b2Dot(col1, b2Cross(col2, b)); + 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; } @@ -42,7 +40,7 @@ b2Vec3 b2Mat33::Solve33(const b2Vec3& b) const /// than computing the inverse in one-shot cases. b2Vec2 b2Mat33::Solve22(const b2Vec2& b) const { - float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; + float32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y; float32 det = a11 * a22 - a12 * a21; if (det != 0.0f) { diff --git a/src/modules/physics/box2d/Box2D/Common/b2Math.h b/src/modules/physics/box2d/Box2D/Common/b2Math.h old mode 100644 new mode 100755 index c29f59430..fdcd939de --- a/src/modules/physics/box2d/Box2D/Common/b2Math.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Math.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -57,13 +57,8 @@ inline float32 b2InvSqrt(float32 x) return x; } -#define b2Sqrt(x) sqrtf(x) -#define b2Atan2(y, x) atan2f(y, x) - -inline float32 b2Abs(float32 a) -{ - return a > 0.0f ? a : -a; -} +#define b2Sqrt(x) std::sqrt(x) +#define b2Atan2(y, x) std::atan2(y, x) /// A 2D column vector. struct b2Vec2 @@ -147,6 +142,12 @@ struct b2Vec2 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; }; @@ -198,75 +199,49 @@ struct b2Mat22 /// Construct this matrix using columns. b2Mat22(const b2Vec2& c1, const b2Vec2& c2) { - col1 = c1; - col2 = c2; + ex = c1; + ey = c2; } /// Construct this matrix using scalars. b2Mat22(float32 a11, float32 a12, float32 a21, float32 a22) { - col1.x = a11; col1.y = a21; - col2.x = a12; col2.y = a22; - } - - /// Construct this matrix using an angle. This matrix becomes - /// an orthonormal rotation matrix. - explicit b2Mat22(float32 angle) - { - // TODO_ERIN compute sin+cos together. - float32 c = cosf(angle), s = sinf(angle); - col1.x = c; col2.x = -s; - col1.y = s; col2.y = c; + 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) { - col1 = c1; - col2 = c2; - } - - /// Initialize this matrix using an angle. This matrix becomes - /// an orthonormal rotation matrix. - void Set(float32 angle) - { - float32 c = cosf(angle), s = sinf(angle); - col1.x = c; col2.x = -s; - col1.y = s; col2.y = c; + ex = c1; + ey = c2; } /// Set this to the identity matrix. void SetIdentity() { - col1.x = 1.0f; col2.x = 0.0f; - col1.y = 0.0f; col2.y = 1.0f; + ex.x = 1.0f; ey.x = 0.0f; + ex.y = 0.0f; ey.y = 1.0f; } /// Set this matrix to all zeros. void SetZero() { - col1.x = 0.0f; col2.x = 0.0f; - col1.y = 0.0f; col2.y = 0.0f; - } - - /// Extract the angle from this matrix (assumed to be - /// a rotation matrix). - float32 GetAngle() const - { - return b2Atan2(col1.y, col1.x); + ex.x = 0.0f; ey.x = 0.0f; + ex.y = 0.0f; ey.y = 0.0f; } b2Mat22 GetInverse() const { - float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; + 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.col1.x = det * d; B.col2.x = -det * b; - B.col1.y = -det * c; B.col2.y = det * a; + B.ex.x = det * d; B.ey.x = -det * b; + B.ex.y = -det * c; B.ey.y = det * a; return B; } @@ -274,7 +249,7 @@ struct b2Mat22 /// than computing the inverse in one-shot cases. b2Vec2 Solve(const b2Vec2& b) const { - float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; + float32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y; float32 det = a11 * a22 - a12 * a21; if (det != 0.0f) { @@ -286,7 +261,7 @@ struct b2Mat22 return x; } - b2Vec2 col1, col2; + b2Vec2 ex, ey; }; /// A 3-by-3 matrix. Stored in column-major order. @@ -298,17 +273,17 @@ struct b2Mat33 /// Construct this matrix using columns. b2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3) { - col1 = c1; - col2 = c2; - col3 = c3; + ex = c1; + ey = c2; + ez = c3; } /// Set this matrix to all zeros. void SetZero() { - col1.SetZero(); - col2.SetZero(); - col3.SetZero(); + ex.SetZero(); + ey.SetZero(); + ez.SetZero(); } /// Solve A * x = b, where b is a column vector. This is more efficient @@ -320,41 +295,85 @@ struct b2Mat33 /// 2-by-2 matrix equation. b2Vec2 Solve22(const b2Vec2& b) const; - b2Vec3 col1, col2, col3; + 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 (for performance). + /// The default constructor does nothing. b2Transform() {} - /// Initialize using a position vector and a rotation matrix. - b2Transform(const b2Vec2& position, const b2Mat22& R) : position(position), R(R) {} + /// 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() { - position.SetZero(); - R.SetIdentity(); + p.SetZero(); + q.SetIdentity(); } /// Set this based on the position and angle. - void Set(const b2Vec2& p, float32 angle) + void Set(const b2Vec2& position, float32 angle) { - position = p; - R.Set(angle); + p = position; + q.Set(angle); } - /// Calculate the angle that the rotation matrix represents. - float32 GetAngle() const - { - return b2Atan2(R.col1.y, R.col1.x); - } - - b2Vec2 position; - b2Mat22 R; + b2Vec2 p; + b2Rot q; }; /// This describes the motion of a body/shape for TOI computation. @@ -364,12 +383,12 @@ struct b2Transform struct b2Sweep { /// Get the interpolated transform at a specific time. - /// @param alpha is a factor in [0,1], where 0 indicates t0. - void GetTransform(b2Transform* xf, float32 alpha) const; + /// @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 t the new initial time. - void Advance(float32 t); + /// @param alpha the new initial time. + void Advance(float32 alpha); /// Normalize the angles. void Normalize(); @@ -377,12 +396,14 @@ struct b2Sweep 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; -extern const b2Mat22 b2Mat22_identity; -extern const b2Transform b2Transform_identity; /// Perform the dot product on two vectors. inline float32 b2Dot(const b2Vec2& a, const b2Vec2& b) @@ -414,14 +435,14 @@ inline b2Vec2 b2Cross(float32 s, const b2Vec2& a) /// then this transforms the vector from one frame to another. inline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v) { - return b2Vec2(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y); + 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.col1), b2Dot(v, A.col2)); + return b2Vec2(b2Dot(v, A.ex), b2Dot(v, A.ey)); } /// Add two vectors component-wise. @@ -489,40 +510,109 @@ inline b2Vec3 b2Cross(const b2Vec3& a, const b2Vec3& b) inline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B) { - return b2Mat22(A.col1 + B.col1, A.col2 + B.col2); + 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.col1), b2Mul(A, B.col2)); + 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.col1, B.col1), b2Dot(A.col2, B.col1)); - b2Vec2 c2(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2)); + 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.col1 + v.y * A.col2 + v.z * A.col3; + return v.x * A.ex + v.y * A.ey + v.z * A.ez; +} + +/// 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.position.x + T.R.col1.x * v.x + T.R.col2.x * v.y; - float32 y = T.position.y + T.R.col1.y * v.x + T.R.col2.y * v.y; + 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) { - return b2MulT(T.R, v - T.position); + 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) @@ -532,7 +622,7 @@ inline b2Vec2 b2Abs(const b2Vec2& a) inline b2Mat22 b2Abs(const b2Mat22& A) { - return b2Mat22(b2Abs(A.col1), b2Abs(A.col2)); + return b2Mat22(b2Abs(A.ex), b2Abs(A.ey)); } template @@ -596,20 +686,23 @@ inline bool b2IsPowerOfTwo(uint32 x) return result; } -inline void b2Sweep::GetTransform(b2Transform* xf, float32 alpha) const +inline void b2Sweep::GetTransform(b2Transform* xf, float32 beta) const { - xf->position = (1.0f - alpha) * c0 + alpha * c; - float32 angle = (1.0f - alpha) * a0 + alpha * a; - xf->R.Set(angle); + xf->p = (1.0f - beta) * c0 + beta * c; + float32 angle = (1.0f - beta) * a0 + beta * a; + xf->q.Set(angle); // Shift to origin - xf->position -= b2Mul(xf->R, localCenter); + xf->p -= b2Mul(xf->q, localCenter); } -inline void b2Sweep::Advance(float32 t) +inline void b2Sweep::Advance(float32 alpha) { - c0 = (1.0f - t) * c0 + t * c; - a0 = (1.0f - t) * a0 + t * a; + b2Assert(alpha0 < 1.0f); + float32 beta = (alpha - alpha0) / (1.0f - alpha0); + c0 = (1.0f - beta) * c0 + beta * c; + a0 = (1.0f - beta) * a0 + beta * a; + alpha0 = alpha; } /// Normalize an angle in radians to be between -pi and pi diff --git a/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp b/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp old mode 100644 new mode 100755 index da308149f..97f5283f4 --- a/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -19,7 +19,7 @@ #include #include -b2Version b2_version = {2, 1, 2}; +b2Version b2_version = {2, 2, 0}; // Memory allocators. Modify these to use your own allocator. void* b2Alloc(int32 size) diff --git a/src/modules/physics/box2d/Box2D/Common/b2Settings.h b/src/modules/physics/box2d/Box2D/Common/b2Settings.h old mode 100644 new mode 100755 index 1aa8c2661..eabc526d0 --- a/src/modules/physics/box2d/Box2D/Common/b2Settings.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Settings.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -32,6 +32,7 @@ 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 @@ -43,10 +44,12 @@ typedef float float32; // Collision -/// The maximum number of contact points between two convex shapes. +/// 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. +/// 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 @@ -72,6 +75,9 @@ typedef float float32; /// 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 @@ -103,7 +109,9 @@ typedef float float32; /// 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_contactBaumgarte 0.2f +#define b2_baumgarte 0.2f +#define b2_toiBaugarte 0.75f + // Sleep @@ -136,16 +144,4 @@ struct b2Version /// Current version. extern b2Version b2_version; -/// Friction mixing law. Feel free to customize this. -inline float32 b2MixFriction(float32 friction1, float32 friction2) -{ - return sqrtf(friction1 * friction2); -} - -/// Restitution mixing law. Feel free to customize this. -inline float32 b2MixRestitution(float32 restitution1, float32 restitution2) -{ - return restitution1 > restitution2 ? restitution1 : restitution2; -} - #endif diff --git a/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp old mode 100644 new mode 100755 index cb2c42e01..4a862835b --- a/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 diff --git a/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h old mode 100644 new mode 100755 index 315cc02ff..796c51dfd --- a/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h +++ b/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 diff --git a/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp b/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp new file mode 100755 index 000000000..b1863c296 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp @@ -0,0 +1,100 @@ +/* +* 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; + +#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_msec = t.tv_usec * 0.001f; +} + +float32 b2Timer::GetMilliseconds() const +{ + timeval t; + gettimeofday(&t, 0); + return (t.tv_sec - m_start_sec) * 1000 + t.tv_usec * 0.001f - m_start_msec; +} + +#else + +b2Timer::b2Timer() +{ +} + +void b2Timer::Reset() +{ +} + +float32 b2Timer::GetMilliseconds() const +{ + return 0.0f; +} + +#endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.h b/src/modules/physics/box2d/Box2D/Common/b2Timer.h old mode 100644 new mode 100755 similarity index 54% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.h rename to src/modules/physics/box2d/Box2D/Common/b2Timer.h index c092e2a81..678f6ffe4 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Timer.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com +* 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 @@ -16,36 +16,30 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef B2_TOI_SOLVER_H -#define B2_TOI_SOLVER_H +#include -#include - -class b2Contact; -class b2Body; -struct b2TOIConstraint; -class b2StackAllocator; - -/// This is a pure position solver for a single movable body in contact with -/// multiple non-moving bodies. -class b2TOISolver +/// Timer for profiling. This has platform specific code and may +/// not work on every platform. +class b2Timer { public: - b2TOISolver(b2StackAllocator* allocator); - ~b2TOISolver(); - void Initialize(b2Contact** contacts, int32 contactCount, b2Body* toiBody); - void Clear(); + /// Constructor + b2Timer(); - // Perform one solver iteration. Returns true if converged. - bool Solve(float32 baumgarte); + /// Reset the timer. + void Reset(); + + /// Get the time since construction or the last reset. + float32 GetMilliseconds() const; private: - b2TOIConstraint* m_constraints; - int32 m_count; - b2Body* m_toiBody; - b2StackAllocator* m_allocator; -}; - +#if defined(WIN32) + float64 m_start; + static float64 s_invFrequency; +#elif defined(__linux__) || defined (__APPLE__) + unsigned long m_start_sec; + unsigned long m_start_msec; #endif +}; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp new file mode 100755 index 000000000..3886dfd70 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp @@ -0,0 +1,54 @@ +/* +* 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 +using namespace std; + +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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h new file mode 100755 index 000000000..2dad0b64f --- /dev/null +++ b/src/modules/physics/box2d/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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp new file mode 100755 index 000000000..02bcaaf6a --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp @@ -0,0 +1,54 @@ +/* +* 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 +using namespace std; + +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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h new file mode 100755 index 000000000..8f30ee867 --- /dev/null +++ b/src/modules/physics/box2d/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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp old mode 100644 new mode 100755 index 6df009125..584ef2f1f --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -24,8 +24,9 @@ #include #include +using namespace std; -b2Contact* b2CircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +b2Contact* b2CircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) { void* mem = allocator->Allocate(sizeof(b2CircleContact)); return new (mem) b2CircleContact(fixtureA, fixtureB); @@ -38,7 +39,7 @@ void b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) } b2CircleContact::b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) - : b2Contact(fixtureA, fixtureB) + : b2Contact(fixtureA, 0, fixtureB, 0) { b2Assert(m_fixtureA->GetType() == b2Shape::e_circle); b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h old mode 100644 new mode 100755 index afc277aa0..aac1f0bd6 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -26,7 +26,8 @@ class b2BlockAllocator; class b2CircleContact : public b2Contact { public: - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + 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); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp old mode 100644 new mode 100755 index e7ad1ca5b..557af7f08 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -20,6 +20,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -38,13 +42,17 @@ 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(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); - b2Assert(b2Shape::e_unknown < type2 && type2 < b2Shape::e_typeCount); + 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; @@ -58,7 +66,7 @@ void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* dest } } -b2Contact* b2Contact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +b2Contact* b2Contact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator) { if (s_initialized == false) { @@ -69,19 +77,19 @@ b2Contact* b2Contact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAl b2Shape::Type type1 = fixtureA->GetType(); b2Shape::Type type2 = fixtureB->GetType(); - b2Assert(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); - b2Assert(b2Shape::e_unknown < type2 && type2 < b2Shape::e_typeCount); + 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, fixtureB, allocator); + return createFcn(fixtureA, indexA, fixtureB, indexB, allocator); } else { - return createFcn(fixtureB, fixtureA, allocator); + return createFcn(fixtureB, indexB, fixtureA, indexA, allocator); } } else @@ -103,20 +111,23 @@ void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) b2Shape::Type typeA = contact->GetFixtureA()->GetType(); b2Shape::Type typeB = contact->GetFixtureB()->GetType(); - b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); - b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); + 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, b2Fixture* fB) +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; @@ -133,6 +144,9 @@ b2Contact::b2Contact(b2Fixture* fA, b2Fixture* fB) 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); } // Update the contact manifold and touching status. @@ -161,7 +175,7 @@ void b2Contact::Update(b2ContactListener* listener) { const b2Shape* shapeA = m_fixtureA->GetShape(); const b2Shape* shapeB = m_fixtureB->GetShape(); - touching = b2TestOverlap(shapeA, shapeB, xfA, xfB); + touching = b2TestOverlap(shapeA, m_indexA, shapeB, m_indexB, xfA, xfB); // Sensors don't generate manifolds. m_manifold.pointCount = 0; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h old mode 100644 new mode 100755 index a6add3dc4..7b5a6ab88 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -22,7 +22,6 @@ #include #include #include -#include #include class b2Body; @@ -33,7 +32,23 @@ class b2BlockAllocator; class b2StackAllocator; class b2ContactListener; -typedef b2Contact* b2ContactCreateFcn(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); +/// 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 std::sqrt(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 @@ -86,14 +101,40 @@ public: b2Contact* GetNext(); const b2Contact* GetNext() const; - /// Get the first fixture in this contact. + /// Get fixture A in this contact. b2Fixture* GetFixtureA(); const b2Fixture* GetFixtureA() const; - /// Get the second fixture in this contact. + /// 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(); + /// Evaluate this contact with your own manifold and transforms. virtual void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) = 0; @@ -122,6 +163,8 @@ protected: // 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. @@ -130,12 +173,12 @@ protected: static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn, b2Shape::Type typeA, b2Shape::Type typeB); static void InitializeRegisters(); - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + 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, b2Fixture* fixtureB); + b2Contact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB); virtual ~b2Contact() {} void Update(b2ContactListener* listener); @@ -156,10 +199,16 @@ protected: b2Fixture* m_fixtureA; b2Fixture* m_fixtureB; + int32 m_indexA; + int32 m_indexB; + b2Manifold m_manifold; int32 m_toiCount; -// float32 m_toi; + float32 m_toi; + + float32 m_friction; + float32 m_restitution; }; inline b2Manifold* b2Contact::GetManifold() @@ -229,14 +278,54 @@ 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); +} + #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp old mode 100644 new mode 100755 index f65fb60ee..c990d7fb8 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -17,6 +17,7 @@ */ #include + #include #include #include @@ -25,17 +26,36 @@ #define B2_DEBUG_SOLVER 0 -b2ContactSolver::b2ContactSolver(b2Contact** contacts, int32 contactCount, - b2StackAllocator* allocator, float32 impulseRatio) +struct b2ContactPositionConstraint { - m_allocator = allocator; + 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; +}; - m_constraintCount = contactCount; - m_constraints = (b2ContactConstraint*)m_allocator->Allocate(m_constraintCount * sizeof(b2ContactConstraint)); +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; - for (int32 i = 0; i < m_constraintCount; ++i) + // Initialize position independent portions of the constraints. + for (int32 i = 0; i < m_count; ++i) { - b2Contact* contact = contacts[i]; + b2Contact* contact = m_contacts[i]; b2Fixture* fixtureA = contact->m_fixtureA; b2Fixture* fixtureB = contact->m_fixtureB; @@ -47,222 +67,302 @@ b2ContactSolver::b2ContactSolver(b2Contact** contacts, int32 contactCount, b2Body* bodyB = fixtureB->GetBody(); b2Manifold* manifold = contact->GetManifold(); - float32 friction = b2MixFriction(fixtureA->GetFriction(), fixtureB->GetFriction()); - float32 restitution = b2MixRestitution(fixtureA->GetRestitution(), fixtureB->GetRestitution()); + int32 pointCount = manifold->pointCount; + b2Assert(pointCount > 0); - b2Vec2 vA = bodyA->m_linearVelocity; - b2Vec2 vB = bodyB->m_linearVelocity; - float32 wA = bodyA->m_angularVelocity; - float32 wB = bodyB->m_angularVelocity; + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; + vc->friction = contact->m_friction; + vc->restitution = contact->m_restitution; + 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(); - b2Assert(manifold->pointCount > 0); + 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; - b2WorldManifold worldManifold; - worldManifold.Initialize(manifold, bodyA->m_xf, radiusA, bodyB->m_xf, radiusB); - - b2ContactConstraint* cc = m_constraints + i; - cc->bodyA = bodyA; - cc->bodyB = bodyB; - cc->manifold = manifold; - cc->normal = worldManifold.normal; - cc->pointCount = manifold->pointCount; - cc->friction = friction; - - cc->localNormal = manifold->localNormal; - cc->localPoint = manifold->localPoint; - cc->radius = radiusA + radiusB; - cc->type = manifold->type; - - for (int32 j = 0; j < cc->pointCount; ++j) + for (int32 j = 0; j < pointCount; ++j) { b2ManifoldPoint* cp = manifold->points + j; - b2ContactConstraintPoint* ccp = cc->points + j; - - ccp->normalImpulse = impulseRatio * cp->normalImpulse; - ccp->tangentImpulse = impulseRatio * cp->tangentImpulse; - - ccp->localPoint = cp->localPoint; - - ccp->rA = worldManifold.points[j] - bodyA->m_sweep.c; - ccp->rB = worldManifold.points[j] - bodyB->m_sweep.c; - - float32 rnA = b2Cross(ccp->rA, cc->normal); - float32 rnB = b2Cross(ccp->rB, cc->normal); - rnA *= rnA; - rnB *= rnB; - - float32 kNormal = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rnA + bodyB->m_invI * rnB; - - b2Assert(kNormal > b2_epsilon); - ccp->normalMass = 1.0f / kNormal; - - b2Vec2 tangent = b2Cross(cc->normal, 1.0f); - - float32 rtA = b2Cross(ccp->rA, tangent); - float32 rtB = b2Cross(ccp->rB, tangent); - rtA *= rtA; - rtB *= rtB; - - float32 kTangent = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rtA + bodyB->m_invI * rtB; - - b2Assert(kTangent > b2_epsilon); - ccp->tangentMass = 1.0f / kTangent; - - // Setup a velocity bias for restitution. - ccp->velocityBias = 0.0f; - float32 vRel = b2Dot(cc->normal, vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA)); - if (vRel < -b2_velocityThreshold) + b2VelocityConstraintPoint* vcp = vc->points + j; + + if (m_step.warmStarting) { - ccp->velocityBias = -restitution * vRel; - } - } - - // If we have two points, then prepare the block solver. - if (cc->pointCount == 2) - { - b2ContactConstraintPoint* ccp1 = cc->points + 0; - b2ContactConstraintPoint* ccp2 = cc->points + 1; - - float32 invMassA = bodyA->m_invMass; - float32 invIA = bodyA->m_invI; - float32 invMassB = bodyB->m_invMass; - float32 invIB = bodyB->m_invI; - - float32 rn1A = b2Cross(ccp1->rA, cc->normal); - float32 rn1B = b2Cross(ccp1->rB, cc->normal); - float32 rn2A = b2Cross(ccp2->rA, cc->normal); - float32 rn2B = b2Cross(ccp2->rB, cc->normal); - - float32 k11 = invMassA + invMassB + invIA * rn1A * rn1A + invIB * rn1B * rn1B; - float32 k22 = invMassA + invMassB + invIA * rn2A * rn2A + invIB * rn2B * rn2B; - float32 k12 = invMassA + invMassB + invIA * rn1A * rn2A + invIB * rn1B * rn2B; - - // Ensure a reasonable condition number. - const float32 k_maxConditionNumber = 100.0f; - if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) - { - // K is safe to invert. - cc->K.col1.Set(k11, k12); - cc->K.col2.Set(k12, k22); - cc->normalMass = cc->K.GetInverse(); + vcp->normalImpulse = m_step.dtRatio * cp->normalImpulse; + vcp->tangentImpulse = m_step.dtRatio * cp->tangentImpulse; } else { - // The constraints are redundant, just use one. - // TODO_ERIN use deepest? - cc->pointCount = 1; + 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_constraints); + 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_constraintCount; ++i) + for (int32 i = 0; i < m_count; ++i) { - b2ContactConstraint* c = m_constraints + i; + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; - float32 invMassA = bodyA->m_invMass; - float32 invIA = bodyA->m_invI; - float32 invMassB = bodyB->m_invMass; - float32 invIB = bodyB->m_invI; - b2Vec2 normal = c->normal; + 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 < c->pointCount; ++j) + for (int32 j = 0; j < pointCount; ++j) { - b2ContactConstraintPoint* ccp = c->points + j; - b2Vec2 P = ccp->normalImpulse * normal + ccp->tangentImpulse * tangent; - bodyA->m_angularVelocity -= invIA * b2Cross(ccp->rA, P); - bodyA->m_linearVelocity -= invMassA * P; - bodyB->m_angularVelocity += invIB * b2Cross(ccp->rB, P); - bodyB->m_linearVelocity += invMassB * P; + 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_constraintCount; ++i) + for (int32 i = 0; i < m_count; ++i) { - b2ContactConstraint* c = m_constraints + i; - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; - float32 wA = bodyA->m_angularVelocity; - float32 wB = bodyB->m_angularVelocity; - b2Vec2 vA = bodyA->m_linearVelocity; - b2Vec2 vB = bodyB->m_linearVelocity; - float32 invMassA = bodyA->m_invMass; - float32 invIA = bodyA->m_invI; - float32 invMassB = bodyB->m_invMass; - float32 invIB = bodyB->m_invI; - b2Vec2 normal = c->normal; + 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 = c->friction; + float32 friction = vc->friction; - b2Assert(c->pointCount == 1 || c->pointCount == 2); + b2Assert(pointCount == 1 || pointCount == 2); - // Solve tangent constraints - for (int32 j = 0; j < c->pointCount; ++j) + // Solve tangent constraints first because non-penetration is more important + // than friction. + for (int32 j = 0; j < pointCount; ++j) { - b2ContactConstraintPoint* ccp = c->points + j; + b2VelocityConstraintPoint* vcp = vc->points + j; // Relative velocity at contact - b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); + b2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA); // Compute tangent force float32 vt = b2Dot(dv, tangent); - float32 lambda = ccp->tangentMass * (-vt); + float32 lambda = vcp->tangentMass * (-vt); // b2Clamp the accumulated force - float32 maxFriction = friction * ccp->normalImpulse; - float32 newImpulse = b2Clamp(ccp->tangentImpulse + lambda, -maxFriction, maxFriction); - lambda = newImpulse - ccp->tangentImpulse; + 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 -= invMassA * P; - wA -= invIA * b2Cross(ccp->rA, P); + vA -= mA * P; + wA -= iA * b2Cross(vcp->rA, P); - vB += invMassB * P; - wB += invIB * b2Cross(ccp->rB, P); - - ccp->tangentImpulse = newImpulse; + vB += mB * P; + wB += iB * b2Cross(vcp->rB, P); } // Solve normal constraints - if (c->pointCount == 1) + if (vc->pointCount == 1) { - b2ContactConstraintPoint* ccp = c->points + 0; + b2VelocityConstraintPoint* vcp = vc->points + 0; // Relative velocity at contact - b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); + b2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA); // Compute normal impulse float32 vn = b2Dot(dv, normal); - float32 lambda = -ccp->normalMass * (vn - ccp->velocityBias); + float32 lambda = -vcp->normalMass * (vn - vcp->velocityBias); // b2Clamp the accumulated impulse - float32 newImpulse = b2Max(ccp->normalImpulse + lambda, 0.0f); - lambda = newImpulse - ccp->normalImpulse; + float32 newImpulse = b2Max(vcp->normalImpulse + lambda, 0.0f); + lambda = newImpulse - vcp->normalImpulse; + vcp->normalImpulse = newImpulse; // Apply contact impulse b2Vec2 P = lambda * normal; - vA -= invMassA * P; - wA -= invIA * b2Cross(ccp->rA, P); + vA -= mA * P; + wA -= iA * b2Cross(vcp->rA, P); - vB += invMassB * P; - wB += invIB * b2Cross(ccp->rB, P); - ccp->normalImpulse = newImpulse; + vB += mB * P; + wB += iB * b2Cross(vcp->rB, P); } else { @@ -272,7 +372,7 @@ void b2ContactSolver::SolveVelocityConstraints() // 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 = vn_0 - velocityBias + // 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 @@ -284,18 +384,23 @@ void b2ContactSolver::SolveVelocityConstraints() // // Substitute: // - // x = x' - a + // x = a + d // - // Plug into above equation: + // a := old total impulse + // x := new total impulse + // d := incremental impulse // - // vn = A * x + b - // = A * (x' - a) + b - // = A * x' + b - A * a - // = A * x' + b' + // 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; - b2ContactConstraintPoint* cp1 = c->points + 0; - b2ContactConstraintPoint* cp2 = c->points + 1; + 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); @@ -311,7 +416,9 @@ void b2ContactSolver::SolveVelocityConstraints() b2Vec2 b; b.x = vn1 - cp1->velocityBias; b.y = vn2 - cp2->velocityBias; - b -= b2Mul(c->K, a); + + // Compute b' + b -= b2Mul(vc->K, a); const float32 k_errorTol = 1e-3f; B2_NOT_USED(k_errorTol); @@ -321,27 +428,27 @@ void b2ContactSolver::SolveVelocityConstraints() // // Case 1: vn = 0 // - // 0 = A * x' + b' + // 0 = A * x + b' // - // Solve for x': + // Solve for x: // - // x' = - inv(A) * b' + // x = - inv(A) * b' // - b2Vec2 x = - b2Mul(c->normalMass, b); + b2Vec2 x = - b2Mul(vc->normalMass, b); if (x.x >= 0.0f && x.y >= 0.0f) { - // Resubstitute for the incremental impulse + // Get the incremental impulse b2Vec2 d = x - a; // Apply incremental impulse b2Vec2 P1 = d.x * normal; b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); // Accumulate cp1->normalImpulse = x.x; @@ -365,27 +472,27 @@ void b2ContactSolver::SolveVelocityConstraints() // // Case 2: vn1 = 0 and x2 = 0 // - // 0 = a11 * x1' + a12 * 0 + b1' - // vn2 = a21 * x1' + a22 * 0 + b2' + // 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 = c->K.col1.y * x.x + b.y; + vn2 = vc->K.ex.y * x.x + b.y; if (x.x >= 0.0f && vn2 >= 0.0f) { - // Resubstitute for the incremental impulse + // Get the incremental impulse b2Vec2 d = x - a; // Apply incremental impulse b2Vec2 P1 = d.x * normal; b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); // Accumulate cp1->normalImpulse = x.x; @@ -407,12 +514,12 @@ void b2ContactSolver::SolveVelocityConstraints() // // Case 3: vn2 = 0 and x1 = 0 // - // vn1 = a11 * 0 + a12 * x2' + b1' - // 0 = a21 * 0 + a22 * x2' + b2' + // vn1 = a11 * 0 + a12 * x2 + b1' + // 0 = a21 * 0 + a22 * x2 + b2' // x.x = 0.0f; x.y = - cp2->normalMass * b.y; - vn1 = c->K.col2.x * x.y + b.x; + vn1 = vc->K.ey.x * x.y + b.x; vn2 = 0.0f; if (x.y >= 0.0f && vn1 >= 0.0f) @@ -423,11 +530,11 @@ void b2ContactSolver::SolveVelocityConstraints() // Apply incremental impulse b2Vec2 P1 = d.x * normal; b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); // Accumulate cp1->normalImpulse = x.x; @@ -463,11 +570,11 @@ void b2ContactSolver::SolveVelocityConstraints() // Apply incremental impulse b2Vec2 P1 = d.x * normal; b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); // Accumulate cp1->normalImpulse = x.x; @@ -481,73 +588,65 @@ void b2ContactSolver::SolveVelocityConstraints() } } - bodyA->m_linearVelocity = vA; - bodyA->m_angularVelocity = wA; - bodyB->m_linearVelocity = vB; - bodyB->m_angularVelocity = wB; + 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_constraintCount; ++i) + for (int32 i = 0; i < m_count; ++i) { - b2ContactConstraint* c = m_constraints + i; - b2Manifold* m = c->manifold; + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; + b2Manifold* manifold = m_contacts[vc->contactIndex]->GetManifold(); - for (int32 j = 0; j < c->pointCount; ++j) + for (int32 j = 0; j < vc->pointCount; ++j) { - m->points[j].normalImpulse = c->points[j].normalImpulse; - m->points[j].tangentImpulse = c->points[j].tangentImpulse; + manifold->points[j].normalImpulse = vc->points[j].normalImpulse; + manifold->points[j].tangentImpulse = vc->points[j].tangentImpulse; } } } struct b2PositionSolverManifold { - void Initialize(b2ContactConstraint* cc, int32 index) + void Initialize(b2ContactPositionConstraint* pc, const b2Transform& xfA, const b2Transform& xfB, int32 index) { - b2Assert(cc->pointCount > 0); + b2Assert(pc->pointCount > 0); - switch (cc->type) + switch (pc->type) { case b2Manifold::e_circles: { - b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); - b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->points[0].localPoint); - if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) - { - normal = pointB - pointA; - normal.Normalize(); - } - else - { - normal.Set(1.0f, 0.0f); - } - + 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) - cc->radius; + separation = b2Dot(pointB - pointA, normal) - pc->radiusA - pc->radiusB; } break; case b2Manifold::e_faceA: { - normal = cc->bodyA->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); + normal = b2Mul(xfA.q, pc->localNormal); + b2Vec2 planePoint = b2Mul(xfA, pc->localPoint); - b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->points[index].localPoint); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + b2Vec2 clipPoint = b2Mul(xfB, pc->localPoints[index]); + separation = b2Dot(clipPoint - planePoint, normal) - pc->radiusA - pc->radiusB; point = clipPoint; } break; case b2Manifold::e_faceB: { - normal = cc->bodyB->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); + normal = b2Mul(xfB.q, pc->localNormal); + b2Vec2 planePoint = b2Mul(xfB, pc->localPoint); - b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->points[index].localPoint); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; + 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 @@ -563,58 +662,168 @@ struct b2PositionSolverManifold }; // Sequential solver. -bool b2ContactSolver::SolvePositionConstraints(float32 baumgarte) +bool b2ContactSolver::SolvePositionConstraints() { float32 minSeparation = 0.0f; - for (int32 i = 0; i < m_constraintCount; ++i) + for (int32 i = 0; i < m_count; ++i) { - b2ContactConstraint* c = m_constraints + i; - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; + b2ContactPositionConstraint* pc = m_positionConstraints + i; - float32 invMassA = bodyA->m_mass * bodyA->m_invMass; - float32 invIA = bodyA->m_mass * bodyA->m_invI; - float32 invMassB = bodyB->m_mass * bodyB->m_invMass; - float32 invIB = bodyB->m_mass * bodyB->m_invI; + 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 < c->pointCount; ++j) + 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(c, j); + psm.Initialize(pc, xfA, xfB, j); b2Vec2 normal = psm.normal; b2Vec2 point = psm.point; float32 separation = psm.separation; - b2Vec2 rA = point - bodyA->m_sweep.c; - b2Vec2 rB = point - bodyB->m_sweep.c; + 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(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); + 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 = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; + 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; - bodyA->m_sweep.c -= invMassA * P; - bodyA->m_sweep.a -= invIA * b2Cross(rA, P); - bodyA->SynchronizeTransform(); + cA -= mA * P; + aA -= iA * b2Cross(rA, P); - bodyB->m_sweep.c += invMassB * P; - bodyB->m_sweep.a += invIB * b2Cross(rB, P); - bodyB->SynchronizeTransform(); + 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 = pc->invMassB; + float32 iB = pc->invIB; + 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 diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h old mode 100644 new mode 100755 index b8555bbb4..ca9de04db --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -21,15 +21,15 @@ #include #include -#include +#include class b2Contact; class b2Body; class b2StackAllocator; +struct b2ContactPositionConstraint; -struct b2ContactConstraintPoint +struct b2VelocityConstraintPoint { - b2Vec2 localPoint; b2Vec2 rA; b2Vec2 rB; float32 normalImpulse; @@ -39,40 +39,56 @@ struct b2ContactConstraintPoint float32 velocityBias; }; -struct b2ContactConstraint +struct b2ContactVelocityConstraint { - b2ContactConstraintPoint points[b2_maxManifoldPoints]; - b2Vec2 localNormal; - b2Vec2 localPoint; + b2VelocityConstraintPoint points[b2_maxManifoldPoints]; b2Vec2 normal; b2Mat22 normalMass; b2Mat22 K; - b2Body* bodyA; - b2Body* bodyB; - b2Manifold::Type type; - float32 radius; + int32 indexA; + int32 indexB; + float32 invMassA, invMassB; + float32 invIA, invIB; float32 friction; + float32 restitution; int32 pointCount; - b2Manifold* manifold; + int32 contactIndex; +}; + +struct b2ContactSolverDef +{ + b2TimeStep step; + b2Contact** contacts; + int32 count; + b2Position* positions; + b2Velocity* velocities; + b2StackAllocator* allocator; }; class b2ContactSolver { public: - b2ContactSolver(b2Contact** contacts, int32 contactCount, - b2StackAllocator* allocator, float32 impulseRatio); - + b2ContactSolver(b2ContactSolverDef* def); ~b2ContactSolver(); + void InitializeVelocityConstraints(); + void WarmStart(); void SolveVelocityConstraints(); void StoreImpulses(); - bool SolvePositionConstraints(float32 baumgarte); + bool SolvePositionConstraints(); + bool SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB); + b2TimeStep m_step; + b2Position* m_positions; + b2Velocity* m_velocities; b2StackAllocator* m_allocator; - b2ContactConstraint* m_constraints; - int m_constraintCount; + b2ContactPositionConstraint* m_positionConstraints; + b2ContactVelocityConstraint* m_velocityConstraints; + b2Contact** m_contacts; + int m_count; }; #endif + diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp new file mode 100755 index 000000000..043365070 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp @@ -0,0 +1,50 @@ +/* +* 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 +using namespace std; + +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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h new file mode 100755 index 000000000..11b61b880 --- /dev/null +++ b/src/modules/physics/box2d/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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp new file mode 100755 index 000000000..8bac536a0 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp @@ -0,0 +1,50 @@ +/* +* 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 +using namespace std; + +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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h new file mode 100755 index 000000000..74b27ee01 --- /dev/null +++ b/src/modules/physics/box2d/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/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp old mode 100644 new mode 100755 index 837722d92..880f83e22 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -18,14 +18,12 @@ #include #include -#include -#include #include -#include #include +using namespace std; -b2Contact* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +b2Contact* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) { void* mem = allocator->Allocate(sizeof(b2PolygonAndCircleContact)); return new (mem) b2PolygonAndCircleContact(fixtureA, fixtureB); @@ -38,7 +36,7 @@ void b2PolygonAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* al } b2PolygonAndCircleContact::b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) -: b2Contact(fixtureA, fixtureB) +: b2Contact(fixtureA, 0, fixtureB, 0) { b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h old mode 100644 new mode 100755 index 684b2ae04..6beca16a2 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -26,7 +26,7 @@ class b2BlockAllocator; class b2PolygonAndCircleContact : public b2Contact { public: - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + 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); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp old mode 100644 new mode 100755 index eab2af579..52e1be874 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -24,8 +24,9 @@ #include #include +using namespace std; -b2Contact* b2PolygonContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) +b2Contact* b2PolygonContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) { void* mem = allocator->Allocate(sizeof(b2PolygonContact)); return new (mem) b2PolygonContact(fixtureA, fixtureB); @@ -38,7 +39,7 @@ void b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) } b2PolygonContact::b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB) - : b2Contact(fixtureA, fixtureB) + : b2Contact(fixtureA, 0, fixtureB, 0) { b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); b2Assert(m_fixtureB->GetType() == b2Shape::e_polygon); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h old mode 100644 new mode 100755 index af544c2e7..45932148c --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -26,7 +26,8 @@ class b2BlockAllocator; class b2PolygonContact : public b2Contact { public: - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); + 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); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp deleted file mode 100644 index 567cd7125..000000000 --- a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2TOISolver.cpp +++ /dev/null @@ -1,231 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 - -struct b2TOIConstraint -{ - b2Vec2 localPoints[b2_maxManifoldPoints]; - b2Vec2 localNormal; - b2Vec2 localPoint; - b2Manifold::Type type; - float32 radius; - int32 pointCount; - b2Body* bodyA; - b2Body* bodyB; -}; - -b2TOISolver::b2TOISolver(b2StackAllocator* allocator) -{ - m_allocator = allocator; - m_constraints = NULL; - m_count = NULL; - m_toiBody = NULL; -} - -b2TOISolver::~b2TOISolver() -{ - Clear(); -} - -void b2TOISolver::Clear() -{ - if (m_allocator && m_constraints) - { - m_allocator->Free(m_constraints); - m_constraints = NULL; - } -} - -void b2TOISolver::Initialize(b2Contact** contacts, int32 count, b2Body* toiBody) -{ - Clear(); - - m_count = count; - m_toiBody = toiBody; - - m_constraints = (b2TOIConstraint*) m_allocator->Allocate(m_count * sizeof(b2TOIConstraint)); - - for (int32 i = 0; i < m_count; ++i) - { - b2Contact* contact = contacts[i]; - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - 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(); - - b2Assert(manifold->pointCount > 0); - - b2TOIConstraint* constraint = m_constraints + i; - constraint->bodyA = bodyA; - constraint->bodyB = bodyB; - constraint->localNormal = manifold->localNormal; - constraint->localPoint = manifold->localPoint; - constraint->type = manifold->type; - constraint->pointCount = manifold->pointCount; - constraint->radius = radiusA + radiusB; - - for (int32 j = 0; j < constraint->pointCount; ++j) - { - b2ManifoldPoint* cp = manifold->points + j; - constraint->localPoints[j] = cp->localPoint; - } - } -} - -struct b2TOISolverManifold -{ - void Initialize(b2TOIConstraint* cc, int32 index) - { - b2Assert(cc->pointCount > 0); - - switch (cc->type) - { - case b2Manifold::e_circles: - { - b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); - b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->localPoints[0]); - if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) - { - normal = pointB - pointA; - normal.Normalize(); - } - else - { - normal.Set(1.0f, 0.0f); - } - - point = 0.5f * (pointA + pointB); - separation = b2Dot(pointB - pointA, normal) - cc->radius; - } - break; - - case b2Manifold::e_faceA: - { - normal = cc->bodyA->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); - - b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->localPoints[index]); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; - point = clipPoint; - } - break; - - case b2Manifold::e_faceB: - { - normal = cc->bodyB->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); - - b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->localPoints[index]); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; - point = clipPoint; - - // Ensure normal points from A to B - normal = -normal; - } - break; - } - } - - b2Vec2 normal; - b2Vec2 point; - float32 separation; -}; - -// Push out the toi body to provide clearance for further simulation. -bool b2TOISolver::Solve(float32 baumgarte) -{ - float32 minSeparation = 0.0f; - - for (int32 i = 0; i < m_count; ++i) - { - b2TOIConstraint* c = m_constraints + i; - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; - - float32 massA = bodyA->m_mass; - float32 massB = bodyB->m_mass; - - // Only the TOI body should move. - if (bodyA == m_toiBody) - { - massB = 0.0f; - } - else - { - massA = 0.0f; - } - - float32 invMassA = massA * bodyA->m_invMass; - float32 invIA = massA * bodyA->m_invI; - float32 invMassB = massB * bodyB->m_invMass; - float32 invIB = massB * bodyB->m_invI; - - // Solve normal constraints - for (int32 j = 0; j < c->pointCount; ++j) - { - b2TOISolverManifold psm; - psm.Initialize(c, j); - b2Vec2 normal = psm.normal; - - b2Vec2 point = psm.point; - float32 separation = psm.separation; - - b2Vec2 rA = point - bodyA->m_sweep.c; - b2Vec2 rB = point - bodyB->m_sweep.c; - - // Track max constraint error. - minSeparation = b2Min(minSeparation, separation); - - // Prevent large corrections and allow slop. - float32 C = b2Clamp(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); - - // Compute the effective mass. - float32 rnA = b2Cross(rA, normal); - float32 rnB = b2Cross(rB, normal); - float32 K = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; - - // Compute normal impulse - float32 impulse = K > 0.0f ? - C / K : 0.0f; - - b2Vec2 P = impulse * normal; - - bodyA->m_sweep.c -= invMassA * P; - bodyA->m_sweep.a -= invIA * b2Cross(rA, P); - bodyA->SynchronizeTransform(); - - bodyB->m_sweep.c += invMassB * P; - bodyB->m_sweep.a += invIB * b2Cross(rB, P); - bodyB->SynchronizeTransform(); - } - } - - // 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp old mode 100644 new mode 100755 index 3469bd9e1..7b0e2a507 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -46,12 +46,11 @@ void b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2, length = d.Length(); } - b2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def) : b2Joint(def) { - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; m_length = def->length; m_frequencyHz = def->frequencyHz; m_dampingRatio = def->dampingRatio; @@ -60,15 +59,32 @@ b2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def) m_bias = 0.0f; } -void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2DistanceJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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; - // Compute the effective mass matrix. - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - m_u = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + 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(); @@ -81,10 +97,11 @@ void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) m_u.Set(0.0f, 0.0f); } - float32 cr1u = b2Cross(r1, m_u); - float32 cr2u = b2Cross(r2, m_u); - float32 invMass = b1->m_invMass + b1->m_invI * cr1u * cr1u + b2->m_invMass + b2->m_invI * cr2u * cr2u; + 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) @@ -101,101 +118,111 @@ void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) float32 k = m_mass * omega * omega; // magic formulas - m_gamma = step.dt * (d + step.dt * k); + 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 * step.dt * k * m_gamma; + m_bias = C * h * k * m_gamma; m_mass = invMass + m_gamma; m_mass = m_mass != 0.0f ? 1.0f / m_mass : 0.0f; } - if (step.warmStarting) + if (data.step.warmStarting) { // Scale the impulse to support a variable time step. - m_impulse *= step.dtRatio; + m_impulse *= data.step.dtRatio; b2Vec2 P = m_impulse * m_u; - b1->m_linearVelocity -= b1->m_invMass * P; - b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); - b2->m_linearVelocity += b2->m_invMass * P; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); + 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 b2TimeStep& step) +void b2DistanceJoint::SolveVelocityConstraints(const b2SolverData& data) { - B2_NOT_USED(step); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + 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 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); - b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); - float32 Cdot = b2Dot(m_u, v2 - v1); + 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; - b1->m_linearVelocity -= b1->m_invMass * P; - b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); - b2->m_linearVelocity += b2->m_invMass * P; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); + 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(float32 baumgarte) +bool b2DistanceJoint::SolvePositionConstraints(const b2SolverData& data) { - B2_NOT_USED(baumgarte); - if (m_frequencyHz > 0.0f) { // There is no position correction for soft distance constraints. return true; } - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + b2Rot qA(aA), qB(aB); - b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 u = cB + rB - cA - rA; - float32 length = d.Normalize(); + float32 length = u.Normalize(); float32 C = length - m_length; C = b2Clamp(C, -b2_maxLinearCorrection, b2_maxLinearCorrection); float32 impulse = -m_mass * C; - m_u = d; - b2Vec2 P = impulse * m_u; + b2Vec2 P = impulse * u; - b1->m_sweep.c -= b1->m_invMass * P; - b1->m_sweep.a -= b1->m_invI * b2Cross(r1, P); - b2->m_sweep.c += b2->m_invMass * P; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, P); + cA -= m_invMassA * P; + aA -= m_invIA * b2Cross(rA, P); + cB += m_invMassB * P; + aB += m_invIB * b2Cross(rB, P); - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); + 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_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchorA); } b2Vec2 b2DistanceJoint::GetAnchorB() const { - return m_bodyB->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchorB); } b2Vec2 b2DistanceJoint::GetReactionForce(float32 inv_dt) const diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h old mode 100644 new mode 100755 index 448faa668..a8d35a5e6 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -70,7 +70,12 @@ 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; /// Set/get the natural length. @@ -91,20 +96,34 @@ protected: friend class b2Joint; b2DistanceJoint(const b2DistanceJointDef* data); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - b2Vec2 m_u; float32 m_frequencyHz; float32 m_dampingRatio; - float32 m_gamma; float32 m_bias; + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + float32 m_gamma; float32 m_impulse; - float32 m_mass; 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) diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp old mode 100644 new mode 100755 index 9097deec3..8c363e6a1 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -53,14 +53,30 @@ b2FrictionJoint::b2FrictionJoint(const b2FrictionJointDef* def) m_maxTorque = def->maxTorque; } -void b2FrictionJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2FrictionJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; + 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. - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + 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] @@ -71,22 +87,15 @@ void b2FrictionJoint::InitVelocityConstraints(const b2TimeStep& step) // [ -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 = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - b2Mat22 K1; - K1.col1.x = mA + mB; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = mA + mB; + 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; - b2Mat22 K2; - K2.col1.x = iA * rA.y * rA.y; K2.col2.x = -iA * rA.x * rA.y; - K2.col1.y = -iA * rA.x * rA.y; K2.col2.y = iA * rA.x * rA.x; - - b2Mat22 K3; - K3.col1.x = iB * rB.y * rB.y; K3.col2.x = -iB * rB.x * rB.y; - K3.col1.y = -iB * rB.x * rB.y; K3.col2.y = iB * rB.x * rB.x; - - b2Mat22 K = K1 + K2 + K3; m_linearMass = K.GetInverse(); m_angularMass = iA + iB; @@ -95,44 +104,41 @@ void b2FrictionJoint::InitVelocityConstraints(const b2TimeStep& step) m_angularMass = 1.0f / m_angularMass; } - if (step.warmStarting) + if (data.step.warmStarting) { // Scale impulses to support a variable time step. - m_linearImpulse *= step.dtRatio; - m_angularImpulse *= step.dtRatio; + m_linearImpulse *= data.step.dtRatio; + m_angularImpulse *= data.step.dtRatio; b2Vec2 P(m_linearImpulse.x, m_linearImpulse.y); - - bA->m_linearVelocity -= mA * P; - bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_angularImpulse); - - bB->m_linearVelocity += mB * P; - bB->m_angularVelocity += iB * (b2Cross(rB, P) + m_angularImpulse); + 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 b2TimeStep& step) +void b2FrictionJoint::SolveVelocityConstraints(const b2SolverData& data) { - B2_NOT_USED(step); + 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; - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - b2Vec2 vA = bA->m_linearVelocity; - float32 wA = bA->m_angularVelocity; - b2Vec2 vB = bB->m_linearVelocity; - float32 wB = bB->m_angularVelocity; - - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; - - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + float32 h = data.step.dt; // Solve angular friction { @@ -140,7 +146,7 @@ void b2FrictionJoint::SolveVelocityConstraints(const b2TimeStep& step) float32 impulse = -m_angularMass * Cdot; float32 oldImpulse = m_angularImpulse; - float32 maxImpulse = step.dt * m_maxTorque; + float32 maxImpulse = h * m_maxTorque; m_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse); impulse = m_angularImpulse - oldImpulse; @@ -150,13 +156,13 @@ void b2FrictionJoint::SolveVelocityConstraints(const b2TimeStep& step) // Solve linear friction { - b2Vec2 Cdot = vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA); + 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 = step.dt * m_maxForce; + float32 maxImpulse = h * m_maxForce; if (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) { @@ -167,21 +173,21 @@ void b2FrictionJoint::SolveVelocityConstraints(const b2TimeStep& step) impulse = m_linearImpulse - oldImpulse; vA -= mA * impulse; - wA -= iA * b2Cross(rA, impulse); + wA -= iA * b2Cross(m_rA, impulse); vB += mB * impulse; - wB += iB * b2Cross(rB, impulse); + wB += iB * b2Cross(m_rB, impulse); } - bA->m_linearVelocity = vA; - bA->m_angularVelocity = wA; - bB->m_linearVelocity = vB; - bB->m_angularVelocity = wB; + 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(float32 baumgarte) +bool b2FrictionJoint::SolvePositionConstraints(const b2SolverData& data) { - B2_NOT_USED(baumgarte); + B2_NOT_USED(data); return true; } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h old mode 100644 new mode 100755 index b4c4af261..3e72be2fe --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -79,21 +79,32 @@ protected: b2FrictionJoint(const b2FrictionJointDef* def); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); b2Vec2 m_localAnchorA; b2Vec2 m_localAnchorB; - b2Mat22 m_linearMass; - float32 m_angularMass; - + // 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp old mode 100644 new mode 100755 index 89b17ee2c..cff95f2bc --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com +* 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 @@ -24,9 +24,8 @@ // Gear Joint: // C0 = (coordinate1 + ratio * coordinate2)_initial -// C = C0 - (cordinate1 + ratio * coordinate2) = 0 -// Cdot = -(Cdot1 + ratio * Cdot2) -// J = -[J1 ratio * J2] +// C = (coordinate1 + ratio * coordinate2) - C0 = 0 +// J = [J1 ratio * J2] // K = J * invM * JT // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T // @@ -45,177 +44,323 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) : b2Joint(def) { - b2JointType type1 = def->joint1->GetType(); - b2JointType type2 = def->joint2->GetType(); + m_typeA = def->joint1->GetType(); + m_typeB = def->joint2->GetType(); - b2Assert(type1 == e_revoluteJoint || type1 == e_prismaticJoint); - b2Assert(type2 == e_revoluteJoint || type2 == e_prismaticJoint); - b2Assert(def->joint1->GetBodyA()->GetType() == b2_staticBody); - b2Assert(def->joint2->GetBodyA()->GetType() == b2_staticBody); + b2Assert(m_typeA == e_revoluteJoint || m_typeA == e_prismaticJoint); + b2Assert(m_typeB == e_revoluteJoint || m_typeB == e_prismaticJoint); - m_revolute1 = NULL; - m_prismatic1 = NULL; - m_revolute2 = NULL; - m_prismatic2 = NULL; + float32 coordinateA, coordinateB; - float32 coordinate1, coordinate2; - - m_ground1 = def->joint1->GetBodyA(); + m_bodyC = def->joint1->GetBodyA(); m_bodyA = def->joint1->GetBodyB(); - if (type1 == e_revoluteJoint) + + // 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) { - m_revolute1 = (b2RevoluteJoint*)def->joint1; - m_groundAnchor1 = m_revolute1->m_localAnchor1; - m_localAnchor1 = m_revolute1->m_localAnchor2; - coordinate1 = m_revolute1->GetJointAngle(); + 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 { - m_prismatic1 = (b2PrismaticJoint*)def->joint1; - m_groundAnchor1 = m_prismatic1->m_localAnchor1; - m_localAnchor1 = m_prismatic1->m_localAnchor2; - coordinate1 = m_prismatic1->GetJointTranslation(); + b2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint1; + m_localAnchorC = prismatic->m_localAnchorA; + m_localAnchorA = prismatic->m_localAnchorB; + m_referenceAngleA = prismatic->m_refAngle; + 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_ground2 = def->joint2->GetBodyA(); + m_bodyD = def->joint2->GetBodyA(); m_bodyB = def->joint2->GetBodyB(); - if (type2 == e_revoluteJoint) + + // 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) { - m_revolute2 = (b2RevoluteJoint*)def->joint2; - m_groundAnchor2 = m_revolute2->m_localAnchor1; - m_localAnchor2 = m_revolute2->m_localAnchor2; - coordinate2 = m_revolute2->GetJointAngle(); + 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 { - m_prismatic2 = (b2PrismaticJoint*)def->joint2; - m_groundAnchor2 = m_prismatic2->m_localAnchor1; - m_localAnchor2 = m_prismatic2->m_localAnchor2; - coordinate2 = m_prismatic2->GetJointTranslation(); + b2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint2; + m_localAnchorD = prismatic->m_localAnchorA; + m_localAnchorB = prismatic->m_localAnchorB; + m_referenceAngleB = prismatic->m_refAngle; + 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 = coordinate1 + m_ratio * coordinate2; + m_constant = coordinateA + m_ratio * coordinateB; m_impulse = 0.0f; } -void b2GearJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2GearJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* g1 = m_ground1; - b2Body* g2 = m_ground2; - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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 K = 0.0f; - m_J.SetZero(); + 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; - if (m_revolute1) + 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; + + b2Vec2 cC = data.positions[m_indexC].c; + float32 aC = data.positions[m_indexC].a; + b2Vec2 vC = data.velocities[m_indexC].v; + float32 wC = data.velocities[m_indexC].w; + + b2Vec2 cD = data.positions[m_indexD].c; + 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_J.angularA = -1.0f; - K += b1->m_invI; + m_JvAC.SetZero(); + m_JwA = 1.0f; + m_JwC = 1.0f; + m_mass += m_iA + m_iC; } else { - b2Vec2 ug = b2Mul(g1->GetTransform().R, m_prismatic1->m_localXAxis1); - b2Vec2 r = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - float32 crug = b2Cross(r, ug); - m_J.linearA = -ug; - m_J.angularA = -crug; - K += b1->m_invMass + b1->m_invI * crug * crug; + 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_revolute2) + if (m_typeB == e_revoluteJoint) { - m_J.angularB = -m_ratio; - K += m_ratio * m_ratio * b2->m_invI; + m_JvBD.SetZero(); + m_JwB = m_ratio; + m_JwD = m_ratio; + m_mass += m_ratio * m_ratio * (m_iB + m_iD); } else { - b2Vec2 ug = b2Mul(g2->GetTransform().R, m_prismatic2->m_localXAxis1); - b2Vec2 r = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - float32 crug = b2Cross(r, ug); - m_J.linearB = -m_ratio * ug; - m_J.angularB = -m_ratio * crug; - K += m_ratio * m_ratio * (b2->m_invMass + b2->m_invI * crug * crug); + 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 = K > 0.0f ? 1.0f / K : 0.0f; + m_mass = m_mass > 0.0f ? 1.0f / m_mass : 0.0f; - if (step.warmStarting) + if (data.step.warmStarting) { - // Warm starting. - b1->m_linearVelocity += b1->m_invMass * m_impulse * m_J.linearA; - b1->m_angularVelocity += b1->m_invI * m_impulse * m_J.angularA; - b2->m_linearVelocity += b2->m_invMass * m_impulse * m_J.linearB; - b2->m_angularVelocity += b2->m_invI * m_impulse * m_J.angularB; + 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 b2TimeStep& step) +void b2GearJoint::SolveVelocityConstraints(const b2SolverData& data) { - B2_NOT_USED(step); + 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; - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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 Cdot = m_J.Compute( b1->m_linearVelocity, b1->m_angularVelocity, - b2->m_linearVelocity, b2->m_angularVelocity); - - float32 impulse = m_mass * (-Cdot); + float32 impulse = -m_mass * Cdot; m_impulse += impulse; - b1->m_linearVelocity += b1->m_invMass * impulse * m_J.linearA; - b1->m_angularVelocity += b1->m_invI * impulse * m_J.angularA; - b2->m_linearVelocity += b2->m_invMass * impulse * m_J.linearB; - b2->m_angularVelocity += b2->m_invI * impulse * m_J.angularB; + 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(float32 baumgarte) +bool b2GearJoint::SolvePositionConstraints(const b2SolverData& data) { - B2_NOT_USED(baumgarte); - + 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; - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + float32 coordinateA, coordinateB; - float32 coordinate1, coordinate2; - if (m_revolute1) + b2Vec2 JvAC, JvBD; + float32 JwA, JwB, JwC, JwD; + float32 mass = 0.0f; + + if (m_typeA == e_revoluteJoint) { - coordinate1 = m_revolute1->GetJointAngle(); + JvAC.SetZero(); + JwA = 1.0f; + JwC = 1.0f; + mass += m_iA + m_iC; + + coordinateA = aA - aC - m_referenceAngleA; } else { - coordinate1 = m_prismatic1->GetJointTranslation(); + 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_revolute2) + if (m_typeB == e_revoluteJoint) { - coordinate2 = m_revolute2->GetJointAngle(); + JvBD.SetZero(); + JwB = 1.0f; + JwD = 1.0f; + mass += m_iB + m_iD; + + coordinateB = aB - aD - m_referenceAngleB; } else { - coordinate2 = m_prismatic2->GetJointTranslation(); + 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 = m_constant - (coordinate1 + m_ratio * coordinate2); + float32 C = (coordinateA + m_ratio * coordinateB) - m_constant; - float32 impulse = m_mass * (-C); + float32 impulse = 0.0f; + if (mass > 0.0f) + { + impulse = -C / mass; + } - b1->m_sweep.c += b1->m_invMass * impulse * m_J.linearA; - b1->m_sweep.a += b1->m_invI * impulse * m_J.angularA; - b2->m_sweep.c += b2->m_invMass * impulse * m_J.linearB; - b2->m_sweep.a += b2->m_invI * impulse * m_J.angularB; + 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; - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); + 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; @@ -223,27 +368,23 @@ bool b2GearJoint::SolvePositionConstraints(float32 baumgarte) b2Vec2 b2GearJoint::GetAnchorA() const { - return m_bodyA->GetWorldPoint(m_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchorA); } b2Vec2 b2GearJoint::GetAnchorB() const { - return m_bodyB->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchorB); } b2Vec2 b2GearJoint::GetReactionForce(float32 inv_dt) const { - // TODO_ERIN not tested - b2Vec2 P = m_impulse * m_J.linearB; + b2Vec2 P = m_impulse * m_JvAC; return inv_dt * P; } float32 b2GearJoint::GetReactionTorque(float32 inv_dt) const { - // TODO_ERIN not tested - b2Vec2 r = b2Mul(m_bodyB->GetTransform().R, m_localAnchor2 - m_bodyB->GetLocalCenter()); - b2Vec2 P = m_impulse * m_J.linearB; - float32 L = m_impulse * m_J.angularB - b2Cross(r, P); + float32 L = m_impulse * m_JwA; return inv_dt * L; } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h old mode 100644 new mode 100755 index eccca0da0..5651d5418 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -21,12 +21,8 @@ #include -class b2RevoluteJoint; -class b2PrismaticJoint; - /// Gear joint definition. This definition requires two existing /// revolute or prismatic joints (any combination will work). -/// The provided joints must attach a dynamic body to a static body. struct b2GearJointDef : public b2JointDef { b2GearJointDef() @@ -55,8 +51,8 @@ struct b2GearJointDef : public b2JointDef /// 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). +/// @warning You have to manually destroy the gear joint if joint1 or joint2 +/// is destroyed. class b2GearJoint : public b2Joint { public: @@ -75,37 +71,43 @@ protected: friend class b2Joint; b2GearJoint(const b2GearJointDef* data); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); - b2Body* m_ground1; - b2Body* m_ground2; + b2JointType m_typeA; + b2JointType m_typeB; - // One of these is NULL. - b2RevoluteJoint* m_revolute1; - b2PrismaticJoint* m_prismatic1; + // Body A is connected to body C + // Body B is connected to body D + b2Body* m_bodyC; + b2Body* m_bodyD; - // One of these is NULL. - b2RevoluteJoint* m_revolute2; - b2PrismaticJoint* m_prismatic2; + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + b2Vec2 m_localAnchorC; + b2Vec2 m_localAnchorD; - b2Vec2 m_groundAnchor1; - b2Vec2 m_groundAnchor2; + b2Vec2 m_localAxisC; + b2Vec2 m_localAxisD; - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - - b2Jacobian m_J; + float32 m_referenceAngleA; + float32 m_referenceAngleB; float32 m_constant; float32 m_ratio; - // Effective mass - float32 m_mass; - - // Impulse for accumulation/warm starting. 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp old mode 100644 new mode 100755 index a7e19d34d..eee195a9d --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -80,10 +81,10 @@ b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) } break; - case e_lineJoint: + case e_wheelJoint: { - void* mem = allocator->Allocate(sizeof(b2LineJoint)); - joint = new (mem) b2LineJoint((b2LineJointDef*)def); + void* mem = allocator->Allocate(sizeof(b2WheelJoint)); + joint = new (mem) b2WheelJoint((b2WheelJointDef*)def); } break; @@ -101,6 +102,13 @@ b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) } break; + case e_ropeJoint: + { + void* mem = allocator->Allocate(sizeof(b2RopeJoint)); + joint = new (mem) b2RopeJoint((b2RopeJointDef*)def); + } + break; + default: b2Assert(false); break; @@ -138,8 +146,8 @@ void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) allocator->Free(joint, sizeof(b2GearJoint)); break; - case e_lineJoint: - allocator->Free(joint, sizeof(b2LineJoint)); + case e_wheelJoint: + allocator->Free(joint, sizeof(b2WheelJoint)); break; case e_weldJoint: @@ -150,6 +158,10 @@ void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) allocator->Free(joint, sizeof(b2FrictionJoint)); break; + case e_ropeJoint: + allocator->Free(joint, sizeof(b2RopeJoint)); + break; + default: b2Assert(false); break; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h old mode 100644 new mode 100755 index 213ad7d1d..ed6ad4103 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -23,7 +23,7 @@ class b2Body; class b2Joint; -struct b2TimeStep; +struct b2SolverData; class b2BlockAllocator; enum b2JointType @@ -35,9 +35,10 @@ enum b2JointType e_pulleyJoint, e_mouseJoint, e_gearJoint, - e_lineJoint, + e_wheelJoint, e_weldJoint, e_frictionJoint, + e_ropeJoint }; enum b2LimitState @@ -50,14 +51,9 @@ enum b2LimitState struct b2Jacobian { - b2Vec2 linearA; + b2Vec2 linear; float32 angularA; - b2Vec2 linearB; float32 angularB; - - void SetZero(); - void Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); - float32 Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); }; /// A joint edge is used to connect bodies and joints together @@ -130,6 +126,7 @@ public: /// Get the next joint the world joint list. b2Joint* GetNext(); + const b2Joint* GetNext() const; /// Get the user data pointer. void* GetUserData() const; @@ -140,6 +137,11 @@ public: /// 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; + protected: friend class b2World; friend class b2Body; @@ -151,11 +153,11 @@ protected: b2Joint(const b2JointDef* def); virtual ~b2Joint() {} - virtual void InitVelocityConstraints(const b2TimeStep& step) = 0; - virtual void SolveVelocityConstraints(const b2TimeStep& step) = 0; + 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(float32 baumgarte) = 0; + virtual bool SolvePositionConstraints(const b2SolverData& data) = 0; b2JointType m_type; b2Joint* m_prev; @@ -169,30 +171,8 @@ protected: bool m_collideConnected; void* m_userData; - - // Cache here per time step to reduce cache misses. - b2Vec2 m_localCenterA, m_localCenterB; - float32 m_invMassA, m_invIA; - float32 m_invMassB, m_invIB; }; -inline void b2Jacobian::SetZero() -{ - linearA.SetZero(); angularA = 0.0f; - linearB.SetZero(); angularB = 0.0f; -} - -inline void b2Jacobian::Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) -{ - linearA = x1; angularA = a1; - linearB = x2; angularB = a2; -} - -inline float32 b2Jacobian::Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) -{ - return b2Dot(linearA, x1) + angularA * a1 + b2Dot(linearB, x2) + angularB * a2; -} - inline b2JointType b2Joint::GetType() const { return m_type; @@ -213,6 +193,11 @@ inline b2Joint* b2Joint::GetNext() return m_next; } +inline const b2Joint* b2Joint::GetNext() const +{ + return m_next; +} + inline void* b2Joint::GetUserData() const { return m_userData; @@ -223,4 +208,9 @@ inline void b2Joint::SetUserData(void* data) m_userData = data; } +inline bool b2Joint::GetCollideConnected() const +{ + return m_collideConnected; +} + #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp deleted file mode 100644 index b6b0a1cb2..000000000 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.cpp +++ /dev/null @@ -1,591 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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)] -// -// K = J * invM * JT -// -// J = [-a -s1 a s2] -// 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 -// [-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(2) = max(f2(2), 0) -// upper: f2(2) = min(f2(2), 0) -// -// Solve for correct f2(1) -// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * f2(2) + K(1,1:2) * f1 -// = -Cdot(1) - K(1,2) * f2(2) + K(1,1) * f1(1) + K(1,2) * f1(2) -// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * (f2(2) - f1(2)) + K(1,1) * f1(1) -// f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) -// -// Now compute impulse to be applied: -// df = f2 - f1 - -void b2LineJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) -{ - bodyA = b1; - bodyB = b2; - localAnchorA = bodyA->GetLocalPoint(anchor); - localAnchorB = bodyB->GetLocalPoint(anchor); - localAxisA = bodyA->GetLocalVector(axis); -} - -b2LineJoint::b2LineJoint(const b2LineJointDef* def) -: b2Joint(def) -{ - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; - m_localXAxis1 = def->localAxisA; - m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); - - m_impulse.SetZero(); - m_motorMass = 0.0; - 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 b2LineJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - m_localCenterA = b1->GetLocalCenter(); - m_localCenterB = b2->GetLocalCenter(); - - b2Transform xf1 = b1->GetTransform(); - b2Transform xf2 = b2->GetTransform(); - - // Compute the effective masses. - b2Vec2 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); - b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - - m_invMassA = b1->m_invMass; - m_invIA = b1->m_invI; - m_invMassB = b2->m_invMass; - m_invIB = b2->m_invI; - - // Compute motor Jacobian and effective mass. - { - m_axis = b2Mul(xf1.R, m_localXAxis1); - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); - - m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; - if (m_motorMass > b2_epsilon) - { - m_motorMass = 1.0f / m_motorMass; - } - else - { - m_motorMass = 0.0f; - } - } - - // Prismatic constraint. - { - m_perp = b2Mul(xf1.R, m_localYAxis1); - - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); - - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12); - m_K.col2.Set(k12, k22); - } - - // 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.y = 0.0f; - } - } - else if (jointTranslation >= m_upperTranslation) - { - if (m_limitState != e_atUpperLimit) - { - m_limitState = e_atUpperLimit; - m_impulse.y = 0.0f; - } - } - else - { - m_limitState = e_inactiveLimit; - m_impulse.y = 0.0f; - } - } - else - { - m_limitState = e_inactiveLimit; - } - - if (m_enableMotor == false) - { - m_motorImpulse = 0.0f; - } - - if (step.warmStarting) - { - // Account for variable time step. - m_impulse *= step.dtRatio; - m_motorImpulse *= step.dtRatio; - - b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis; - float32 L1 = m_impulse.x * m_s1 + (m_motorImpulse + m_impulse.y) * m_a1; - float32 L2 = m_impulse.x * m_s2 + (m_motorImpulse + m_impulse.y) * m_a2; - - b1->m_linearVelocity -= m_invMassA * P; - b1->m_angularVelocity -= m_invIA * L1; - - b2->m_linearVelocity += m_invMassB * P; - b2->m_angularVelocity += m_invIB * L2; - } - else - { - m_impulse.SetZero(); - m_motorImpulse = 0.0f; - } -} - -void b2LineJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 v1 = b1->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w2 = b2->m_angularVelocity; - - // Solve linear motor constraint. - if (m_enableMotor && m_limitState != e_equalLimits) - { - float32 Cdot = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; - float32 impulse = m_motorMass * (m_motorSpeed - Cdot); - float32 oldImpulse = m_motorImpulse; - float32 maxImpulse = step.dt * m_maxMotorForce; - m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = m_motorImpulse - oldImpulse; - - b2Vec2 P = impulse * m_axis; - float32 L1 = impulse * m_a1; - float32 L2 = impulse * m_a2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - - float32 Cdot1 = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; - - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - // Solve prismatic and limit constraint in block form. - float32 Cdot2 = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; - b2Vec2 Cdot(Cdot1, Cdot2); - - b2Vec2 f1 = m_impulse; - b2Vec2 df = m_K.Solve(-Cdot); - m_impulse += df; - - if (m_limitState == e_atLowerLimit) - { - m_impulse.y = b2Max(m_impulse.y, 0.0f); - } - else if (m_limitState == e_atUpperLimit) - { - m_impulse.y = b2Min(m_impulse.y, 0.0f); - } - - // f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) - float32 b = -Cdot1 - (m_impulse.y - f1.y) * m_K.col2.x; - float32 f2r; - if (m_K.col1.x != 0.0f) - { - f2r = b / m_K.col1.x + f1.x; - } - else - { - f2r = f1.x; - } - - m_impulse.x = f2r; - - df = m_impulse - f1; - - b2Vec2 P = df.x * m_perp + df.y * m_axis; - float32 L1 = df.x * m_s1 + df.y * m_a1; - float32 L2 = df.x * m_s2 + df.y * m_a2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - else - { - // Limit is inactive, just solve the prismatic constraint in block form. - float32 df; - if (m_K.col1.x != 0.0f) - { - df = - Cdot1 / m_K.col1.x; - } - else - { - df = 0.0f; - } - m_impulse.x += df; - - b2Vec2 P = df * m_perp; - float32 L1 = df * m_s1; - float32 L2 = df * m_s2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - - b1->m_linearVelocity = v1; - b1->m_angularVelocity = w1; - b2->m_linearVelocity = v2; - b2->m_angularVelocity = w2; -} - -bool b2LineJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 c1 = b1->m_sweep.c; - float32 a1 = b1->m_sweep.a; - - b2Vec2 c2 = b2->m_sweep.c; - float32 a2 = b2->m_sweep.a; - - // Solve linear limit constraint. - float32 linearError = 0.0f, angularError = 0.0f; - bool active = false; - float32 C2 = 0.0f; - - b2Mat22 R1(a1), R2(a2); - - b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); - b2Vec2 d = c2 + r2 - c1 - r1; - - if (m_enableLimit) - { - m_axis = b2Mul(R1, m_localXAxis1); - - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); - - float32 translation = b2Dot(m_axis, d); - if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) - { - // Prevent large angular corrections - C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); - 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 = 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 = translation - m_upperTranslation; - active = true; - } - } - - m_perp = b2Mul(R1, m_localYAxis1); - - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); - - b2Vec2 impulse; - float32 C1; - C1 = b2Dot(m_perp, d); - - linearError = b2Max(linearError, b2Abs(C1)); - angularError = 0.0f; - - if (active) - { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12); - m_K.col2.Set(k12, k22); - - b2Vec2 C; - C.x = C1; - C.y = C2; - - impulse = m_K.Solve(-C); - } - else - { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - - float32 impulse1; - if (k11 != 0.0f) - { - impulse1 = - C1 / k11; - } - else - { - impulse1 = 0.0f; - } - - impulse.x = impulse1; - impulse.y = 0.0f; - } - - b2Vec2 P = impulse.x * m_perp + impulse.y * m_axis; - float32 L1 = impulse.x * m_s1 + impulse.y * m_a1; - float32 L2 = impulse.x * m_s2 + impulse.y * m_a2; - - c1 -= m_invMassA * P; - a1 -= m_invIA * L1; - c2 += m_invMassB * P; - a2 += m_invIB * L2; - - // TODO_ERIN remove need for this. - b1->m_sweep.c = c1; - b1->m_sweep.a = a1; - b2->m_sweep.c = c2; - b2->m_sweep.a = a2; - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - - return linearError <= b2_linearSlop && angularError <= b2_angularSlop; -} - -b2Vec2 b2LineJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2LineJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2LineJoint::GetReactionForce(float32 inv_dt) const -{ - return inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis); -} - -float32 b2LineJoint::GetReactionTorque(float32 inv_dt) const -{ - B2_NOT_USED(inv_dt); - return 0.0f; -} - -float32 b2LineJoint::GetJointTranslation() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); - b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - float32 translation = b2Dot(d, axis); - return translation; -} - -float32 b2LineJoint::GetJointSpeed() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - b2Vec2 v1 = b1->m_linearVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - float32 w2 = b2->m_angularVelocity; - - float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); - return speed; -} - -bool b2LineJoint::IsLimitEnabled() const -{ - return m_enableLimit; -} - -void b2LineJoint::EnableLimit(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableLimit = flag; -} - -float32 b2LineJoint::GetLowerLimit() const -{ - return m_lowerTranslation; -} - -float32 b2LineJoint::GetUpperLimit() const -{ - return m_upperTranslation; -} - -void b2LineJoint::SetLimits(float32 lower, float32 upper) -{ - b2Assert(lower <= upper); - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_lowerTranslation = lower; - m_upperTranslation = upper; -} - -bool b2LineJoint::IsMotorEnabled() const -{ - return m_enableMotor; -} - -void b2LineJoint::EnableMotor(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableMotor = flag; -} - -void b2LineJoint::SetMotorSpeed(float32 speed) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_motorSpeed = speed; -} - -void b2LineJoint::SetMaxMotorForce(float32 force) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_maxMotorForce = force; -} - -float32 b2LineJoint::GetMotorForce() const -{ - return m_motorImpulse; -} - - - - - diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h deleted file mode 100644 index 803e4c12d..000000000 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2LineJoint.h +++ /dev/null @@ -1,170 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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_LINE_JOINT_H -#define B2_LINE_JOINT_H - -#include - -/// Line 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 b2LineJointDef : public b2JointDef -{ - b2LineJointDef() - { - type = e_lineJoint; - localAnchorA.SetZero(); - localAnchorB.SetZero(); - localAxisA.Set(1.0f, 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 world axis. - void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); - - /// The local anchor point relative to body1's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to body2's origin. - b2Vec2 localAnchorB; - - /// The local translation axis in body1. - b2Vec2 localAxisA; - - /// 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 line joint. This joint provides two degrees of freedom: translation -/// along an axis fixed in body1 and rotation in the plane. 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 b2LineJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// 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/Get the maximum motor force, usually in N. - void SetMaxMotorForce(float32 force); - float32 GetMaxMotorForce() const; - - /// Get the current motor force, usually in N. - float32 GetMotorForce() const; - -protected: - - friend class b2Joint; - b2LineJoint(const b2LineJointDef* def); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - b2Vec2 m_localXAxis1; - b2Vec2 m_localYAxis1; - - b2Vec2 m_axis, m_perp; - float32 m_s1, m_s2; - float32 m_a1, m_a2; - - b2Mat22 m_K; - b2Vec2 m_impulse; - - float32 m_motorMass; // effective mass for motor/limit translational constraint. - float32 m_motorImpulse; - - float32 m_lowerTranslation; - float32 m_upperTranslation; - float32 m_maxMotorForce; - float32 m_motorSpeed; - - bool m_enableLimit; - bool m_enableMotor; - b2LimitState m_limitState; -}; - -inline float32 b2LineJoint::GetMotorSpeed() const -{ - return m_motorSpeed; -} - -#endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp old mode 100644 new mode 100755 index b72ac5f30..be7c38348 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -36,8 +36,8 @@ b2MouseJoint::b2MouseJoint(const b2MouseJointDef* def) b2Assert(b2IsValid(def->frequencyHz) && def->frequencyHz >= 0.0f); b2Assert(b2IsValid(def->dampingRatio) && def->dampingRatio >= 0.0f); - m_target = def->target; - m_localAnchor = b2MulT(m_bodyB->GetTransform(), m_target); + m_targetA = def->target; + m_localAnchorB = b2MulT(m_bodyB->GetTransform(), m_targetA); m_maxForce = def->maxForce; m_impulse.SetZero(); @@ -55,12 +55,12 @@ void b2MouseJoint::SetTarget(const b2Vec2& target) { m_bodyB->SetAwake(true); } - m_target = target; + m_targetA = target; } const b2Vec2& b2MouseJoint::GetTarget() const { - return m_target; + return m_targetA; } void b2MouseJoint::SetMaxForce(float32 force) @@ -93,11 +93,21 @@ float32 b2MouseJoint::GetDampingRatio() const return m_dampingRatio; } -void b2MouseJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2MouseJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* b = m_bodyB; + 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; - float32 mass = b->GetMass(); + 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; @@ -111,79 +121,89 @@ void b2MouseJoint::InitVelocityConstraints(const b2TimeStep& step) // magic formulas // gamma has units of inverse mass. // beta has units of inverse time. - b2Assert(d + step.dt * k > b2_epsilon); - m_gamma = step.dt * (d + step.dt * k); + 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 = step.dt * k * m_gamma; + m_beta = h * k * m_gamma; // Compute the effective mass matrix. - b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); + 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] - float32 invMass = b->m_invMass; - float32 invI = b->m_invI; - - b2Mat22 K1; - K1.col1.x = invMass; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = invMass; - - b2Mat22 K2; - K2.col1.x = invI * r.y * r.y; K2.col2.x = -invI * r.x * r.y; - K2.col1.y = -invI * r.x * r.y; K2.col2.y = invI * r.x * r.x; - - b2Mat22 K = K1 + K2; - K.col1.x += m_gamma; - K.col2.y += m_gamma; + 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 = b->m_sweep.c + r - m_target; + m_C = cB + m_rB - m_targetA; + m_C *= m_beta; // Cheat with some damping - b->m_angularVelocity *= 0.98f; + wB *= 0.98f; - // Warm starting. - m_impulse *= step.dtRatio; - b->m_linearVelocity += invMass * m_impulse; - b->m_angularVelocity += invI * b2Cross(r, m_impulse); + 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 b2TimeStep& step) +void b2MouseJoint::SolveVelocityConstraints(const b2SolverData& data) { - b2Body* b = m_bodyB; - - b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; // Cdot = v + cross(w, r) - b2Vec2 Cdot = b->m_linearVelocity + b2Cross(b->m_angularVelocity, r); - b2Vec2 impulse = b2Mul(m_mass, -(Cdot + m_beta * m_C + m_gamma * m_impulse)); + 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 = step.dt * m_maxForce; + float32 maxImpulse = data.step.dt * m_maxForce; if (m_impulse.LengthSquared() > maxImpulse * maxImpulse) { m_impulse *= maxImpulse / m_impulse.Length(); } impulse = m_impulse - oldImpulse; - b->m_linearVelocity += b->m_invMass * impulse; - b->m_angularVelocity += b->m_invI * b2Cross(r, impulse); + 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_target; + return m_targetA; } b2Vec2 b2MouseJoint::GetAnchorB() const { - return m_bodyB->GetWorldPoint(m_localAnchor); + return m_bodyB->GetWorldPoint(m_localAnchorB); } b2Vec2 b2MouseJoint::GetReactionForce(float32 inv_dt) const diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h old mode 100644 new mode 100755 index cd1959a42..3c90d0161 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -94,21 +94,30 @@ protected: b2MouseJoint(const b2MouseJointDef* def); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte) { B2_NOT_USED(baumgarte); return true; } + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); - b2Vec2 m_localAnchor; - b2Vec2 m_target; - b2Vec2 m_impulse; - - b2Mat22 m_mass; // effective mass for point-to-point constraint. - b2Vec2 m_C; // position error - float32 m_maxForce; + 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp old mode 100644 new mode 100755 index a019888a4..99f0c7d6f --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -87,23 +87,23 @@ // Now compute impulse to be applied: // df = f2 - f1 -void b2PrismaticJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) +void b2PrismaticJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor, const b2Vec2& axis) { - bodyA = b1; - bodyB = b2; + bodyA = bA; + bodyB = bB; localAnchorA = bodyA->GetLocalPoint(anchor); localAnchorB = bodyB->GetLocalPoint(anchor); - localAxis1 = bodyA->GetLocalVector(axis); + localAxisA = bodyA->GetLocalVector(axis); referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); } b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) : b2Joint(def) { - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; - m_localXAxis1 = def->localAxis1; - m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + m_localXAxisA = def->localAxisA; + m_localYAxisA = b2Cross(1.0f, m_localXAxisA); m_refAngle = def->referenceAngle; m_impulse.SetZero(); @@ -122,35 +122,45 @@ b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) m_perp.SetZero(); } -void b2PrismaticJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2PrismaticJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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; - m_localCenterA = b1->GetLocalCenter(); - m_localCenterB = b2->GetLocalCenter(); + 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; - b2Transform xf1 = b1->GetTransform(); - b2Transform xf2 = b2->GetTransform(); + 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 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); - b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 d = (cB - cA) + rB - rA; - m_invMassA = b1->m_invMass; - m_invIA = b1->m_invI; - m_invMassB = b2->m_invMass; - m_invIB = b2->m_invI; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; // Compute motor Jacobian and effective mass. { - m_axis = b2Mul(xf1.R, m_localXAxis1); - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); + m_axis = b2Mul(qA, m_localXAxisA); + m_a1 = b2Cross(d + rA, m_axis); + m_a2 = b2Cross(rB, m_axis); - m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; - if (m_motorMass > b2_epsilon) + 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; } @@ -158,24 +168,26 @@ void b2PrismaticJoint::InitVelocityConstraints(const b2TimeStep& step) // Prismatic constraint. { - m_perp = b2Mul(xf1.R, m_localYAxis1); + m_perp = b2Mul(qA, m_localYAxisA); - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); + m_s1 = b2Cross(d + rA, m_perp); + m_s2 = b2Cross(rB, m_perp); - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; + 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; - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 + i2 * m_s2; - float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = i1 + i2; - float32 k23 = i1 * m_a1 + i2 * m_a2; - float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12, k13); - m_K.col2.Set(k12, k22, k23); - m_K.col3.Set(k13, k23, k33); + 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. @@ -219,69 +231,74 @@ void b2PrismaticJoint::InitVelocityConstraints(const b2TimeStep& step) m_motorImpulse = 0.0f; } - if (step.warmStarting) + if (data.step.warmStarting) { // Account for variable time step. - m_impulse *= step.dtRatio; - m_motorImpulse *= step.dtRatio; + 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 L1 = m_impulse.x * m_s1 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a1; - float32 L2 = m_impulse.x * m_s2 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a2; + 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; - b1->m_linearVelocity -= m_invMassA * P; - b1->m_angularVelocity -= m_invIA * L1; + vA -= mA * P; + wA -= iA * LA; - b2->m_linearVelocity += m_invMassB * P; - b2->m_angularVelocity += m_invIB * L2; + 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 b2TimeStep& step) +void b2PrismaticJoint::SolveVelocityConstraints(const b2SolverData& data) { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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 v1 = b1->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w2 = b2->m_angularVelocity; + 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, v2 - v1) + m_a2 * w2 - m_a1 * w1; + 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 = step.dt * m_maxMotorForce; + 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 L1 = impulse * m_a1; - float32 L2 = impulse * m_a2; + float32 LA = impulse * m_a1; + float32 LB = impulse * m_a2; - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; + vA -= mA * P; + wA -= iA * LA; - v2 += m_invMassB * P; - w2 += m_invIB * L2; + vB += mB * P; + wB += iB * LB; } b2Vec2 Cdot1; - Cdot1.x = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; - Cdot1.y = w2 - w1; + 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, v2 - v1) + m_a2 * w2 - m_a1 * w1; + Cdot2 = b2Dot(m_axis, vB - vA) + m_a2 * wB - m_a1 * wA; b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); b2Vec3 f1 = m_impulse; @@ -298,7 +315,7 @@ void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) } // 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.col3.x, m_K.col3.y); + 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; @@ -306,14 +323,14 @@ void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) df = m_impulse - f1; b2Vec2 P = df.x * m_perp + df.z * m_axis; - float32 L1 = df.x * m_s1 + df.y + df.z * m_a1; - float32 L2 = df.x * m_s2 + df.y + df.z * m_a2; + float32 LA = df.x * m_s1 + df.y + df.z * m_a1; + float32 LB = df.x * m_s2 + df.y + df.z * m_a2; - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; + vA -= mA * P; + wA -= iA * LA; - v2 += m_invMassB * P; - w2 += m_invIB * L2; + vB += mB * P; + wB += iB * LB; } else { @@ -323,105 +340,100 @@ void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) m_impulse.y += df.y; b2Vec2 P = df.x * m_perp; - float32 L1 = df.x * m_s1 + df.y; - float32 L2 = df.x * m_s2 + df.y; + float32 LA = df.x * m_s1 + df.y; + float32 LB = df.x * m_s2 + df.y; - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; + vA -= mA * P; + wA -= iA * LA; - v2 += m_invMassB * P; - w2 += m_invIB * L2; + vB += mB * P; + wB += iB * LB; } - b1->m_linearVelocity = v1; - b1->m_angularVelocity = w1; - b2->m_linearVelocity = v2; - b2->m_angularVelocity = w2; + 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(float32 baumgarte) +bool b2PrismaticJoint::SolvePositionConstraints(const b2SolverData& data) { - B2_NOT_USED(baumgarte); + 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; - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + b2Rot qA(aA), qB(aB); - b2Vec2 c1 = b1->m_sweep.c; - float32 a1 = b1->m_sweep.a; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - b2Vec2 c2 = b2->m_sweep.c; - float32 a2 = b2->m_sweep.a; + // 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_refAngle; + + float32 linearError = b2Abs(C1.x); + float32 angularError = b2Abs(C1.y); - // Solve linear limit constraint. - float32 linearError = 0.0f, angularError = 0.0f; bool active = false; float32 C2 = 0.0f; - - b2Mat22 R1(a1), R2(a2); - - b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); - b2Vec2 d = c2 + r2 - c1 - r1; - if (m_enableLimit) { - m_axis = b2Mul(R1, m_localXAxis1); - - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); - - float32 translation = b2Dot(m_axis, d); + 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 = b2Abs(translation); + 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 = m_lowerTranslation - translation; + 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 = translation - m_upperTranslation; + linearError = b2Max(linearError, translation - m_upperTranslation); active = true; } } - m_perp = b2Mul(R1, m_localYAxis1); - - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); - - b2Vec3 impulse; - b2Vec2 C1; - C1.x = b2Dot(m_perp, d); - C1.y = a2 - a1 - m_refAngle; - - linearError = b2Max(linearError, b2Abs(C1.x)); - angularError = b2Abs(C1.y); - if (active) { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; + 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 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; - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 + i2 * m_s2; - float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = i1 + i2; - float32 k23 = i1 * m_a1 + i2 * m_a2; - float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12, k13); - m_K.col2.Set(k12, k22, k23); - m_K.col3.Set(k13, k23, k33); + m_K.ex.Set(k11, k12, k13); + m_K.ey.Set(k12, k22, k23); + m_K.ez.Set(k13, k23, k33); b2Vec3 C; C.x = C1.x; @@ -432,15 +444,16 @@ bool b2PrismaticJoint::SolvePositionConstraints(float32 baumgarte) } else { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; + float32 k11 = mA + mB + iA * m_s1 * m_s1 + iB * m_s2 * m_s2; + float32 k12 = iA * m_s1 + iB * m_s2; + float32 k22 = iA + iB; + if (k22 == 0.0f) + { + k22 = 1.0f; + } - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 + i2 * m_s2; - float32 k22 = i1 + i2; - - m_K.col1.Set(k11, k12, 0.0f); - m_K.col2.Set(k12, k22, 0.0f); + m_K.ex.Set(k11, k12, 0.0f); + m_K.ey.Set(k12, k22, 0.0f); b2Vec2 impulse1 = m_K.Solve22(-C1); impulse.x = impulse1.x; @@ -448,34 +461,31 @@ bool b2PrismaticJoint::SolvePositionConstraints(float32 baumgarte) impulse.z = 0.0f; } - b2Vec2 P = impulse.x * m_perp + impulse.z * m_axis; - float32 L1 = impulse.x * m_s1 + impulse.y + impulse.z * m_a1; - float32 L2 = impulse.x * m_s2 + impulse.y + impulse.z * m_a2; + 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; - c1 -= m_invMassA * P; - a1 -= m_invIA * L1; - c2 += m_invMassB * P; - a2 += m_invIB * L2; + 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; - // TODO_ERIN remove need for this. - b1->m_sweep.c = c1; - b1->m_sweep.a = a1; - b2->m_sweep.c = c2; - b2->m_sweep.a = a2; - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - return linearError <= b2_linearSlop && angularError <= b2_angularSlop; } b2Vec2 b2PrismaticJoint::GetAnchorA() const { - return m_bodyA->GetWorldPoint(m_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchorA); } b2Vec2 b2PrismaticJoint::GetAnchorB() const { - return m_bodyB->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchorB); } b2Vec2 b2PrismaticJoint::GetReactionForce(float32 inv_dt) const @@ -490,13 +500,10 @@ float32 b2PrismaticJoint::GetReactionTorque(float32 inv_dt) const float32 b2PrismaticJoint::GetJointTranslation() const { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); - b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); + 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; @@ -504,22 +511,22 @@ float32 b2PrismaticJoint::GetJointTranslation() const float32 b2PrismaticJoint::GetJointSpeed() const { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; + 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 = b1->GetWorldVector(m_localXAxis1); + b2Vec2 axis = b2Mul(bA->m_xf.q, m_localXAxisA); - b2Vec2 v1 = b1->m_linearVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - float32 w2 = b2->m_angularVelocity; + 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(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); + float32 speed = b2Dot(d, b2Cross(wA, axis)) + b2Dot(axis, vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA)); return speed; } @@ -530,9 +537,13 @@ bool b2PrismaticJoint::IsLimitEnabled() const void b2PrismaticJoint::EnableLimit(bool flag) { - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableLimit = 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 @@ -548,10 +559,14 @@ float32 b2PrismaticJoint::GetUpperLimit() const void b2PrismaticJoint::SetLimits(float32 lower, float32 upper) { b2Assert(lower <= upper); - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_lowerTranslation = lower; - m_upperTranslation = 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 @@ -580,7 +595,7 @@ void b2PrismaticJoint::SetMaxMotorForce(float32 force) m_maxMotorForce = force; } -float32 b2PrismaticJoint::GetMotorForce() const +float32 b2PrismaticJoint::GetMotorForce(float32 inv_dt) const { - return m_motorImpulse; + return inv_dt * m_motorImpulse; } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h old mode 100644 new mode 100755 index 7a12c5df8..f271e7579 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -27,7 +27,6 @@ /// 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. -/// @warning at least one body should by dynamic with a non-fixed rotation. struct b2PrismaticJointDef : public b2JointDef { b2PrismaticJointDef() @@ -35,7 +34,7 @@ struct b2PrismaticJointDef : public b2JointDef type = e_prismaticJoint; localAnchorA.SetZero(); localAnchorB.SetZero(); - localAxis1.Set(1.0f, 0.0f); + localAxisA.Set(1.0f, 0.0f); referenceAngle = 0.0f; enableLimit = false; lowerTranslation = 0.0f; @@ -56,9 +55,9 @@ struct b2PrismaticJointDef : public b2JointDef b2Vec2 localAnchorB; /// The local translation axis in body1. - b2Vec2 localAxis1; + b2Vec2 localAxisA; - /// The constrained angle between the bodies: body2_angle - body1_angle. + /// The constrained angle between the bodies: bodyB_angle - bodyA_angle. float32 referenceAngle; /// Enable/disable the joint limit. @@ -81,7 +80,7 @@ struct b2PrismaticJointDef : public b2JointDef }; /// A prismatic joint. This joint provides one degree of freedom: translation -/// along an axis fixed in body1. Relative rotation is prevented. You can +/// 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 @@ -129,42 +128,48 @@ public: /// Set the maximum motor force, usually in N. void SetMaxMotorForce(float32 force); - /// Get the current motor force, usually in N. - float32 GetMotorForce() const; + /// Get the current motor force given the inverse time step, usually in N. + float32 GetMotorForce(float32 inv_dt) const; protected: friend class b2Joint; friend class b2GearJoint; b2PrismaticJoint(const b2PrismaticJointDef* def); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - b2Vec2 m_localXAxis1; - b2Vec2 m_localYAxis1; + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + b2Vec2 m_localXAxisA; + b2Vec2 m_localYAxisA; float32 m_refAngle; - - b2Vec2 m_axis, m_perp; - float32 m_s1, m_s2; - float32 m_a1, m_a2; - - b2Mat33 m_K; b2Vec3 m_impulse; - - float32 m_motorMass; // effective mass for motor/limit translational constraint. 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 diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp old mode 100644 new mode 100755 index beb7db8fb..1a09d907e --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com +* 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 @@ -24,368 +24,251 @@ // length1 = norm(p1 - s1) // length2 = norm(p2 - s2) // C0 = (length1 + ratio * length2)_initial -// C = C0 - (length1 + ratio * length2) >= 0 +// 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) -// -// Limit: -// C = maxLength - length -// u = (p - s) / norm(p - s) -// Cdot = -dot(u, v + cross(w, r)) -// K = invMass + invI * cross(r, u)^2 -// 0 <= impulse -void b2PulleyJointDef::Initialize(b2Body* b1, b2Body* b2, - const b2Vec2& ga1, const b2Vec2& ga2, - const b2Vec2& anchor1, const b2Vec2& anchor2, +void b2PulleyJointDef::Initialize(b2Body* bA, b2Body* bB, + const b2Vec2& groundA, const b2Vec2& groundB, + const b2Vec2& anchorA, const b2Vec2& anchorB, float32 r) { - bodyA = b1; - bodyB = b2; - groundAnchorA = ga1; - groundAnchorB = ga2; - localAnchorA = bodyA->GetLocalPoint(anchor1); - localAnchorB = bodyB->GetLocalPoint(anchor2); - b2Vec2 d1 = anchor1 - ga1; - lengthA = d1.Length(); - b2Vec2 d2 = anchor2 - ga2; - lengthB = d2.Length(); + 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); - float32 C = lengthA + ratio * lengthB; - maxLengthA = C - ratio * b2_minPulleyLength; - maxLengthB = (C - b2_minPulleyLength) / ratio; } b2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def) : b2Joint(def) { - m_groundAnchor1 = def->groundAnchorA; - m_groundAnchor2 = def->groundAnchorB; - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; + m_groundAnchorA = def->groundAnchorA; + m_groundAnchorB = def->groundAnchorB; + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; b2Assert(def->ratio != 0.0f); m_ratio = def->ratio; m_constant = def->lengthA + m_ratio * def->lengthB; - m_maxLength1 = b2Min(def->maxLengthA, m_constant - m_ratio * b2_minPulleyLength); - m_maxLength2 = b2Min(def->maxLengthB, (m_constant - b2_minPulleyLength) / m_ratio); - m_impulse = 0.0f; - m_limitImpulse1 = 0.0f; - m_limitImpulse2 = 0.0f; } -void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2PulleyJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + 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 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; + 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; - b2Vec2 s1 = m_groundAnchor1; - b2Vec2 s2 = m_groundAnchor2; + 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_u1 = p1 - s1; - m_u2 = p2 - s2; + m_uA = cA + m_rA - m_groundAnchorA; + m_uB = cB + m_rB - m_groundAnchorB; - float32 length1 = m_u1.Length(); - float32 length2 = m_u2.Length(); + float32 lengthA = m_uA.Length(); + float32 lengthB = m_uB.Length(); - if (length1 > b2_linearSlop) + if (lengthA > 10.0f * b2_linearSlop) { - m_u1 *= 1.0f / length1; + m_uA *= 1.0f / lengthA; } else { - m_u1.SetZero(); + m_uA.SetZero(); } - if (length2 > b2_linearSlop) + if (lengthB > 10.0f * b2_linearSlop) { - m_u2 *= 1.0f / length2; + m_uB *= 1.0f / lengthB; } else { - m_u2.SetZero(); - } - - float32 C = m_constant - length1 - m_ratio * length2; - if (C > 0.0f) - { - m_state = e_inactiveLimit; - m_impulse = 0.0f; - } - else - { - m_state = e_atUpperLimit; - } - - if (length1 < m_maxLength1) - { - m_limitState1 = e_inactiveLimit; - m_limitImpulse1 = 0.0f; - } - else - { - m_limitState1 = e_atUpperLimit; - } - - if (length2 < m_maxLength2) - { - m_limitState2 = e_inactiveLimit; - m_limitImpulse2 = 0.0f; - } - else - { - m_limitState2 = e_atUpperLimit; + m_uB.SetZero(); } // Compute effective mass. - float32 cr1u1 = b2Cross(r1, m_u1); - float32 cr2u2 = b2Cross(r2, m_u2); + float32 ruA = b2Cross(m_rA, m_uA); + float32 ruB = b2Cross(m_rB, m_uB); - m_limitMass1 = b1->m_invMass + b1->m_invI * cr1u1 * cr1u1; - m_limitMass2 = b2->m_invMass + b2->m_invI * cr2u2 * cr2u2; - m_pulleyMass = m_limitMass1 + m_ratio * m_ratio * m_limitMass2; - b2Assert(m_limitMass1 > b2_epsilon); - b2Assert(m_limitMass2 > b2_epsilon); - b2Assert(m_pulleyMass > b2_epsilon); - m_limitMass1 = 1.0f / m_limitMass1; - m_limitMass2 = 1.0f / m_limitMass2; - m_pulleyMass = 1.0f / m_pulleyMass; + float32 mA = m_invMassA + m_invIA * ruA * ruA; + float32 mB = m_invMassB + m_invIB * ruB * ruB; - if (step.warmStarting) + 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 *= step.dtRatio; - m_limitImpulse1 *= step.dtRatio; - m_limitImpulse2 *= step.dtRatio; + m_impulse *= data.step.dtRatio; // Warm starting. - b2Vec2 P1 = -(m_impulse + m_limitImpulse1) * m_u1; - b2Vec2 P2 = (-m_ratio * m_impulse - m_limitImpulse2) * m_u2; - b1->m_linearVelocity += b1->m_invMass * P1; - b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); - b2->m_linearVelocity += b2->m_invMass * P2; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); + 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; - m_limitImpulse1 = 0.0f; - m_limitImpulse2 = 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 b2TimeStep& step) +void b2PulleyJoint::SolveVelocityConstraints(const b2SolverData& data) { - B2_NOT_USED(step); + 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; - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + b2Vec2 vpA = vA + b2Cross(wA, m_rA); + b2Vec2 vpB = vB + b2Cross(wB, m_rB); - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + float32 Cdot = -b2Dot(m_uA, vpA) - m_ratio * b2Dot(m_uB, vpB); + float32 impulse = -m_mass * Cdot; + m_impulse += impulse; - if (m_state == e_atUpperLimit) - { - b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); - b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); + 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); - float32 Cdot = -b2Dot(m_u1, v1) - m_ratio * b2Dot(m_u2, v2); - float32 impulse = m_pulleyMass * (-Cdot); - float32 oldImpulse = m_impulse; - m_impulse = b2Max(0.0f, m_impulse + impulse); - impulse = m_impulse - oldImpulse; - - b2Vec2 P1 = -impulse * m_u1; - b2Vec2 P2 = -m_ratio * impulse * m_u2; - b1->m_linearVelocity += b1->m_invMass * P1; - b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); - b2->m_linearVelocity += b2->m_invMass * P2; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); - } - - if (m_limitState1 == e_atUpperLimit) - { - b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); - - float32 Cdot = -b2Dot(m_u1, v1); - float32 impulse = -m_limitMass1 * Cdot; - float32 oldImpulse = m_limitImpulse1; - m_limitImpulse1 = b2Max(0.0f, m_limitImpulse1 + impulse); - impulse = m_limitImpulse1 - oldImpulse; - - b2Vec2 P1 = -impulse * m_u1; - b1->m_linearVelocity += b1->m_invMass * P1; - b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); - } - - if (m_limitState2 == e_atUpperLimit) - { - b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); - - float32 Cdot = -b2Dot(m_u2, v2); - float32 impulse = -m_limitMass2 * Cdot; - float32 oldImpulse = m_limitImpulse2; - m_limitImpulse2 = b2Max(0.0f, m_limitImpulse2 + impulse); - impulse = m_limitImpulse2 - oldImpulse; - - b2Vec2 P2 = -impulse * m_u2; - b2->m_linearVelocity += b2->m_invMass * P2; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); - } + 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(float32 baumgarte) +bool b2PulleyJoint::SolvePositionConstraints(const b2SolverData& data) { - B2_NOT_USED(baumgarte); + 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; - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + b2Rot qA(aA), qB(aB); - b2Vec2 s1 = m_groundAnchor1; - b2Vec2 s2 = m_groundAnchor2; + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); - float32 linearError = 0.0f; + // Get the pulley axes. + b2Vec2 uA = cA + rA - m_groundAnchorA; + b2Vec2 uB = cB + rB - m_groundAnchorB; - if (m_state == e_atUpperLimit) + float32 lengthA = uA.Length(); + float32 lengthB = uB.Length(); + + if (lengthA > 10.0f * b2_linearSlop) { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - - // Get the pulley axes. - m_u1 = p1 - s1; - m_u2 = p2 - s2; - - float32 length1 = m_u1.Length(); - float32 length2 = m_u2.Length(); - - if (length1 > b2_linearSlop) - { - m_u1 *= 1.0f / length1; - } - else - { - m_u1.SetZero(); - } - - if (length2 > b2_linearSlop) - { - m_u2 *= 1.0f / length2; - } - else - { - m_u2.SetZero(); - } - - float32 C = m_constant - length1 - m_ratio * length2; - linearError = b2Max(linearError, -C); - - C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - float32 impulse = -m_pulleyMass * C; - - b2Vec2 P1 = -impulse * m_u1; - b2Vec2 P2 = -m_ratio * impulse * m_u2; - - b1->m_sweep.c += b1->m_invMass * P1; - b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); - b2->m_sweep.c += b2->m_invMass * P2; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); + uA *= 1.0f / lengthA; + } + else + { + uA.SetZero(); } - if (m_limitState1 == e_atUpperLimit) + if (lengthB > 10.0f * b2_linearSlop) { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - - m_u1 = p1 - s1; - float32 length1 = m_u1.Length(); - - if (length1 > b2_linearSlop) - { - m_u1 *= 1.0f / length1; - } - else - { - m_u1.SetZero(); - } - - float32 C = m_maxLength1 - length1; - linearError = b2Max(linearError, -C); - C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - float32 impulse = -m_limitMass1 * C; - - b2Vec2 P1 = -impulse * m_u1; - b1->m_sweep.c += b1->m_invMass * P1; - b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); - - b1->SynchronizeTransform(); + uB *= 1.0f / lengthB; + } + else + { + uB.SetZero(); } - if (m_limitState2 == e_atUpperLimit) + // 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) { - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p2 = b2->m_sweep.c + r2; - - m_u2 = p2 - s2; - float32 length2 = m_u2.Length(); - - if (length2 > b2_linearSlop) - { - m_u2 *= 1.0f / length2; - } - else - { - m_u2.SetZero(); - } - - float32 C = m_maxLength2 - length2; - linearError = b2Max(linearError, -C); - C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - float32 impulse = -m_limitMass2 * C; - - b2Vec2 P2 = -impulse * m_u2; - b2->m_sweep.c += b2->m_invMass * P2; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); - - b2->SynchronizeTransform(); + 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_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchorA); } b2Vec2 b2PulleyJoint::GetAnchorB() const { - return m_bodyB->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchorB); } b2Vec2 b2PulleyJoint::GetReactionForce(float32 inv_dt) const { - b2Vec2 P = m_impulse * m_u2; + b2Vec2 P = m_impulse * m_uB; return inv_dt * P; } @@ -397,26 +280,26 @@ float32 b2PulleyJoint::GetReactionTorque(float32 inv_dt) const b2Vec2 b2PulleyJoint::GetGroundAnchorA() const { - return m_groundAnchor1; + return m_groundAnchorA; } b2Vec2 b2PulleyJoint::GetGroundAnchorB() const { - return m_groundAnchor2; + return m_groundAnchorB; } -float32 b2PulleyJoint::GetLength1() const +float32 b2PulleyJoint::GetLengthA() const { - b2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchor1); - b2Vec2 s = m_groundAnchor1; + b2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchorA); + b2Vec2 s = m_groundAnchorA; b2Vec2 d = p - s; return d.Length(); } -float32 b2PulleyJoint::GetLength2() const +float32 b2PulleyJoint::GetLengthB() const { - b2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchor2); - b2Vec2 s = m_groundAnchor2; + b2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchorB); + b2Vec2 s = m_groundAnchorB; b2Vec2 d = p - s; return d.Length(); } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h old mode 100644 new mode 100755 index 189decb31..a5269c618 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -24,8 +24,7 @@ const float32 b2_minPulleyLength = 2.0f; /// Pulley joint definition. This requires two ground anchors, -/// two dynamic body anchor points, max lengths for each side, -/// and a pulley ratio. +/// two dynamic body anchor points, and a pulley ratio. struct b2PulleyJointDef : public b2JointDef { b2PulleyJointDef() @@ -36,9 +35,7 @@ struct b2PulleyJointDef : public b2JointDef localAnchorA.Set(-1.0f, 0.0f); localAnchorB.Set(1.0f, 0.0f); lengthA = 0.0f; - maxLengthA = 0.0f; lengthB = 0.0f; - maxLengthB = 0.0f; ratio = 1.0f; collideConnected = true; } @@ -64,15 +61,9 @@ struct b2PulleyJointDef : public b2JointDef /// The a reference length for the segment attached to bodyA. float32 lengthA; - /// The maximum length of the segment attached to bodyA. - float32 maxLengthA; - /// The a reference length for the segment attached to bodyB. float32 lengthB; - /// The maximum length of the segment attached to bodyB. - float32 maxLengthB; - /// The pulley ratio, used to simulate a block-and-tackle. float32 ratio; }; @@ -81,8 +72,10 @@ struct b2PulleyJointDef : public b2JointDef /// The pulley supports a ratio such that: /// length1 + ratio * length2 <= constant /// Yes, the force transmitted is scaled by the ratio. -/// The pulley also enforces a maximum length limit on both sides. This is -/// useful to prevent one side of the pulley hitting the top. +/// 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: @@ -98,11 +91,11 @@ public: /// Get the second ground anchor. b2Vec2 GetGroundAnchorB() const; - /// Get the current length of the segment attached to body1. - float32 GetLength1() const; + /// Get the current length of the segment attached to bodyA. + float32 GetLengthA() const; - /// Get the current length of the segment attached to body2. - float32 GetLength2() const; + /// Get the current length of the segment attached to bodyB. + float32 GetLengthB() const; /// Get the pulley ratio. float32 GetRatio() const; @@ -112,37 +105,34 @@ protected: friend class b2Joint; b2PulleyJoint(const b2PulleyJointDef* data); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); - b2Vec2 m_groundAnchor1; - b2Vec2 m_groundAnchor2; - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - - b2Vec2 m_u1; - b2Vec2 m_u2; + b2Vec2 m_groundAnchorA; + b2Vec2 m_groundAnchorB; + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; float32 m_constant; float32 m_ratio; - - float32 m_maxLength1; - float32 m_maxLength2; - - // Effective masses - float32 m_pulleyMass; - float32 m_limitMass1; - float32 m_limitMass2; - - // Impulses for accumulation/warm starting. float32 m_impulse; - float32 m_limitImpulse1; - float32 m_limitImpulse2; - b2LimitState m_state; - b2LimitState m_limitState1; - b2LimitState m_limitState2; + // 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp old mode 100644 new mode 100755 index f9845265a..7718f03fc --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -33,10 +33,10 @@ // J = [0 0 -1 0 0 1] // K = invI1 + invI2 -void b2RevoluteJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor) +void b2RevoluteJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) { - bodyA = b1; - bodyB = b2; + bodyA = bA; + bodyB = bB; localAnchorA = bodyA->GetLocalPoint(anchor); localAnchorB = bodyB->GetLocalPoint(anchor); referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); @@ -45,8 +45,8 @@ void b2RevoluteJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) : b2Joint(def) { - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; m_referenceAngle = def->referenceAngle; m_impulse.SetZero(); @@ -61,58 +61,70 @@ b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) m_limitState = e_inactiveLimit; } -void b2RevoluteJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2RevoluteJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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; - if (m_enableMotor || m_enableLimit) - { - // You cannot create a rotation limit between bodies that - // both have fixed rotation. - b2Assert(b1->m_invI > 0.0f || b2->m_invI > 0.0f); - } + 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; - // Compute the effective mass matrix. - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + 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); // J = [-I -r1_skew I r2_skew] // [ 0 -1 0 1] // r_skew = [-ry; rx] // Matlab - // K = [ m1+r1y^2*i1+m2+r2y^2*i2, -r1y*i1*r1x-r2y*i2*r2x, -r1y*i1-r2y*i2] - // [ -r1y*i1*r1x-r2y*i2*r2x, m1+r1x^2*i1+m2+r2x^2*i2, r1x*i1+r2x*i2] - // [ -r1y*i1-r2y*i2, r1x*i1+r2x*i2, i1+i2] + // 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 m1 = b1->m_invMass, m2 = b2->m_invMass; - float32 i1 = b1->m_invI, i2 = b2->m_invI; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - m_mass.col1.x = m1 + m2 + r1.y * r1.y * i1 + r2.y * r2.y * i2; - m_mass.col2.x = -r1.y * r1.x * i1 - r2.y * r2.x * i2; - m_mass.col3.x = -r1.y * i1 - r2.y * i2; - m_mass.col1.y = m_mass.col2.x; - m_mass.col2.y = m1 + m2 + r1.x * r1.x * i1 + r2.x * r2.x * i2; - m_mass.col3.y = r1.x * i1 + r2.x * i2; - m_mass.col1.z = m_mass.col3.x; - m_mass.col2.z = m_mass.col3.y; - m_mass.col3.z = i1 + i2; + bool fixedRotation = (iA + iB == 0.0f); - m_motorMass = i1 + i2; + 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) + if (m_enableMotor == false || fixedRotation) { m_motorImpulse = 0.0f; } - if (m_enableLimit) + if (m_enableLimit && fixedRotation == false) { - float32 jointAngle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; + float32 jointAngle = aB - aA - m_referenceAngle; if (b2Abs(m_upperAngle - m_lowerAngle) < 2.0f * b2_angularSlop) { m_limitState = e_equalLimits; @@ -144,66 +156,66 @@ void b2RevoluteJoint::InitVelocityConstraints(const b2TimeStep& step) m_limitState = e_inactiveLimit; } - if (step.warmStarting) + if (data.step.warmStarting) { // Scale impulses to support a variable time step. - m_impulse *= step.dtRatio; - m_motorImpulse *= step.dtRatio; + m_impulse *= data.step.dtRatio; + m_motorImpulse *= data.step.dtRatio; b2Vec2 P(m_impulse.x, m_impulse.y); - b1->m_linearVelocity -= m1 * P; - b1->m_angularVelocity -= i1 * (b2Cross(r1, P) + m_motorImpulse + m_impulse.z); + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + m_motorImpulse + m_impulse.z); - b2->m_linearVelocity += m2 * P; - b2->m_angularVelocity += i2 * (b2Cross(r2, 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 b2TimeStep& step) +void b2RevoluteJoint::SolveVelocityConstraints(const b2SolverData& data) { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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 v1 = b1->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w2 = b2->m_angularVelocity; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - float32 m1 = b1->m_invMass, m2 = b2->m_invMass; - float32 i1 = b1->m_invI, i2 = b2->m_invI; + bool fixedRotation = (iA + iB == 0.0f); // Solve motor constraint. - if (m_enableMotor && m_limitState != e_equalLimits) + if (m_enableMotor && m_limitState != e_equalLimits && fixedRotation == false) { - float32 Cdot = w2 - w1 - m_motorSpeed; - float32 impulse = m_motorMass * (-Cdot); + float32 Cdot = wB - wA - m_motorSpeed; + float32 impulse = -m_motorMass * Cdot; float32 oldImpulse = m_motorImpulse; - float32 maxImpulse = step.dt * m_maxMotorTorque; + float32 maxImpulse = data.step.dt * m_maxMotorTorque; m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); impulse = m_motorImpulse - oldImpulse; - w1 -= i1 * impulse; - w2 += i2 * impulse; + wA -= iA * impulse; + wB += iB * impulse; } // Solve limit constraint. - if (m_enableLimit && m_limitState != e_inactiveLimit) + if (m_enableLimit && m_limitState != e_inactiveLimit && fixedRotation == false) { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - // Solve point-to-point constraint - b2Vec2 Cdot1 = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); - float32 Cdot2 = w2 - w1; + 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); + b2Vec3 impulse = -m_mass.Solve33(Cdot); if (m_limitState == e_equalLimits) { @@ -214,7 +226,8 @@ void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) float32 newImpulse = m_impulse.z + impulse.z; if (newImpulse < 0.0f) { - b2Vec2 reduced = m_mass.Solve22(-Cdot1); + 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; @@ -222,13 +235,18 @@ void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) 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 reduced = m_mass.Solve22(-Cdot1); + 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; @@ -236,57 +254,60 @@ void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) m_impulse.y += reduced.y; m_impulse.z = 0.0f; } + else + { + m_impulse += impulse; + } } b2Vec2 P(impulse.x, impulse.y); - v1 -= m1 * P; - w1 -= i1 * (b2Cross(r1, P) + impulse.z); + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + impulse.z); - v2 += m2 * P; - w2 += i2 * (b2Cross(r2, P) + impulse.z); + vB += mB * P; + wB += iB * (b2Cross(m_rB, P) + impulse.z); } else { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - // Solve point-to-point constraint - b2Vec2 Cdot = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); + 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; - v1 -= m1 * impulse; - w1 -= i1 * b2Cross(r1, impulse); + vA -= mA * impulse; + wA -= iA * b2Cross(m_rA, impulse); - v2 += m2 * impulse; - w2 += i2 * b2Cross(r2, impulse); + vB += mB * impulse; + wB += iB * b2Cross(m_rB, impulse); } - b1->m_linearVelocity = v1; - b1->m_angularVelocity = w1; - b2->m_linearVelocity = v2; - b2->m_angularVelocity = w2; + 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(float32 baumgarte) +bool b2RevoluteJoint::SolvePositionConstraints(const b2SolverData& data) { - // TODO_ERIN block solve with limit. + 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; - B2_NOT_USED(baumgarte); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; + 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) + if (m_enableLimit && m_limitState != e_inactiveLimit && fixedRotation == false) { - float32 angle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; + float32 angle = aB - aA - m_referenceAngle; float32 limitImpulse = 0.0f; if (m_limitState == e_equalLimits) @@ -315,79 +336,54 @@ bool b2RevoluteJoint::SolvePositionConstraints(float32 baumgarte) limitImpulse = -m_motorMass * C; } - b1->m_sweep.a -= b1->m_invI * limitImpulse; - b2->m_sweep.a += b2->m_invI * limitImpulse; - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); + aA -= m_invIA * limitImpulse; + aB += m_invIB * limitImpulse; } // Solve point-to-point constraint. { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); + qA.Set(aA); + qB.Set(aB); + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); - b2Vec2 C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; + b2Vec2 C = cB + rB - cA - rA; positionError = C.Length(); - float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; - float32 invI1 = b1->m_invI, invI2 = b2->m_invI; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - // Handle large detachment. - const float32 k_allowedStretch = 10.0f * b2_linearSlop; - if (C.LengthSquared() > k_allowedStretch * k_allowedStretch) - { - // Use a particle solution (no rotation). - b2Vec2 u = C; u.Normalize(); - float32 m = invMass1 + invMass2; - if (m > 0.0f) - { - m = 1.0f / m; - } - b2Vec2 impulse = m * (-C); - const float32 k_beta = 0.5f; - b1->m_sweep.c -= k_beta * invMass1 * impulse; - b2->m_sweep.c += k_beta * invMass2 * impulse; + 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; - C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - } + b2Vec2 impulse = -K.Solve(C); - b2Mat22 K1; - K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; + cA -= mA * impulse; + aA -= iA * b2Cross(rA, impulse); - b2Mat22 K2; - K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; - K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; - - b2Mat22 K3; - K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; - K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; - - b2Mat22 K = K1 + K2 + K3; - b2Vec2 impulse = K.Solve(-C); - - b1->m_sweep.c -= b1->m_invMass * impulse; - b1->m_sweep.a -= b1->m_invI * b2Cross(r1, impulse); - - b2->m_sweep.c += b2->m_invMass * impulse; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, impulse); - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); + 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_localAnchor1); + return m_bodyA->GetWorldPoint(m_localAnchorA); } b2Vec2 b2RevoluteJoint::GetAnchorB() const { - return m_bodyB->GetWorldPoint(m_localAnchor2); + return m_bodyB->GetWorldPoint(m_localAnchorB); } b2Vec2 b2RevoluteJoint::GetReactionForce(float32 inv_dt) const @@ -403,16 +399,16 @@ float32 b2RevoluteJoint::GetReactionTorque(float32 inv_dt) const float32 b2RevoluteJoint::GetJointAngle() const { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - return b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + return bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle; } float32 b2RevoluteJoint::GetJointSpeed() const { - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - return b2->m_angularVelocity - b1->m_angularVelocity; + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + return bB->m_angularVelocity - bA->m_angularVelocity; } bool b2RevoluteJoint::IsMotorEnabled() const @@ -427,9 +423,9 @@ void b2RevoluteJoint::EnableMotor(bool flag) m_enableMotor = flag; } -float32 b2RevoluteJoint::GetMotorTorque() const +float32 b2RevoluteJoint::GetMotorTorque(float32 inv_dt) const { - return m_motorImpulse; + return inv_dt * m_motorImpulse; } void b2RevoluteJoint::SetMotorSpeed(float32 speed) @@ -453,9 +449,13 @@ bool b2RevoluteJoint::IsLimitEnabled() const void b2RevoluteJoint::EnableLimit(bool flag) { - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableLimit = 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 @@ -471,8 +471,13 @@ float32 b2RevoluteJoint::GetUpperLimit() const void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) { b2Assert(lower <= upper); - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_lowerAngle = lower; - m_upperAngle = 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; + } } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h old mode 100644 new mode 100755 index c0180beba..03eae0b3a --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -93,9 +93,6 @@ public: b2Vec2 GetAnchorA() const; b2Vec2 GetAnchorB() const; - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - /// Get the current joint angle in radians. float32 GetJointAngle() const; @@ -132,8 +129,17 @@ public: /// Set the maximum motor torque, usually in N-m. void SetMaxMotorTorque(float32 torque); - /// Get the current motor torque, usually in N-m. - float32 GetMotorTorque() const; + /// 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; protected: @@ -142,19 +148,16 @@ protected: b2RevoluteJoint(const b2RevoluteJointDef* def); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchor1; // relative - b2Vec2 m_localAnchor2; + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; b2Vec3 m_impulse; float32 m_motorImpulse; - b2Mat33 m_mass; // effective mass for point-to-point constraint. - float32 m_motorMass; // effective mass for motor/limit angular constraint. - bool m_enableMotor; float32 m_maxMotorTorque; float32 m_motorSpeed; @@ -163,6 +166,20 @@ protected: 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; }; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp new file mode 100755 index 000000000..4b1e666c1 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp @@ -0,0 +1,226 @@ +/* +* 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; +} diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h new file mode 100755 index 000000000..660b4ed50 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h @@ -0,0 +1,104 @@ +/* +* 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; + + /// Get the maximum length of the rope. + float32 GetMaxLength() const; + + b2LimitState GetLimitState() const; + +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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp old mode 100644 new mode 100755 index 49b5513ba..11eb5ec65 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -53,14 +53,31 @@ b2WeldJoint::b2WeldJoint(const b2WeldJointDef* def) m_impulse.SetZero(); } -void b2WeldJoint::InitVelocityConstraints(const b2TimeStep& step) +void b2WeldJoint::InitVelocityConstraints(const b2SolverData& data) { - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; + 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; - // Compute the effective mass matrix. - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + 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); // J = [-I -r1_skew I r2_skew] // [ 0 -1 0 1] @@ -71,128 +88,121 @@ void b2WeldJoint::InitVelocityConstraints(const b2TimeStep& step) // [ -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 = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; - m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; - m_mass.col3.x = -rA.y * iA - rB.y * iB; - m_mass.col1.y = m_mass.col2.x; - m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; - m_mass.col3.y = rA.x * iA + rB.x * iB; - m_mass.col1.z = m_mass.col3.x; - m_mass.col2.z = m_mass.col3.y; - m_mass.col3.z = iA + iB; + 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; - if (step.warmStarting) + if (data.step.warmStarting) { // Scale impulses to support a variable time step. - m_impulse *= step.dtRatio; + m_impulse *= data.step.dtRatio; b2Vec2 P(m_impulse.x, m_impulse.y); - bA->m_linearVelocity -= mA * P; - bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_impulse.z); + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + m_impulse.z); - bB->m_linearVelocity += mB * P; - bB->m_angularVelocity += iB * (b2Cross(rB, 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 b2TimeStep& step) +void b2WeldJoint::SolveVelocityConstraints(const b2SolverData& data) { - B2_NOT_USED(step); + 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; - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - b2Vec2 vA = bA->m_linearVelocity; - float32 wA = bA->m_angularVelocity; - b2Vec2 vB = bB->m_linearVelocity; - float32 wB = bB->m_angularVelocity; - - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; - - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); - - // Solve point-to-point constraint - b2Vec2 Cdot1 = vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA); + 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); + b2Vec3 impulse = -m_mass.Solve33(Cdot); m_impulse += impulse; b2Vec2 P(impulse.x, impulse.y); vA -= mA * P; - wA -= iA * (b2Cross(rA, P) + impulse.z); + wA -= iA * (b2Cross(m_rA, P) + impulse.z); vB += mB * P; - wB += iB * (b2Cross(rB, P) + impulse.z); + wB += iB * (b2Cross(m_rB, P) + impulse.z); - bA->m_linearVelocity = vA; - bA->m_angularVelocity = wA; - bB->m_linearVelocity = vB; - bB->m_angularVelocity = wB; + 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(float32 baumgarte) +bool b2WeldJoint::SolvePositionConstraints(const b2SolverData& data) { - B2_NOT_USED(baumgarte); + 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; - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; + b2Rot qA(aA), qB(aB); - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); - b2Vec2 C1 = bB->m_sweep.c + rB - bA->m_sweep.c - rA; - float32 C2 = bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle; + b2Vec2 C1 = cB + rB - cA - rA; + float32 C2 = aB - aA - m_referenceAngle; - // Handle large detachment. - const float32 k_allowedStretch = 10.0f * b2_linearSlop; float32 positionError = C1.Length(); float32 angularError = b2Abs(C2); - if (positionError > k_allowedStretch) - { - iA *= 1.0f; - iB *= 1.0f; - } - m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; - m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; - m_mass.col3.x = -rA.y * iA - rB.y * iB; - m_mass.col1.y = m_mass.col2.x; - m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; - m_mass.col3.y = rA.x * iA + rB.x * iB; - m_mass.col1.z = m_mass.col3.x; - m_mass.col2.z = m_mass.col3.y; - m_mass.col3.z = iA + iB; + m_mass.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + m_mass.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + m_mass.ez.x = -rA.y * iA - rB.y * iB; + m_mass.ex.y = m_mass.ey.x; + m_mass.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + m_mass.ez.y = rA.x * iA + 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; b2Vec3 C(C1.x, C1.y, C2); - b2Vec3 impulse = m_mass.Solve33(-C); + b2Vec3 impulse = -m_mass.Solve33(C); b2Vec2 P(impulse.x, impulse.y); - bA->m_sweep.c -= mA * P; - bA->m_sweep.a -= iA * (b2Cross(rA, P) + impulse.z); + cA -= mA * P; + aA -= iA * (b2Cross(rA, P) + impulse.z); - bB->m_sweep.c += mB * P; - bB->m_sweep.a += iB * (b2Cross(rB, P) + impulse.z); + cB += mB * P; + aB += iB * (b2Cross(rB, P) + impulse.z); - bA->SynchronizeTransform(); - bB->SynchronizeTransform(); + 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; } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h old mode 100644 new mode 100755 index 4e63b6aa6..51c4b402b --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -65,17 +65,27 @@ protected: b2WeldJoint(const b2WeldJointDef* def); - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - - bool SolvePositionConstraints(float32 baumgarte); + 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_referenceAngle; - 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; }; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp new file mode 100755 index 000000000..826192347 --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp @@ -0,0 +1,404 @@ +/* +* 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.0; + 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; +} + + + + + diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h new file mode 100755 index 000000000..7398d218c --- /dev/null +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h @@ -0,0 +1,199 @@ +/* +* 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 body1's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to body2's origin. + b2Vec2 localAnchorB; + + /// The local translation axis in body1. + 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 body1 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; + + /// 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; + +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/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp old mode 100644 new mode 100755 index 4b8865148..858977c81 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* 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 @@ -28,7 +28,6 @@ b2Body::b2Body(const b2BodyDef* bd, b2World* world) b2Assert(bd->linearVelocity.IsValid()); b2Assert(b2IsValid(bd->angle)); b2Assert(b2IsValid(bd->angularVelocity)); - b2Assert(b2IsValid(bd->inertiaScale) && bd->inertiaScale >= 0.0f); b2Assert(b2IsValid(bd->angularDamping) && bd->angularDamping >= 0.0f); b2Assert(b2IsValid(bd->linearDamping) && bd->linearDamping >= 0.0f); @@ -57,12 +56,15 @@ b2Body::b2Body(const b2BodyDef* bd, b2World* world) m_world = world; - m_xf.position = bd->position; - m_xf.R.Set(bd->angle); + m_xf.p = bd->position; + m_xf.q.Set(bd->angle); m_sweep.localCenter.SetZero(); - m_sweep.a0 = m_sweep.a = bd->angle; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + 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; @@ -74,6 +76,7 @@ b2Body::b2Body(const b2BodyDef* bd, b2World* world) m_linearDamping = bd->linearDamping; m_angularDamping = bd->angularDamping; + m_gravityScale = bd->gravityScale; m_force.SetZero(); m_torque = 0.0f; @@ -109,6 +112,12 @@ b2Body::~b2Body() void b2Body::SetType(b2BodyType type) { + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + if (m_type == type) { return; @@ -122,6 +131,9 @@ void b2Body::SetType(b2BodyType type) { m_linearVelocity.SetZero(); m_angularVelocity = 0.0f; + m_sweep.a0 = m_sweep.a; + m_sweep.c0 = m_sweep.c; + SynchronizeFixtures(); } SetAwake(true); @@ -130,9 +142,9 @@ void b2Body::SetType(b2BodyType type) m_torque = 0.0f; // Since the body type changed, we need to flag contacts for filtering. - for (b2ContactEdge* ce = m_contactList; ce; ce = ce->next) + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) { - ce->contact->FlagForFiltering(); + f->Refilter(); } } @@ -153,7 +165,7 @@ b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def) if (m_flags & e_activeFlag) { b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - fixture->CreateProxy(broadPhase, m_xf); + fixture->CreateProxies(broadPhase, m_xf); } fixture->m_next = m_fixtureList; @@ -235,13 +247,8 @@ void b2Body::DestroyFixture(b2Fixture* fixture) if (m_flags & e_activeFlag) { - b2Assert(fixture->m_proxyId != b2BroadPhase::e_nullProxy); b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - fixture->DestroyProxy(broadPhase); - } - else - { - b2Assert(fixture->m_proxyId == b2BroadPhase::e_nullProxy); + fixture->DestroyProxies(broadPhase); } fixture->Destroy(allocator); @@ -268,14 +275,16 @@ void b2Body::ResetMassData() // Static and kinematic bodies have zero mass. if (m_type == b2_staticBody || m_type == b2_kinematicBody) { - m_sweep.c0 = m_sweep.c = m_xf.position; + 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 center = b2Vec2_zero; + b2Vec2 localCenter = b2Vec2_zero; for (b2Fixture* f = m_fixtureList; f; f = f->m_next) { if (f->m_density == 0.0f) @@ -286,7 +295,7 @@ void b2Body::ResetMassData() b2MassData massData; f->GetMassData(&massData); m_mass += massData.mass; - center += massData.mass * massData.center; + localCenter += massData.mass * massData.center; m_I += massData.I; } @@ -294,7 +303,7 @@ void b2Body::ResetMassData() if (m_mass > 0.0f) { m_invMass = 1.0f / m_mass; - center *= m_invMass; + localCenter *= m_invMass; } else { @@ -306,7 +315,7 @@ void b2Body::ResetMassData() if (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0) { // Center the inertia about the center of mass. - m_I -= m_mass * b2Dot(center, center); + m_I -= m_mass * b2Dot(localCenter, localCenter); b2Assert(m_I > 0.0f); m_invI = 1.0f / m_I; @@ -319,7 +328,7 @@ void b2Body::ResetMassData() // Move center of mass. b2Vec2 oldCenter = m_sweep.c; - m_sweep.localCenter = center; + m_sweep.localCenter = localCenter; m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); // Update center of mass velocity. @@ -360,7 +369,7 @@ void b2Body::SetMassData(const b2MassData* massData) // Move center of mass. b2Vec2 oldCenter = m_sweep.c; - m_sweep.localCenter = massData->center; + m_sweep.localCenter = massData->center; m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); // Update center of mass velocity. @@ -398,11 +407,14 @@ void b2Body::SetTransform(const b2Vec2& position, float32 angle) return; } - m_xf.R.Set(angle); - m_xf.position = position; + m_xf.q.Set(angle); + m_xf.p = position; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - m_sweep.a0 = m_sweep.a = angle; + 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) @@ -416,8 +428,8 @@ void b2Body::SetTransform(const b2Vec2& position, float32 angle) void b2Body::SynchronizeFixtures() { b2Transform xf1; - xf1.R.Set(m_sweep.a0); - xf1.position = m_sweep.c0 - b2Mul(xf1.R, m_sweep.localCenter); + 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) @@ -428,6 +440,8 @@ void b2Body::SynchronizeFixtures() void b2Body::SetActive(bool flag) { + b2Assert(m_world->IsLocked() == false); + if (flag == IsActive()) { return; @@ -441,7 +455,7 @@ void b2Body::SetActive(bool flag) b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; for (b2Fixture* f = m_fixtureList; f; f = f->m_next) { - f->CreateProxy(broadPhase, m_xf); + f->CreateProxies(broadPhase, m_xf); } // Contacts are created the next time step. @@ -454,7 +468,7 @@ void b2Body::SetActive(bool flag) b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; for (b2Fixture* f = m_fixtureList; f; f = f->m_next) { - f->DestroyProxy(broadPhase); + f->DestroyProxies(broadPhase); } // Destroy the attached contacts. diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h old mode 100644 new mode 100755 index f2f915faa..5ebc5ddd1 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -40,7 +40,10 @@ enum b2BodyType { b2_staticBody = 0, b2_kinematicBody, - b2_dynamicBody, + b2_dynamicBody + + // TODO_ERIN + //b2_bulletBody, }; /// A body definition holds all the data needed to construct a rigid body. @@ -63,7 +66,7 @@ struct b2BodyDef bullet = false; type = b2_staticBody; active = true; - inertiaScale = 1.0f; + gravityScale = 1.0f; } /// The body type: static, kinematic, or dynamic. @@ -115,8 +118,8 @@ struct b2BodyDef /// Use this to store application specific body data. void* userData; - /// Experimental: scales the inertia tensor. - float32 inertiaScale; + /// Scale the gravity applied to this body. + float32 gravityScale; }; /// A rigid body. These are created via b2World::CreateBody. @@ -198,6 +201,10 @@ public: /// @param point the world position of the point of application. void ApplyForce(const b2Vec2& force, const b2Vec2& point); + /// Apply a force to the center of mass. This wakes up the body. + /// @param force the world force vector, usually in Newtons (N). + void ApplyForceToCenter(const b2Vec2& force); + /// Apply a torque. This affects the angular velocity /// without affecting the linear velocity of the center of mass. /// This wakes up the body. @@ -281,6 +288,12 @@ public: /// 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); @@ -368,17 +381,18 @@ private: friend class b2Island; friend class b2ContactManager; friend class b2ContactSolver; - friend class b2TOISolver; + friend class b2Contact; friend class b2DistanceJoint; friend class b2GearJoint; - friend class b2LineJoint; + friend class b2WheelJoint; friend class b2MouseJoint; friend class b2PrismaticJoint; friend class b2PulleyJoint; friend class b2RevoluteJoint; friend class b2WeldJoint; friend class b2FrictionJoint; + friend class b2RopeJoint; // m_flags enum @@ -389,7 +403,7 @@ private: e_bulletFlag = 0x0008, e_fixedRotationFlag = 0x0010, e_activeFlag = 0x0020, - e_toiFlag = 0x0040, + e_toiFlag = 0x0040 }; b2Body(const b2BodyDef* bd, b2World* world); @@ -436,6 +450,7 @@ private: float32 m_linearDamping; float32 m_angularDamping; + float32 m_gravityScale; float32 m_sleepTime; @@ -454,12 +469,12 @@ inline const b2Transform& b2Body::GetTransform() const inline const b2Vec2& b2Body::GetPosition() const { - return m_xf.position; + return m_xf.p; } inline float32 b2Body::GetAngle() const { - return m_sweep.a; + return m_xf.q.GetAngle(); } inline const b2Vec2& b2Body::GetWorldCenter() const @@ -536,7 +551,7 @@ inline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const inline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const { - return b2Mul(m_xf.R, localVector); + return b2Mul(m_xf.q, localVector); } inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const @@ -546,7 +561,7 @@ inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const inline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const { - return b2MulT(m_xf.R, worldVector); + return b2MulT(m_xf.q, worldVector); } inline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const @@ -579,6 +594,16 @@ 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) @@ -730,6 +755,21 @@ inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point) m_torque += b2Cross(point - m_sweep.c, force); } +inline void b2Body::ApplyForceToCenter(const b2Vec2& force) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (IsAwake() == false) + { + SetAwake(true); + } + + m_force += force; +} + inline void b2Body::ApplyTorque(float32 torque) { if (m_type != b2_dynamicBody) @@ -776,17 +816,18 @@ inline void b2Body::ApplyAngularImpulse(float32 impulse) inline void b2Body::SynchronizeTransform() { - m_xf.R.Set(m_sweep.a); - m_xf.position = m_sweep.c - b2Mul(m_xf.R, m_sweep.localCenter); + 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 t) +inline void b2Body::Advance(float32 alpha) { - // Advance to the new safe time. - m_sweep.Advance(t); + // 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; - SynchronizeTransform(); + m_xf.q.Set(m_sweep.a); + m_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter); } inline b2World* b2Body::GetWorld() diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp old mode 100644 new mode 100755 index d8d96ddbc..ee12b325e --- a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -110,10 +110,16 @@ void b2ContactManager::Collide() { b2Fixture* fixtureA = c->GetFixtureA(); b2Fixture* fixtureB = c->GetFixtureB(); + int32 indexA = c->GetChildIndexA(); + int32 indexB = c->GetChildIndexB(); b2Body* bodyA = fixtureA->GetBody(); b2Body* bodyB = fixtureB->GetBody(); + + bool activeA = bodyA->IsAwake() && bodyA->m_type != b2_staticBody; + bool activeB = bodyB->IsAwake() && bodyB->m_type != b2_staticBody; - if (bodyA->IsAwake() == false && bodyB->IsAwake() == false) + // At least one body must be awake and it must be dynamic or kinematic. + if (activeA == false && activeB == false) { c = c->GetNext(); continue; @@ -144,8 +150,8 @@ void b2ContactManager::Collide() c->m_flags &= ~b2Contact::e_filterFlag; } - int32 proxyIdA = fixtureA->m_proxyId; - int32 proxyIdB = fixtureB->m_proxyId; + 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. @@ -170,8 +176,14 @@ void b2ContactManager::FindNewContacts() void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) { - b2Fixture* fixtureA = (b2Fixture*)proxyUserDataA; - b2Fixture* fixtureB = (b2Fixture*)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(); @@ -182,6 +194,8 @@ void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) 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) @@ -190,13 +204,16 @@ void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) { b2Fixture* fA = edge->contact->GetFixtureA(); b2Fixture* fB = edge->contact->GetFixtureB(); - if (fA == fixtureA && fB == fixtureB) + 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) + if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { // A contact already exists. return; @@ -219,11 +236,17 @@ void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) } // Call the factory. - b2Contact* c = b2Contact::Create(fixtureA, fixtureB, m_allocator); + 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(); @@ -262,5 +285,9 @@ void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) } bodyB->m_contactList = &c->m_nodeB; + // Wake up the bodies + bodyA->SetAwake(true); + bodyB->SetAwake(true); + ++m_contactCount; } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h old mode 100644 new mode 100755 index fcba54ae7..dc1f77fe5 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp old mode 100644 new mode 100755 index 31355b572..478088a44 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -18,29 +18,26 @@ #include #include +#include #include +#include #include +#include #include #include #include - b2Fixture::b2Fixture() { m_userData = NULL; m_body = NULL; m_next = NULL; - m_proxyId = b2BroadPhase::e_nullProxy; + m_proxies = NULL; + m_proxyCount = 0; m_shape = NULL; m_density = 0.0f; } -b2Fixture::~b2Fixture() -{ - b2Assert(m_shape == NULL); - b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); -} - void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def) { m_userData = def->userData; @@ -56,13 +53,28 @@ void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2Fixtur 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 proxy must be destroyed before calling this. - b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); + // 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) @@ -75,6 +87,14 @@ void b2Fixture::Destroy(b2BlockAllocator* allocator) } 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; @@ -83,6 +103,14 @@ void b2Fixture::Destroy(b2BlockAllocator* allocator) } break; + case b2Shape::e_chain: + { + b2ChainShape* s = (b2ChainShape*)m_shape; + s->~b2ChainShape(); + allocator->Free(s, sizeof(b2ChainShape)); + } + break; + default: b2Assert(false); break; @@ -91,50 +119,69 @@ void b2Fixture::Destroy(b2BlockAllocator* allocator) m_shape = NULL; } -void b2Fixture::CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf) +void b2Fixture::CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf) { - b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); + b2Assert(m_proxyCount == 0); - // Create proxy in the broad-phase. - m_shape->ComputeAABB(&m_aabb, xf); - m_proxyId = broadPhase->CreateProxy(m_aabb, this); + // 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::DestroyProxy(b2BroadPhase* broadPhase) +void b2Fixture::DestroyProxies(b2BroadPhase* broadPhase) { - if (m_proxyId == b2BroadPhase::e_nullProxy) + // Destroy proxies in the broad-phase. + for (int32 i = 0; i < m_proxyCount; ++i) { - return; + b2FixtureProxy* proxy = m_proxies + i; + broadPhase->DestroyProxy(proxy->proxyId); + proxy->proxyId = b2BroadPhase::e_nullProxy; } - // Destroy proxy in the broad-phase. - broadPhase->DestroyProxy(m_proxyId); - m_proxyId = b2BroadPhase::e_nullProxy; + m_proxyCount = 0; } void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2) { - if (m_proxyId == b2BroadPhase::e_nullProxy) + if (m_proxyCount == 0) { return; } - // Compute an AABB that covers the swept shape (may miss some rotation effect). - b2AABB aabb1, aabb2; - m_shape->ComputeAABB(&aabb1, transform1); - m_shape->ComputeAABB(&aabb2, transform2); + 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); - m_aabb.Combine(aabb1, aabb2); + proxy->aabb.Combine(aabb1, aabb2); - b2Vec2 displacement = transform2.position - transform1.position; + b2Vec2 displacement = transform2.p - transform1.p; - broadPhase->MoveProxy(m_proxyId, m_aabb, displacement); + 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; @@ -154,10 +201,28 @@ void b2Fixture::SetFilterData(const b2Filter& filter) 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) { - m_isSensor = sensor; + if (sensor != m_isSensor) + { + m_body->SetAwake(true); + m_isSensor = sensor; + } } diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h old mode 100644 new mode 100755 index d9d325554..a7b5c3428 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -26,6 +26,7 @@ class b2BlockAllocator; class b2Body; class b2BroadPhase; +class b2Fixture; /// This holds contact filtering data. struct b2Filter @@ -61,8 +62,6 @@ struct b2FixtureDef isSensor = false; } - virtual ~b2FixtureDef() {} - /// The shape, this must be set. The shape will be cloned, so you /// can create the shape on the stack. const b2Shape* shape; @@ -87,6 +86,14 @@ struct b2FixtureDef 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 @@ -115,11 +122,15 @@ public: /// 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(); @@ -138,14 +149,13 @@ public: void SetUserData(void* data); /// Test a point for containment in this fixture. - /// @param xf the shape world transform. /// @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) const; + 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 @@ -162,19 +172,21 @@ public: /// Get the coefficient of friction. float32 GetFriction() const; - /// Set the coefficient of friction. + /// 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. + /// 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() const; + const b2AABB& GetAABB(int32 childIndex) const; protected: @@ -184,7 +196,6 @@ protected: friend class b2ContactManager; b2Fixture(); - ~b2Fixture(); // We need separation create/destroy functions from the constructor/destructor because // the destructor cannot access the allocator (no destructor arguments allowed by C++). @@ -192,13 +203,11 @@ protected: void Destroy(b2BlockAllocator* allocator); // These support body activation/deactivation. - void CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf); - void DestroyProxy(b2BroadPhase* broadPhase); + void CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf); + void DestroyProxies(b2BroadPhase* broadPhase); void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2); - b2AABB m_aabb; - float32 m_density; b2Fixture* m_next; @@ -209,7 +218,9 @@ protected: float32 m_friction; float32 m_restitution; - int32 m_proxyId; + b2FixtureProxy* m_proxies; + int32 m_proxyCount; + b2Filter m_filter; bool m_isSensor; @@ -308,9 +319,9 @@ 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) const +inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const { - return m_shape->RayCast(output, input, m_body->GetTransform()); + return m_shape->RayCast(output, input, m_body->GetTransform(), childIndex); } inline void b2Fixture::GetMassData(b2MassData* massData) const @@ -318,9 +329,10 @@ inline void b2Fixture::GetMassData(b2MassData* massData) const m_shape->ComputeMass(massData, m_density); } -inline const b2AABB& b2Fixture::GetAABB() const +inline const b2AABB& b2Fixture::GetAABB(int32 childIndex) const { - return m_aabb; + b2Assert(0 <= childIndex && childIndex < m_proxyCount); + return m_proxies[childIndex].aabb; } #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp old mode 100644 new mode 100755 index 009249979..0e2129cf8 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -16,6 +16,7 @@ * 3. This notice may not be removed or altered from any source distribution. */ +#include #include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include /* Position Correction Notes @@ -178,130 +180,166 @@ b2Island::~b2Island() m_allocator->Free(m_bodies); } -void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep) +void b2Island::Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep) { - // Integrate velocities and apply damping. + 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]; - if (b->GetType() != b2_dynamicBody) - { - continue; - } - - // Integrate velocities. - b->m_linearVelocity += step.dt * (gravity + b->m_invMass * b->m_force); - b->m_angularVelocity += step.dt * 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 - // Taylor expansion: - // v2 = (1.0f - c * dt) * v1 - b->m_linearVelocity *= b2Clamp(1.0f - step.dt * b->m_linearDamping, 0.0f, 1.0f); - b->m_angularVelocity *= b2Clamp(1.0f - step.dt * b->m_angularDamping, 0.0f, 1.0f); - } - - // Partition contacts so that contacts with static bodies are solved last. - int32 i1 = -1; - for (int32 i2 = 0; i2 < m_contactCount; ++i2) - { - b2Fixture* fixtureA = m_contacts[i2]->GetFixtureA(); - b2Fixture* fixtureB = m_contacts[i2]->GetFixtureB(); - b2Body* bodyA = fixtureA->GetBody(); - b2Body* bodyB = fixtureB->GetBody(); - bool nonStatic = bodyA->GetType() != b2_staticBody && bodyB->GetType() != b2_staticBody; - if (nonStatic) - { - ++i1; - b2Swap(m_contacts[i1], m_contacts[i2]); - } - } - - // Initialize velocity constraints. - b2ContactSolver contactSolver(m_contacts, m_contactCount, m_allocator, step.dtRatio); - contactSolver.WarmStart(); - for (int32 i = 0; i < m_jointCount; ++i) - { - m_joints[i]->InitVelocityConstraints(step); - } - - // Solve velocity constraints. - for (int32 i = 0; i < step.velocityIterations; ++i) - { - for (int32 j = 0; j < m_jointCount; ++j) - { - m_joints[j]->SolveVelocityConstraints(step); - } - - contactSolver.SolveVelocityConstraints(); - } - - // Post-solve (store impulses for warm starting). - contactSolver.StoreImpulses(); - - // Integrate positions. - for (int32 i = 0; i < m_bodyCount; ++i) - { - b2Body* b = m_bodies[i]; - - if (b->GetType() == b2_staticBody) - { - continue; - } - - // Check for large velocities. - b2Vec2 translation = step.dt * b->m_linearVelocity; - if (b2Dot(translation, translation) > b2_maxTranslationSquared) - { - float32 ratio = b2_maxTranslation / translation.Length(); - b->m_linearVelocity *= ratio; - } - - float32 rotation = step.dt * b->m_angularVelocity; - if (rotation * rotation > b2_maxRotationSquared) - { - float32 ratio = b2_maxRotation / b2Abs(rotation); - b->m_angularVelocity *= ratio; - } + 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; - // Integrate - b->m_sweep.c += step.dt * b->m_linearVelocity; - b->m_sweep.a += step.dt * b->m_angularVelocity; + 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; - // Compute new transform - b->SynchronizeTransform(); + // 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 + // Taylor expansion: + // v2 = (1.0f - c * dt) * v1 + v *= b2Clamp(1.0f - h * b->m_linearDamping, 0.0f, 1.0f); + w *= b2Clamp(1.0f - h * b->m_angularDamping, 0.0f, 1.0f); + } - // Note: shapes are synchronized later. + m_positions[i].c = c; + m_positions[i].a = a; + m_velocities[i].v = v; + m_velocities[i].w = w; } - // Iterate over constraints. + 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(b2_contactBaumgarte); + bool contactsOkay = contactSolver.SolvePositionConstraints(); bool jointsOkay = true; for (int32 i = 0; i < m_jointCount; ++i) { - bool jointOkay = m_joints[i]->SolvePositionConstraints(b2_contactBaumgarte); + bool jointOkay = m_joints[i]->SolvePositionConstraints(solverData); jointsOkay = jointsOkay && jointOkay; } if (contactsOkay && jointsOkay) { // Exit early if the position errors are small. + positionSolved = true; break; } } - Report(contactSolver.m_constraints); + // 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) { @@ -318,12 +356,6 @@ void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSl continue; } - if ((b->m_flags & b2Body::e_autoSleepFlag) == 0) - { - b->m_sleepTime = 0.0f; - minSleepTime = 0.0f; - } - if ((b->m_flags & b2Body::e_autoSleepFlag) == 0 || b->m_angularVelocity * b->m_angularVelocity > angTolSqr || b2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr) @@ -333,12 +365,12 @@ void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSl } else { - b->m_sleepTime += step.dt; + b->m_sleepTime += h; minSleepTime = b2Min(minSleepTime, b->m_sleepTime); } } - if (minSleepTime >= b2_timeToSleep) + if (minSleepTime >= b2_timeToSleep && positionSolved) { for (int32 i = 0; i < m_bodyCount; ++i) { @@ -349,7 +381,139 @@ void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSl } } -void b2Island::Report(const b2ContactConstraint* constraints) +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) { @@ -360,13 +524,14 @@ void b2Island::Report(const b2ContactConstraint* constraints) { b2Contact* c = m_contacts[i]; - const b2ContactConstraint* cc = constraints + i; + const b2ContactVelocityConstraint* vc = constraints + i; b2ContactImpulse impulse; - for (int32 j = 0; j < cc->pointCount; ++j) + impulse.count = vc->pointCount; + for (int32 j = 0; j < vc->pointCount; ++j) { - impulse.normalImpulses[j] = cc->points[j].normalImpulse; - impulse.tangentImpulses[j] = cc->points[j].tangentImpulse; + impulse.normalImpulses[j] = vc->points[j].normalImpulse; + impulse.tangentImpulses[j] = vc->points[j].tangentImpulse; } m_listener->PostSolve(c, &impulse); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Island.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.h old mode 100644 new mode 100755 index 3a5fd1131..ef3d9b1df --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Island.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Island.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -27,21 +27,8 @@ class b2Contact; class b2Joint; class b2StackAllocator; class b2ContactListener; -struct b2ContactConstraint; - -/// This is an internal structure. -struct b2Position -{ - b2Vec2 x; - float32 a; -}; - -/// This is an internal structure. -struct b2Velocity -{ - b2Vec2 v; - float32 w; -}; +struct b2ContactVelocityConstraint; +struct b2Profile; /// This is an internal class. class b2Island @@ -58,13 +45,16 @@ public: m_jointCount = 0; } - void Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep); + 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_bodies[m_bodyCount] = body; + ++m_bodyCount; } void Add(b2Contact* contact) @@ -79,7 +69,7 @@ public: m_joints[m_jointCount++] = joint; } - void Report(const b2ContactConstraint* constraints); + void Report(const b2ContactVelocityConstraint* constraints); b2StackAllocator* m_allocator; b2ContactListener* m_listener; @@ -98,8 +88,6 @@ public: int32 m_bodyCapacity; int32 m_contactCapacity; int32 m_jointCapacity; - - int32 m_positionIterationCount; }; #endif diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h b/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h old mode 100644 new mode 100755 index f59245dd6..80916cb65 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -19,17 +19,52 @@ #ifndef B2_TIME_STEP_H #define B2_TIME_STEP_H -#include +#include -/// This is an internal structure. -struct b2TimeStep +/// Profiling data. Times are in milliseconds. +struct b2Profile { - 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; + 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/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp old mode 100644 new mode 100755 index d3b9e0038..7dcddd03c --- a/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -23,12 +23,15 @@ #include #include #include -#include #include #include #include +#include +#include #include #include +#include +#include #include b2World::b2World(const b2Vec2& gravity, bool doSleep) @@ -44,6 +47,9 @@ b2World::b2World(const b2Vec2& gravity, bool doSleep) m_warmStarting = true; m_continuousPhysics = true; + m_subStepping = false; + + m_stepComplete = true; m_allowSleep = doSleep; m_gravity = gravity; @@ -53,10 +59,29 @@ b2World::b2World(const b2Vec2& gravity, bool doSleep) 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) @@ -74,7 +99,7 @@ void b2World::SetContactListener(b2ContactListener* listener) m_contactManager.m_contactListener = listener; } -void b2World::SetDebugDraw(b2DebugDraw* debugDraw) +void b2World::SetDebugDraw(b2Draw* debugDraw) { m_debugDraw = debugDraw; } @@ -125,6 +150,8 @@ void b2World::DestroyBody(b2Body* b) } DestroyJoint(je0->joint); + + b->m_jointList = je; } b->m_jointList = NULL; @@ -150,10 +177,13 @@ void b2World::DestroyBody(b2Body* b) m_destructionListener->SayGoodbye(f0); } - f0->DestroyProxy(&m_contactManager.m_broadPhase); + 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; @@ -337,6 +367,10 @@ void b2World::DestroyJoint(b2Joint* j) // 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, @@ -475,7 +509,11 @@ void b2World::Solve(const b2TimeStep& step) } } - island.Solve(step, m_gravity, m_allowSleep); + 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) @@ -491,292 +529,357 @@ void b2World::Solve(const b2TimeStep& step) m_stackAllocator.Free(stack); - // 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) + b2Timer timer; + // Synchronize fixtures, check for out of range bodies. + for (b2Body* b = m_bodyList; b; b = b->GetNext()) { - continue; - } - - if (b->GetType() == b2_staticBody) - { - continue; - } - - // Update fixtures (for broad-phase). - b->SynchronizeFixtures(); - } - - // Look for new contacts. - m_contactManager.FindNewContacts(); -} - -// Advance a dynamic body to its first time of contact -// and adjust the position to ensure clearance. -void b2World::SolveTOI(b2Body* body) -{ - // Find the minimum contact. - b2Contact* toiContact = NULL; - float32 toi = 1.0f; - b2Body* toiOther = NULL; - bool found; - int32 count; - int32 iter = 0; - - bool bullet = body->IsBullet(); - - // Iterate until all contacts agree on the minimum TOI. We have - // to iterate because the TOI algorithm may skip some intermediate - // collisions when objects rotate through each other. - do - { - count = 0; - found = false; - for (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next) - { - if (ce->contact == toiContact) + // If a body was not in an island then it did not move. + if ((b->m_flags & b2Body::e_islandFlag) == 0) { continue; } - b2Body* other = ce->other; - b2BodyType type = other->GetType(); - - // Only bullets perform TOI with dynamic bodies. - if (bullet == true) + if (b->GetType() == b2_staticBody) { - // Bullets only perform TOI with bodies that have their TOI resolved. - if ((other->m_flags & b2Body::e_toiFlag) == 0) + 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; } - // No repeated hits on non-static bodies - if (type != b2_staticBody && (ce->contact->m_flags & b2Contact::e_bulletHitFlag) != 0) + 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; + 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; } - else if (type == b2_dynamicBody) + + if (alpha < minAlpha) { - continue; + // This is the minimum TOI found so far. + minContact = c; + minAlpha = alpha; } - - // Check for a disabled contact. - b2Contact* contact = ce->contact; - if (contact->IsEnabled() == false) - { - continue; - } - - // Prevent infinite looping. - if (contact->m_toiCount > 10) - { - continue; - } - - b2Fixture* fixtureA = contact->m_fixtureA; - b2Fixture* fixtureB = contact->m_fixtureB; - - // Cull sensors. - if (fixtureA->IsSensor() || fixtureB->IsSensor()) - { - continue; - } - - b2Body* bodyA = fixtureA->m_body; - b2Body* bodyB = fixtureB->m_body; - - // Compute the time of impact in interval [0, minTOI] - b2TOIInput input; - input.proxyA.Set(fixtureA->GetShape()); - input.proxyB.Set(fixtureB->GetShape()); - input.sweepA = bodyA->m_sweep; - input.sweepB = bodyB->m_sweep; - input.tMax = toi; - - b2TOIOutput output; - b2TimeOfImpact(&output, &input); - - if (output.state == b2TOIOutput::e_touching && output.t < toi) - { - toiContact = contact; - toi = output.t; - toiOther = other; - found = true; - } - - ++count; } - ++iter; - } while (found && count > 1 && iter < 50); - - if (toiContact == NULL) - { - body->Advance(1.0f); - return; - } - - b2Sweep backup = body->m_sweep; - body->Advance(toi); - toiContact->Update(m_contactManager.m_contactListener); - if (toiContact->IsEnabled() == false) - { - // Contact disabled. Backup and recurse. - body->m_sweep = backup; - SolveTOI(body); - } - - ++toiContact->m_toiCount; - - // Update all the valid contacts on this body and build a contact island. - b2Contact* contacts[b2_maxTOIContacts]; - count = 0; - for (b2ContactEdge* ce = body->m_contactList; ce && count < b2_maxTOIContacts; ce = ce->next) - { - b2Body* other = ce->other; - b2BodyType type = other->GetType(); - - // Only perform correction with static bodies, so the - // body won't get pushed out of the world. - if (type == b2_dynamicBody) + if (minContact == NULL || 1.0f - 10.0f * b2_epsilon < minAlpha) { - continue; - } - - // Check for a disabled contact. - b2Contact* contact = ce->contact; - if (contact->IsEnabled() == false) - { - continue; - } - - b2Fixture* fixtureA = contact->m_fixtureA; - b2Fixture* fixtureB = contact->m_fixtureB; - - // Cull sensors. - if (fixtureA->IsSensor() || fixtureB->IsSensor()) - { - continue; - } - - // The contact likely has some new contact points. The listener - // gives the user a chance to disable the contact. - if (contact != toiContact) - { - contact->Update(m_contactManager.m_contactListener); - } - - // Did the user disable the contact? - if (contact->IsEnabled() == false) - { - // Skip this contact. - continue; - } - - if (contact->IsTouching() == false) - { - continue; - } - - contacts[count] = contact; - ++count; - } - - // Reduce the TOI body's overlap with the contact island. - b2TOISolver solver(&m_stackAllocator); - solver.Initialize(contacts, count, body); - - const float32 k_toiBaumgarte = 0.75f; - bool solved = false; - for (int32 i = 0; i < 20; ++i) - { - bool contactsOkay = solver.Solve(k_toiBaumgarte); - if (contactsOkay) - { - solved = true; + // No more TOI events. Done! + m_stepComplete = true; break; } - } - if (toiOther->GetType() != b2_staticBody) - { - toiContact->m_flags |= b2Contact::e_bulletHitFlag; - } -} + // Advance the bodies to the TOI. + b2Fixture* fA = minContact->GetFixtureA(); + b2Fixture* fB = minContact->GetFixtureB(); + b2Body* bA = fA->GetBody(); + b2Body* bB = fB->GetBody(); -// Sequentially solve TOIs for each body. We bring each -// body to the time of contact and perform some position correction. -// Time is not conserved. -void b2World::SolveTOI() -{ - // Prepare all contacts. - for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) - { - // Enable the contact - c->m_flags |= b2Contact::e_enabledFlag; + b2Sweep backup1 = bA->m_sweep; + b2Sweep backup2 = bB->m_sweep; - // Set the number of TOI events for this contact to zero. - c->m_toiCount = 0; - } + bA->Advance(minAlpha); + bB->Advance(minAlpha); - // Initialize the TOI flag. - for (b2Body* body = m_bodyList; body; body = body->m_next) - { - // Kinematic, and static bodies will not be affected by the TOI event. - // If a body was not in an island then it did not move. - if ((body->m_flags & b2Body::e_islandFlag) == 0 || body->GetType() == b2_kinematicBody || body->GetType() == b2_staticBody) - { - body->m_flags |= b2Body::e_toiFlag; - } - else - { - body->m_flags &= ~b2Body::e_toiFlag; - } - } - - // Collide non-bullets. - for (b2Body* body = m_bodyList; body; body = body->m_next) - { - if (body->m_flags & b2Body::e_toiFlag) + // 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; } - if (body->IsBullet() == true) + 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) { - continue; + 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); + } + } } - SolveTOI(body); + 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); - body->m_flags |= b2Body::e_toiFlag; - } - - // Collide bullets. - for (b2Body* body = m_bodyList; body; body = body->m_next) - { - if (body->m_flags & b2Body::e_toiFlag) + // Reset island flags and synchronize broad-phase proxies. + for (int32 i = 0; i < island.m_bodyCount; ++i) { - continue; + 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); + } } - if (body->IsBullet() == false) + // 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) { - continue; + m_stepComplete = false; + break; } - - SolveTOI(body); - - body->m_flags |= b2Body::e_toiFlag; } } 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) { @@ -802,20 +905,28 @@ void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIteration step.dtRatio = m_inv_dt0 * dt; step.warmStarting = m_warmStarting; - + // Update contacts. This is where some contacts are destroyed. - m_contactManager.Collide(); + { + b2Timer timer; + m_contactManager.Collide(); + m_profile.collide = timer.GetMilliseconds(); + } // Integrate velocities, solve velocity constraints, and integrate positions. - if (step.dt > 0.0f) + 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) { - SolveTOI(); + b2Timer timer; + SolveTOI(step); + m_profile.solveTOI = timer.GetMilliseconds(); } if (step.dt > 0.0f) @@ -829,6 +940,8 @@ void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIteration } m_flags &= ~e_locked; + + m_profile.step = stepTimer.GetMilliseconds(); } void b2World::ClearForces() @@ -844,8 +957,8 @@ struct b2WorldQueryWrapper { bool QueryCallback(int32 proxyId) { - b2Fixture* fixture = (b2Fixture*)broadPhase->GetUserData(proxyId); - return callback->ReportFixture(fixture); + b2FixtureProxy* proxy = (b2FixtureProxy*)broadPhase->GetUserData(proxyId); + return callback->ReportFixture(proxy->fixture); } const b2BroadPhase* broadPhase; @@ -865,9 +978,11 @@ struct b2WorldRayCastWrapper float32 RayCastCallback(const b2RayCastInput& input, int32 proxyId) { void* userData = broadPhase->GetUserData(proxyId); - b2Fixture* fixture = (b2Fixture*)userData; + b2FixtureProxy* proxy = (b2FixtureProxy*)userData; + b2Fixture* fixture = proxy->fixture; + int32 index = proxy->childIndex; b2RayCastOutput output; - bool hit = fixture->RayCast(&output, input); + bool hit = fixture->RayCast(&output, input, index); if (hit) { @@ -905,12 +1020,38 @@ void b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color b2Vec2 center = b2Mul(xf, circle->m_p); float32 radius = circle->m_radius; - b2Vec2 axis = xf.R.col1; + 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->GetVertexCount(); + const b2Vec2* vertices = chain->GetVertices(); + + 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(); @@ -926,6 +1067,9 @@ void b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color); } break; + + default: + break; } } @@ -935,8 +1079,8 @@ void b2World::DrawJoint(b2Joint* joint) b2Body* bodyB = joint->GetBodyB(); const b2Transform& xf1 = bodyA->GetTransform(); const b2Transform& xf2 = bodyB->GetTransform(); - b2Vec2 x1 = xf1.position; - b2Vec2 x2 = xf2.position; + b2Vec2 x1 = xf1.p; + b2Vec2 x2 = xf2.p; b2Vec2 p1 = joint->GetAnchorA(); b2Vec2 p2 = joint->GetAnchorB(); @@ -979,7 +1123,7 @@ void b2World::DrawDebugData() uint32 flags = m_debugDraw->GetFlags(); - if (flags & b2DebugDraw::e_shapeBit) + if (flags & b2Draw::e_shapeBit) { for (b2Body* b = m_bodyList; b; b = b->GetNext()) { @@ -1010,7 +1154,7 @@ void b2World::DrawDebugData() } } - if (flags & b2DebugDraw::e_jointBit) + if (flags & b2Draw::e_jointBit) { for (b2Joint* j = m_jointList; j; j = j->GetNext()) { @@ -1018,22 +1162,22 @@ void b2World::DrawDebugData() } } - if (flags & b2DebugDraw::e_pairBit) + 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(); + //b2Fixture* fixtureA = c->GetFixtureA(); + //b2Fixture* fixtureB = c->GetFixtureB(); - b2Vec2 cA = fixtureA->GetAABB().GetCenter(); - b2Vec2 cB = fixtureB->GetAABB().GetCenter(); + //b2Vec2 cA = fixtureA->GetAABB().GetCenter(); + //b2Vec2 cB = fixtureB->GetAABB().GetCenter(); - m_debugDraw->DrawSegment(cA, cB, color); + //m_debugDraw->DrawSegment(cA, cB, color); } } - if (flags & b2DebugDraw::e_aabbBit) + if (flags & b2Draw::e_aabbBit) { b2Color color(0.9f, 0.3f, 0.9f); b2BroadPhase* bp = &m_contactManager.m_broadPhase; @@ -1047,24 +1191,28 @@ void b2World::DrawDebugData() for (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext()) { - b2AABB aabb = bp->GetFatAABB(f->m_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); + 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); + m_debugDraw->DrawPolygon(vs, 4, color); + } } } } - if (flags & b2DebugDraw::e_centerOfMassBit) + if (flags & b2Draw::e_centerOfMassBit) { for (b2Body* b = m_bodyList; b; b = b->GetNext()) { b2Transform xf = b->GetTransform(); - xf.position = b->GetWorldCenter(); + xf.p = b->GetWorldCenter(); m_debugDraw->DrawTransform(xf); } } @@ -1074,3 +1222,18 @@ 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(); +} diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2World.h b/src/modules/physics/box2d/Box2D/Dynamics/b2World.h old mode 100644 new mode 100755 index bff14272f..381e1f1ac --- a/src/modules/physics/box2d/Box2D/Dynamics/b2World.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2World.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -24,12 +24,14 @@ #include #include #include +#include struct b2AABB; struct b2BodyDef; +struct b2Color; struct b2JointDef; -struct b2TimeStep; class b2Body; +class b2Draw; class b2Fixture; class b2Joint; @@ -63,7 +65,7 @@ public: /// 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(b2DebugDraw* debugDraw); + void SetDebugDraw(b2Draw* debugDraw); /// Create a rigid body given a definition. No reference to the definition /// is retained. @@ -94,9 +96,12 @@ public: int32 velocityIterations, int32 positionIterations); - /// Call this after you are done with time steps to clear the forces. You normally - /// call this after each call to Step, unless you are performing sub-steps. By default, - /// forces will be automatically cleared, so you don't need to call this function. + /// 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(); @@ -121,17 +126,21 @@ public: /// 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 + /// @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 warm starting. For testing. void SetWarmStarting(bool flag) { m_warmStarting = flag; } @@ -139,6 +148,9 @@ public: /// Enable/disable continuous physics. For testing. void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; } + /// Enable/disable single stepped continuous physics. For testing. + void SetSubStepping(bool flag) { m_subStepping = flag; } + /// Get the number of broad-phase proxies. int32 GetProxyCount() const; @@ -151,6 +163,16 @@ public: /// 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); @@ -166,6 +188,12 @@ public: /// Get the flag that controls automatic clearing of forces after each time step. bool GetAutoClearForces() const; + /// Get the contact manager for testing. + const b2ContactManager& GetContactManager() const; + + /// Get the current profile. + const b2Profile& GetProfile() const; + private: // m_flags @@ -173,16 +201,16 @@ private: { e_newFixture = 0x0001, e_locked = 0x0002, - e_clearForces = 0x0004, + e_clearForces = 0x0004 }; friend class b2Body; + friend class b2Fixture; friend class b2ContactManager; friend class b2Controller; void Solve(const b2TimeStep& step); - void SolveTOI(); - void SolveTOI(b2Body* body); + void SolveTOI(const b2TimeStep& step); void DrawJoint(b2Joint* joint); void DrawShape(b2Fixture* shape, const b2Transform& xf, const b2Color& color); @@ -203,20 +231,21 @@ private: b2Vec2 m_gravity; bool m_allowSleep; - b2Body* m_groundBody; - b2DestructionListener* m_destructionListener; - b2DebugDraw* m_debugDraw; + b2Draw* m_debugDraw; // This is used to compute the time step ratio to // support a variable time step. float32 m_inv_dt0; - // This is for debugging the solver. + // These are for debugging the solver. bool m_warmStarting; - - // This is for debugging the solver. bool m_continuousPhysics; + bool m_subStepping; + + bool m_stepComplete; + + b2Profile m_profile; }; inline b2Body* b2World::GetBodyList() @@ -224,16 +253,31 @@ 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; @@ -282,4 +326,14 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp old mode 100644 new mode 100755 index bc5fefbdf..82b28cc05 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -34,28 +34,3 @@ bool b2ContactFilter::ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB) bool collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; return collide; } - -b2DebugDraw::b2DebugDraw() -{ - m_drawFlags = 0; -} - -void b2DebugDraw::SetFlags(uint32 flags) -{ - m_drawFlags = flags; -} - -uint32 b2DebugDraw::GetFlags() const -{ - return m_drawFlags; -} - -void b2DebugDraw::AppendFlags(uint32 flags) -{ - m_drawFlags |= flags; -} - -void b2DebugDraw::ClearFlags(uint32 flags) -{ - m_drawFlags &= ~flags; -} diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h old mode 100644 new mode 100755 index 82ee67ea0..9b937e81f --- a/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* 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 @@ -27,7 +27,6 @@ class b2Fixture; class b2Body; class b2Joint; class b2Contact; -struct b2ContactPoint; struct b2ContactResult; struct b2Manifold; @@ -67,6 +66,7 @@ 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 @@ -152,66 +152,4 @@ public: const b2Vec2& normal, float32 fraction) = 0; }; -/// 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 b2DebugDraw -{ -public: - b2DebugDraw(); - - virtual ~b2DebugDraw() {} - - 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/src/modules/physics/box2d/Box2D/Rope/b2Rope.cpp b/src/modules/physics/box2d/Box2D/Rope/b2Rope.cpp new file mode 100755 index 000000000..97578b266 --- /dev/null +++ b/src/modules/physics/box2d/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/src/modules/physics/box2d/Box2D/Rope/b2Rope.h b/src/modules/physics/box2d/Box2D/Rope/b2Rope.h new file mode 100755 index 000000000..bc5375ddb --- /dev/null +++ b/src/modules/physics/box2d/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/src/modules/physics/box2d/FrictionJoint.cpp b/src/modules/physics/box2d/FrictionJoint.cpp new file mode 100644 index 000000000..f4d818803 --- /dev/null +++ b/src/modules/physics/box2d/FrictionJoint.cpp @@ -0,0 +1,72 @@ +/** +* 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. +**/ + +#include "FrictionJoint.h" + +#include + +// Module +#include "Body.h" +#include "World.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + FrictionJoint::FrictionJoint(Body * body1, Body * body2, float x, float y) + : Joint(body1, body2), joint(NULL) + { + b2FrictionJointDef def; + def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); + joint = (b2FrictionJoint*)createJoint(&def); + } + + FrictionJoint::~FrictionJoint() + { + destroyJoint(joint); + joint = 0; + } + + void FrictionJoint::setMaxForce(float force) + { + joint->SetMaxForce(force); + } + + float FrictionJoint::getMaxForce() const + { + return joint->GetMaxForce(); + } + + void FrictionJoint::setMaxTorque(float torque) + { + joint->SetMaxTorque(torque); + } + + float FrictionJoint::getMaxTorque() const + { + return joint->GetMaxTorque(); + } + + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/FrictionJoint.h b/src/modules/physics/box2d/FrictionJoint.h new file mode 100644 index 000000000..ed4599f68 --- /dev/null +++ b/src/modules/physics/box2d/FrictionJoint.h @@ -0,0 +1,78 @@ +/** +* 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_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 + { + private: + + // The Box2D friction joint object. + b2FrictionJoint * joint; + + public: + + /** + * Creates a new FrictionJoint connecting body1 and body2. + **/ + FrictionJoint(Body * body1, Body * body2, float x, float y); + + 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; + + }; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_FRICTION_JOINT_H diff --git a/src/modules/physics/box2d/Joint.cpp b/src/modules/physics/box2d/Joint.cpp index 14f617489..79cf039f0 100644 --- a/src/modules/physics/box2d/Joint.cpp +++ b/src/modules/physics/box2d/Joint.cpp @@ -72,6 +72,14 @@ namespace box2d 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; } @@ -116,6 +124,11 @@ namespace box2d { return joint->IsActive(); } + + bool Joint::getCollideConnected() const + { + return joint->GetCollideConnected(); + } } // box2d } // physics diff --git a/src/modules/physics/box2d/Joint.h b/src/modules/physics/box2d/Joint.h index ea6fe9b09..d7e41ba58 100644 --- a/src/modules/physics/box2d/Joint.h +++ b/src/modules/physics/box2d/Joint.h @@ -100,6 +100,8 @@ namespace box2d float getReactionTorque(float dt); bool isActive() const; + + bool getCollideConnected() const; protected: diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index f76d9c9d1..40fd67f12 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -176,6 +176,11 @@ namespace box2d { return new GearJoint(joint1, joint2, ratio); } + + FrictionJoint * Physics::newFrictionJoint(Body * body1, Body * body2, float x, float y) + { + return new FrictionJoint(body1, body2, x, y); + } } // box2d } // physics diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index ed9136e0e..6f631cd97 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -36,6 +36,7 @@ #include "RevoluteJoint.h" #include "PulleyJoint.h" #include "GearJoint.h" +#include "FrictionJoint.h" namespace love { @@ -200,6 +201,13 @@ namespace box2d **/ GearJoint * newGearJoint(Joint * joint1, Joint * joint2, float ratio); + /** + * Creates a new FrictionJoint connecting body1 with body2. + * @param x Anchor along the x-axis. (World coordinates) + * @param y Anchor along the y-axis. (World coordinates) + **/ + FrictionJoint * newFrictionJoint(Body * body1, Body * body2, float x, float y); + }; // Physics diff --git a/src/modules/physics/box2d/PrismaticJoint.cpp b/src/modules/physics/box2d/PrismaticJoint.cpp index f97eba491..4556073a7 100644 --- a/src/modules/physics/box2d/PrismaticJoint.cpp +++ b/src/modules/physics/box2d/PrismaticJoint.cpp @@ -58,7 +58,7 @@ namespace box2d return world->scaleDown(joint->GetJointSpeed()); } - void PrismaticJoint::setMotorEnabled(bool motor) + void PrismaticJoint::enableMotor(bool motor) { return joint->EnableMotor(motor); } @@ -70,30 +70,30 @@ namespace box2d void PrismaticJoint::setMaxMotorForce(float force) { - joint->SetMaxMotorForce(force); + joint->SetMaxMotorForce(world->scaleDown(force)); } void PrismaticJoint::setMotorSpeed(float speed) { - joint->SetMotorSpeed(speed); + joint->SetMotorSpeed(world->scaleDown(speed)); } float PrismaticJoint::getMotorSpeed() const { - return joint->GetMotorSpeed(); + return world->scaleUp(joint->GetMotorSpeed()); } - float PrismaticJoint::getMotorForce() const + float PrismaticJoint::getMotorForce(float inv_dt) const { - return joint->GetMotorForce(); + return world->scaleUp(joint->GetMotorForce(inv_dt)); } - void PrismaticJoint::setLimitsEnabled(bool limit) + void PrismaticJoint::enableLimit(bool limit) { joint->EnableLimit(limit); } - bool PrismaticJoint::isLimitsEnabled() const + bool PrismaticJoint::isLimitEnabled() const { return joint->IsLimitEnabled(); } diff --git a/src/modules/physics/box2d/PrismaticJoint.h b/src/modules/physics/box2d/PrismaticJoint.h index b7f96ed3d..38b7787e9 100644 --- a/src/modules/physics/box2d/PrismaticJoint.h +++ b/src/modules/physics/box2d/PrismaticJoint.h @@ -87,8 +87,9 @@ namespace box2d /** * Get the current motor force, usually in N. + * @param inv_dt The inverse time step. **/ - float getMotorForce() const; + float getMotorForce(float inv_dt) const; /** * Enable/disable the joint limit. diff --git a/src/modules/physics/box2d/WeldJoint.cpp b/src/modules/physics/box2d/WeldJoint.cpp new file mode 100644 index 000000000..05cb7647f --- /dev/null +++ b/src/modules/physics/box2d/WeldJoint.cpp @@ -0,0 +1,51 @@ +/** +* 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. +**/ + +#include "WeldJoint.h" + +#include + +// Module +#include "Body.h" +#include "World.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + WeldJoint::WeldJoint(Body * body1, Body * body2, float x, float y) + : Joint(body1, body2), joint(NULL) + { + b2WeldJointDef def; + def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); + joint = (b2WeldJoint*)createJoint(&def); + } + + WeldJoint::~WeldJoint() + { + destroyJoint(joint); + joint = 0; + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/WeldJoint.h b/src/modules/physics/box2d/WeldJoint.h new file mode 100644 index 000000000..ce38a3759 --- /dev/null +++ b/src/modules/physics/box2d/WeldJoint.h @@ -0,0 +1,58 @@ +/** +* 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_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 + { + private: + + // The Box2D weld joint object. + b2WeldJoint * joint; + + public: + + /** + * Creates a new WeldJoint connecting body1 and body2. + **/ + WeldJoint(Body * body1, Body * body2, float x, float y); + + virtual ~WeldJoint(); + + }; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WELD_JOINT_H diff --git a/src/modules/physics/box2d/WheelJoint.cpp b/src/modules/physics/box2d/WheelJoint.cpp new file mode 100644 index 000000000..01f836338 --- /dev/null +++ b/src/modules/physics/box2d/WheelJoint.cpp @@ -0,0 +1,116 @@ +/** +* 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. +**/ + +#include "WheelJoint.h" + +// Module +#include "Body.h" +#include "World.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + WheelJoint::WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay) + : Joint(body1, body2), joint(NULL) + { + b2WheelJointDef def; + + def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y)), b2Vec2(ax,ay)); + joint = (b2WheelJoint*)createJoint(&def); + } + + WheelJoint::~WheelJoint() + { + destroyJoint(joint); + joint = 0; + } + + float WheelJoint::getJointTranslation() const + { + return world->scaleDown(joint->GetJointTranslation()); + } + + float WheelJoint::getJointSpeed() const + { + return world->scaleDown(joint->GetJointSpeed()); + } + + void WheelJoint::enableMotor(bool motor) + { + return joint->EnableMotor(motor); + } + + bool WheelJoint::isMotorEnabled() const + { + return joint->IsMotorEnabled(); + } + + void WheelJoint::setMotorSpeed(float speed) + { + joint->SetMotorSpeed(world->scaleDown(speed)); + } + + float WheelJoint::getMotorSpeed() const + { + return world->scaleUp(joint->GetMotorSpeed()); + } + + void WheelJoint::setMaxMotorTorque(float torque) + { + joint->SetMaxMotorTorque(world->scaleDown(torque)); + } + + float WheelJoint::getMaxMotorTorque() const + { + return world->scaleUp(joint->GetMaxMotorTorque()); + } + + float WheelJoint::getMotorTorque(float inv_dt) const + { + return world->scaleUp(joint->getMotorTorque(inv_dt)); + } + + void WheelJoint::setSpringFrequencyHz(float hz) + { + joint->SetSpringFrequencyHz(world->scaleDown(hz)); + } + + float WheelJoint::getSpringFrequencyHz() const + { + return world->scaleUp(joint->GetSpringFrequencyHz()); + } + + void WheelJoint::setSpringDampingRatio(float ratio) + { + joint->SetSpringDampingRatio(world->scaleDown(ratio)); + } + + float WheelJoint::getSpringDampingRatio() const + { + return world->scaleUp(joint->GetSpringDampingRatio()); + } + + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/WheelJoint.h b/src/modules/physics/box2d/WheelJoint.h new file mode 100644 index 000000000..431ca6fa7 --- /dev/null +++ b/src/modules/physics/box2d/WheelJoint.h @@ -0,0 +1,127 @@ +/** +* 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_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 + { + private: + + // The Box2D wheel joint object. + b2WheelJoint * joint; + + public: + + /** + * Creates a new WheelJoint connecting body1 and body2. + **/ + WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay); + + 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 enableMotor(bool motor); + + /** + * 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 setSpringFrequencyHz(float hz); + + /** + * Get the spring frequency, in hertz. + **/ + float getSpringFrequencyHz() const; + + /** + * Set the spring damping ratio. + **/ + void setSpringDampingRatio(float ratio); + + /** + * Get the spring damping ratio. + **/ + float getSpringDampingRatio() const; + + }; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WHEEL_JOINT_H diff --git a/src/modules/physics/box2d/wrap_DistanceJoint.cpp b/src/modules/physics/box2d/wrap_DistanceJoint.cpp index 94eeaa28c..65739637c 100644 --- a/src/modules/physics/box2d/wrap_DistanceJoint.cpp +++ b/src/modules/physics/box2d/wrap_DistanceJoint.cpp @@ -88,7 +88,6 @@ namespace box2d { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, - { "setCollideConnected", w_Joint_setCollideConnected }, { "getCollideConnected", w_Joint_getCollideConnected }, { "destroy", w_Joint_destroy }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_FrictionJoint.cpp b/src/modules/physics/box2d/wrap_FrictionJoint.cpp new file mode 100644 index 000000000..c57492ed6 --- /dev/null +++ b/src/modules/physics/box2d/wrap_FrictionJoint.cpp @@ -0,0 +1,86 @@ +/** +* 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. +**/ + +#include "wrap_FrictionJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + FrictionJoint * luax_checkfrictionjoint(lua_State * L, int idx) + { + return luax_checktype(L, idx, "FrictionJoint", PHYSICS_FRICTION_JOINT_T); + } + + int w_FrictionJoint_setMaxForce(lua_State * L) + { + FrictionJoint * t = luax_checkfrictionjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + 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); + 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 } + }; + + int luaopen_frictionjoint(lua_State * L) + { + return luax_register_type(L, "FrictionJoint", functions); + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/wrap_FrictionJoint.h b/src/modules/physics/box2d/wrap_FrictionJoint.h new file mode 100644 index 000000000..e42ebd1f0 --- /dev/null +++ b/src/modules/physics/box2d/wrap_FrictionJoint.h @@ -0,0 +1,46 @@ +/** +* 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_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H + +// LOVE +#include +#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); + int luaopen_frictionjoint(lua_State * L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H diff --git a/src/modules/physics/box2d/wrap_GearJoint.cpp b/src/modules/physics/box2d/wrap_GearJoint.cpp index 86a212600..125a13776 100644 --- a/src/modules/physics/box2d/wrap_GearJoint.cpp +++ b/src/modules/physics/box2d/wrap_GearJoint.cpp @@ -54,7 +54,6 @@ namespace box2d { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, - { "setCollideConnected", w_Joint_setCollideConnected }, { "getCollideConnected", w_Joint_getCollideConnected }, { "destroy", w_Joint_destroy }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_Joint.cpp b/src/modules/physics/box2d/wrap_Joint.cpp index 625660ae4..f71885202 100644 --- a/src/modules/physics/box2d/wrap_Joint.cpp +++ b/src/modules/physics/box2d/wrap_Joint.cpp @@ -63,14 +63,6 @@ namespace box2d return 1; } - int w_Joint_setCollideConnected(lua_State * L) - { - Joint * t = luax_checkjoint(L, 1); - bool arg1 = luax_toboolean(L, 2); - t->setCollideConnected(arg1); - return 0; - } - int w_Joint_getCollideConnected(lua_State * L) { Joint * t = luax_checkjoint(L, 1); @@ -94,7 +86,6 @@ namespace box2d { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, - { "setCollideConnected", w_Joint_setCollideConnected }, { "getCollideConnected", w_Joint_getCollideConnected }, { "destroy", w_Joint_destroy }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_Joint.h b/src/modules/physics/box2d/wrap_Joint.h index 0dfdb09d3..0337c58a1 100644 --- a/src/modules/physics/box2d/wrap_Joint.h +++ b/src/modules/physics/box2d/wrap_Joint.h @@ -36,7 +36,6 @@ namespace box2d int w_Joint_getAnchors(lua_State * L); int w_Joint_getReactionForce(lua_State * L); int w_Joint_getReactionTorque(lua_State * L); - int w_Joint_setCollideConnected(lua_State * L); int w_Joint_getCollideConnected(lua_State * L); int w_Joint_destroy(lua_State * L); int luaopen_joint(lua_State * L); diff --git a/src/modules/physics/box2d/wrap_MouseJoint.cpp b/src/modules/physics/box2d/wrap_MouseJoint.cpp index 8739b35f9..e25a74aa8 100644 --- a/src/modules/physics/box2d/wrap_MouseJoint.cpp +++ b/src/modules/physics/box2d/wrap_MouseJoint.cpp @@ -106,7 +106,6 @@ namespace box2d { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, - { "setCollideConnected", w_Joint_setCollideConnected }, { "getCollideConnected", w_Joint_getCollideConnected }, { "destroy", w_Joint_destroy }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index cd5d79cf8..434b4fa61 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -204,6 +204,17 @@ namespace box2d luax_newtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, (void*)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 x = (float)luaL_checknumber(L, 3); + float y = (float)luaL_checknumber(L, 4); + FrictionJoint * j = instance->newFrictionJoint(body1, body2, x, y); + luax_newtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, (void*)j); + return 1; + } // List of functions to wrap. static const luaL_Reg functions[] = { @@ -218,6 +229,7 @@ namespace box2d { "newPrismaticJoint", w_newPrismaticJoint }, { "newPulleyJoint", w_newPulleyJoint }, { "newGearJoint", w_newGearJoint }, + { "newFrictionJoint", w_newFrictionJoint }, { 0, 0 }, }; @@ -235,6 +247,7 @@ namespace box2d luaopen_revolutejoint, luaopen_pulleyjoint, luaopen_gearjoint, + luaopen_frictionjoint, 0 }; diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 5385a6e7b..bdf1bfee3 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -37,6 +37,7 @@ #include "wrap_RevoluteJoint.h" #include "wrap_PulleyJoint.h" #include "wrap_GearJoint.h" +#include "wrap_FrictionJoint.h" namespace love { @@ -56,6 +57,7 @@ namespace box2d int w_newPrismaticJoint(lua_State * L); int w_newPulleyJoint(lua_State * L); int w_newGearJoint(lua_State * L); + int w_newFrictionJoint(lua_State * L); extern "C" LOVE_EXPORT int luaopen_love_physics(lua_State * L); } // box2d diff --git a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp index 2981af5f2..bffd37a56 100644 --- a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp +++ b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp @@ -173,7 +173,6 @@ namespace box2d { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, - { "setCollideConnected", w_Joint_setCollideConnected }, { "getCollideConnected", w_Joint_getCollideConnected }, { "destroy", w_Joint_destroy }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_PulleyJoint.cpp b/src/modules/physics/box2d/wrap_PulleyJoint.cpp index aa68acda3..d6a4984fb 100644 --- a/src/modules/physics/box2d/wrap_PulleyJoint.cpp +++ b/src/modules/physics/box2d/wrap_PulleyJoint.cpp @@ -69,7 +69,6 @@ namespace box2d { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, - { "setCollideConnected", w_Joint_setCollideConnected }, { "getCollideConnected", w_Joint_getCollideConnected }, { "destroy", w_Joint_destroy }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp index 3e87b5b4e..d770e03a4 100644 --- a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp +++ b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp @@ -173,7 +173,6 @@ namespace box2d { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, - { "setCollideConnected", w_Joint_setCollideConnected }, { "getCollideConnected", w_Joint_getCollideConnected }, { "destroy", w_Joint_destroy }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_WeldJoint.cpp b/src/modules/physics/box2d/wrap_WeldJoint.cpp new file mode 100644 index 000000000..4d0cbc16a --- /dev/null +++ b/src/modules/physics/box2d/wrap_WeldJoint.cpp @@ -0,0 +1,52 @@ +/** +* 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. +**/ + +#include "wrap_WeldJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + WeldJoint * luax_checkweldjoint(lua_State * L, int idx) + { + return luax_checktype(L, idx, "WeldJoint", PHYSICS_WELD_JOINT_T); + } + + static const luaL_Reg functions[] = { + // 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 } + }; + + int luaopen_weldjoint(lua_State * L) + { + return luax_register_type(L, "WeldJoint", functions); + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/wrap_WeldJoint.h b/src/modules/physics/box2d/wrap_WeldJoint.h new file mode 100644 index 000000000..bf875e85c --- /dev/null +++ b/src/modules/physics/box2d/wrap_WeldJoint.h @@ -0,0 +1,42 @@ +/** +* 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_PHYSICS_BOX2D_WRAP_WELD_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H + +// LOVE +#include +#include "wrap_Joint.h" +#include "WeldJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + WeldJoint * luax_checkweldjoint(lua_State * L, int idx); + int luaopen_weldjoint(lua_State * L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H diff --git a/src/modules/physics/box2d/wrap_WheelJoint.cpp b/src/modules/physics/box2d/wrap_WheelJoint.cpp new file mode 100644 index 000000000..bffd37a56 --- /dev/null +++ b/src/modules/physics/box2d/wrap_WheelJoint.cpp @@ -0,0 +1,188 @@ +/** +* 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. +**/ + +#include "wrap_PrismaticJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + PrismaticJoint * luax_checkprismaticjoint(lua_State * L, int idx) + { + return luax_checktype(L, idx, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T); + } + + 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_enableMotor(lua_State * L) + { + PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->enableMotor(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); + lua_pushnumber(L, t->getMotorForce()); + return 1; + } + + int w_PrismaticJoint_enableLimit(lua_State * L) + { + PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->enableLimit(arg1); + return 0; + } + + int w_PrismaticJoint_isLimitEnabled(lua_State * L) + { + PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + luax_pushboolean(L, t->isLimitEnabled()); + return 1; + } + + int w_PrismaticJoint_setUpperLimit(lua_State * L) + { + PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + 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); + 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); + 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 }, + { "enableMotor", w_PrismaticJoint_enableMotor }, + { "isMotorEnabled", w_PrismaticJoint_isMotorEnabled }, + { "setMaxMotorForce", w_PrismaticJoint_setMaxMotorForce }, + { "setMotorSpeed", w_PrismaticJoint_setMotorSpeed }, + { "getMotorSpeed", w_PrismaticJoint_getMotorSpeed }, + { "getMotorForce", w_PrismaticJoint_getMotorForce }, + { "enableLimit", w_PrismaticJoint_enableLimit }, + { "isLimitEnabled", w_PrismaticJoint_isLimitEnabled }, + { "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 } + }; + + int luaopen_prismaticjoint(lua_State * L) + { + return luax_register_type(L, "PrismaticJoint", functions); + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/wrap_WheelJoint.h b/src/modules/physics/box2d/wrap_WheelJoint.h new file mode 100644 index 000000000..203edaea7 --- /dev/null +++ b/src/modules/physics/box2d/wrap_WheelJoint.h @@ -0,0 +1,58 @@ +/** +* 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_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H + +// LOVE +#include +#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_enableMotor(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_enableLimit(lua_State * L); + int w_PrismaticJoint_isLimitEnabled(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); + int luaopen_prismaticjoint(lua_State * L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H From 884b0bdccdf761585620d374c63ca6585b68d5e1 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 3 Sep 2011 16:15:16 -0400 Subject: [PATCH 160/384] Modernize and update Xcode project to handle love.graphics changes --- .../macosx/love.xcodeproj/project.pbxproj | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 5b0160cf3..33d4081e7 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 45; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ @@ -180,10 +180,13 @@ A96E254E13B9892100456DEA /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254313B9892100456DEA /* Thread.cpp */; }; A96E254F13B9892100456DEA /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254513B9892100456DEA /* threads.cpp */; }; A96E255113B9892100456DEA /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254A13B9892100456DEA /* wrap_Thread.cpp */; }; + A96F41921412BBEE0067FE9A /* Canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41901412BBEE0067FE9A /* Canvas.cpp */; }; + A96F41951412BBF80067FE9A /* PixelEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41931412BBF80067FE9A /* PixelEffect.cpp */; }; + A96F41981412BC000067FE9A /* VertexBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41961412BC000067FE9A /* VertexBuffer.cpp */; }; + A96F419B1412BC070067FE9A /* wrap_Canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41991412BC070067FE9A /* wrap_Canvas.cpp */; }; + A96F419E1412BC0E0067FE9A /* wrap_PixelEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F419C1412BC0E0067FE9A /* wrap_PixelEffect.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; A9B4BA9D1045937F001DBC80 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */; }; - A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9BD60701226C988007DEC63 /* Framebuffer.cpp */; }; - A9BD60751226C988007DEC63 /* wrap_Framebuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9BD60721226C988007DEC63 /* wrap_Framebuffer.cpp */; }; A9CF0E8610B9EB1000E6F37E /* utf8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9CF0E8510B9EB1000E6F37E /* utf8.cpp */; }; A9D307EA106635C3004FEDF8 /* physfs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; @@ -589,16 +592,22 @@ A96E254913B9892100456DEA /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; A96E254A13B9892100456DEA /* wrap_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Thread.cpp; sourceTree = ""; }; A96E254B13B9892100456DEA /* wrap_Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Thread.h; sourceTree = ""; }; + A96F41901412BBEE0067FE9A /* Canvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Canvas.cpp; sourceTree = ""; }; + A96F41911412BBEE0067FE9A /* Canvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Canvas.h; sourceTree = ""; }; + A96F41931412BBF80067FE9A /* PixelEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PixelEffect.cpp; sourceTree = ""; }; + A96F41941412BBF80067FE9A /* PixelEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PixelEffect.h; sourceTree = ""; }; + A96F41961412BC000067FE9A /* VertexBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VertexBuffer.cpp; sourceTree = ""; }; + A96F41971412BC000067FE9A /* VertexBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VertexBuffer.h; sourceTree = ""; }; + A96F41991412BC070067FE9A /* wrap_Canvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Canvas.cpp; sourceTree = ""; }; + A96F419A1412BC070067FE9A /* wrap_Canvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Canvas.h; sourceTree = ""; }; + A96F419C1412BC0E0067FE9A /* wrap_PixelEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PixelEffect.cpp; sourceTree = ""; }; + A96F419D1412BC0E0067FE9A /* wrap_PixelEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_PixelEffect.h; sourceTree = ""; }; A97E3842132A9EDE00198A2F /* love-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "love-Info.plist"; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; A9B4BA981045937F001DBC80 /* ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleSystem.h; sourceTree = ""; }; A9B4BA991045937F001DBC80 /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = ""; }; A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleSystem.cpp; sourceTree = ""; }; A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ParticleSystem.cpp; sourceTree = ""; }; - A9BD60701226C988007DEC63 /* Framebuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Framebuffer.cpp; sourceTree = ""; }; - A9BD60711226C988007DEC63 /* Framebuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Framebuffer.h; sourceTree = ""; }; - A9BD60721226C988007DEC63 /* wrap_Framebuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Framebuffer.cpp; sourceTree = ""; }; - A9BD60731226C988007DEC63 /* wrap_Framebuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Framebuffer.h; sourceTree = ""; }; A9CF0E8410B9EB1000E6F37E /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = ""; }; A9CF0E8510B9EB1000E6F37E /* utf8.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utf8.cpp; sourceTree = ""; }; A9D307E9106635C3004FEDF8 /* physfs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = physfs.framework; path = /Library/Frameworks/physfs.framework; sourceTree = ""; }; @@ -982,10 +991,10 @@ A93E6A8610420AC2007D418B /* opengl */ = { isa = PBXGroup; children = ( + A96F41901412BBEE0067FE9A /* Canvas.cpp */, + A96F41911412BBEE0067FE9A /* Canvas.h */, A93E6A8710420AC2007D418B /* Font.cpp */, A93E6A8810420AC2007D418B /* Font.h */, - A9BD60701226C988007DEC63 /* Framebuffer.cpp */, - A9BD60711226C988007DEC63 /* Framebuffer.h */, A93E6A8910420AC2007D418B /* GLee.c */, A93E6A8A10420AC2007D418B /* GLee.h */, A93E6A8D10420AC2007D418B /* Graphics.cpp */, @@ -994,20 +1003,26 @@ A93E6A9010420AC2007D418B /* Image.h */, A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */, A9B4BA981045937F001DBC80 /* ParticleSystem.h */, + A96F41931412BBF80067FE9A /* PixelEffect.cpp */, + A96F41941412BBF80067FE9A /* PixelEffect.h */, A93E6A9310420AC2007D418B /* Quad.cpp */, A93E6A9410420AC2007D418B /* Quad.h */, A93E6A9510420AC2007D418B /* SpriteBatch.cpp */, A93E6A9610420AC2007D418B /* SpriteBatch.h */, + A96F41961412BC000067FE9A /* VertexBuffer.cpp */, + A96F41971412BC000067FE9A /* VertexBuffer.h */, + A96F41991412BC070067FE9A /* wrap_Canvas.cpp */, + A96F419A1412BC070067FE9A /* wrap_Canvas.h */, A93E6A9910420AC2007D418B /* wrap_Font.cpp */, A93E6A9A10420AC2007D418B /* wrap_Font.h */, - A9BD60721226C988007DEC63 /* wrap_Framebuffer.cpp */, - A9BD60731226C988007DEC63 /* wrap_Framebuffer.h */, A93E6A9D10420AC3007D418B /* wrap_Graphics.cpp */, A93E6A9E10420AC3007D418B /* wrap_Graphics.h */, A93E6A9F10420AC3007D418B /* wrap_Image.cpp */, A93E6AA010420AC3007D418B /* wrap_Image.h */, A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */, A9B4BA991045937F001DBC80 /* wrap_ParticleSystem.h */, + A96F419C1412BC0E0067FE9A /* wrap_PixelEffect.cpp */, + A96F419D1412BC0E0067FE9A /* wrap_PixelEffect.h */, A93E6AA110420AC3007D418B /* wrap_Quad.cpp */, A93E6AA210420AC3007D418B /* wrap_Quad.h */, A93E6AA310420AC3007D418B /* wrap_SpriteBatch.cpp */, @@ -1475,8 +1490,11 @@ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 0410; + }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "love" */; - compatibilityVersion = "Xcode 3.1"; + compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( @@ -1667,13 +1685,16 @@ A968F0DE1083AA6600A895AA /* Joint.cpp in Sources */, A9CF0E8610B9EB1000E6F37E /* utf8.cpp in Sources */, A93A3AB51121E86E003B04A4 /* Image.cpp in Sources */, - A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */, - A9BD60751226C988007DEC63 /* wrap_Framebuffer.cpp in Sources */, A95684F7125D3555001B276B /* b64.cpp in Sources */, A96E253B13B9890300456DEA /* delay.cpp in Sources */, A96E254E13B9892100456DEA /* Thread.cpp in Sources */, A96E254F13B9892100456DEA /* threads.cpp in Sources */, A96E255113B9892100456DEA /* wrap_Thread.cpp in Sources */, + A96F41921412BBEE0067FE9A /* Canvas.cpp in Sources */, + A96F41951412BBF80067FE9A /* PixelEffect.cpp in Sources */, + A96F41981412BC000067FE9A /* VertexBuffer.cpp in Sources */, + A96F419B1412BC070067FE9A /* wrap_Canvas.cpp in Sources */, + A96F419E1412BC0E0067FE9A /* wrap_PixelEffect.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1690,7 +1711,6 @@ "\"$(SRCROOT)\"", ); GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -1730,6 +1750,7 @@ ); ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = love; + SDKROOT = ""; }; name = Release; }; @@ -1771,12 +1792,11 @@ ); INFOPLIST_FILE = "love-Info.plist"; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; + MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; - PREBINDING = YES; PRODUCT_NAME = love; - SDKROOT = ""; + SDKROOT = macosx; VALID_ARCHS = "i386 ppc"; WARNING_CFLAGS = ( "-W", @@ -1826,13 +1846,12 @@ INFOPLIST_FILE = "love-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; + MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ""; - PREBINDING = NO; PRODUCT_NAME = love; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; - SDKROOT = macosx10.5; + SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = ""; VALID_ARCHS = "i386 ppc"; WARNING_CFLAGS = ( From 77f2f856e1033a12ec0b977aee7bdf38e89b986c Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 3 Sep 2011 16:25:10 -0400 Subject: [PATCH 161/384] Reset OS X deployment target to 10.5, we're not abandoning Leopard or anything --- platform/macosx/love.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 33d4081e7..82403be1b 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -1792,7 +1792,7 @@ ); INFOPLIST_FILE = "love-Info.plist"; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.6; + MACOSX_DEPLOYMENT_TARGET = 10.5; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; PRODUCT_NAME = love; @@ -1846,7 +1846,7 @@ INFOPLIST_FILE = "love-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.6; + MACOSX_DEPLOYMENT_TARGET = 10.5; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ""; PRODUCT_NAME = love; From 551cf591e250672b20dadaacc1c20ea928fbc0a0 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 3 Sep 2011 16:34:36 -0400 Subject: [PATCH 162/384] Add new Shape types to the Shape StringMap --HG-- branch : box2d-update --- src/modules/physics/Shape.cpp | 2 ++ src/modules/physics/Shape.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/modules/physics/Shape.cpp b/src/modules/physics/Shape.cpp index cf367e86e..dda9900f1 100644 --- a/src/modules/physics/Shape.cpp +++ b/src/modules/physics/Shape.cpp @@ -42,6 +42,8 @@ namespace physics { {"circle", Shape::SHAPE_CIRCLE}, {"polygon", Shape::SHAPE_POLYGON}, + {"edge", Shape::SHAPE_EDGE}, + {"chain", Shape::SHAPE_CHAIN}, }; StringMap Shape::types(Shape::typeEntries, sizeof(Shape::typeEntries)); diff --git a/src/modules/physics/Shape.h b/src/modules/physics/Shape.h index 84fed6776..e90b8d770 100644 --- a/src/modules/physics/Shape.h +++ b/src/modules/physics/Shape.h @@ -38,6 +38,8 @@ namespace physics SHAPE_INVALID, SHAPE_CIRCLE, SHAPE_POLYGON, + SHAPE_EDGE, + SHAPE_CHAIN, SHAPE_MAX_ENUM }; From 7ec64bf912a41e4b3858f16d894a049d42000717 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 4 Sep 2011 13:21:57 -0400 Subject: [PATCH 163/384] Add basic EdgeShape (todo: all edge-related functionality) and further integrated the new Joints --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 12 ++ src/modules/physics/box2d/CircleShape.cpp | 5 +- src/modules/physics/box2d/EdgeShape.cpp | 44 +++++ src/modules/physics/box2d/EdgeShape.h | 54 ++++++ src/modules/physics/box2d/Physics.cpp | 39 ++-- src/modules/physics/box2d/Physics.h | 43 +++-- src/modules/physics/box2d/Shape.cpp | 4 + src/modules/physics/box2d/wrap_EdgeShape.cpp | 48 +++++ src/modules/physics/box2d/wrap_EdgeShape.h | 42 +++++ src/modules/physics/box2d/wrap_Physics.cpp | 33 +++- src/modules/physics/box2d/wrap_Physics.h | 7 +- src/modules/physics/box2d/wrap_WheelJoint.cpp | 168 ++++++++---------- src/modules/physics/box2d/wrap_WheelJoint.h | 41 ++--- 13 files changed, 384 insertions(+), 156 deletions(-) create mode 100644 src/modules/physics/box2d/EdgeShape.cpp create mode 100644 src/modules/physics/box2d/EdgeShape.h create mode 100644 src/modules/physics/box2d/wrap_EdgeShape.cpp create mode 100644 src/modules/physics/box2d/wrap_EdgeShape.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 77cba2653..0b351b637 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -163,6 +163,8 @@ A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41841412AFEB0067FE9A /* WeldJoint.cpp */; }; A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */; }; A96F418C1412B3AD0067FE9A /* WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F418A1412B3A30067FE9A /* WheelJoint.cpp */; }; + A96F41A41412C91F0067FE9A /* EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41A21412C91E0067FE9A /* EdgeShape.cpp */; }; + A96F41A71412C92B0067FE9A /* wrap_EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */; }; A986DEB5113249A800810279 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB1113249A800810279 /* Thread.cpp */; }; A986DEB6113249A800810279 /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB3113249A800810279 /* wrap_Thread.cpp */; }; A986EC64132CE6DB00F048C8 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */; }; @@ -571,6 +573,10 @@ A96F41881412B3610067FE9A /* wrap_WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WheelJoint.h; sourceTree = ""; }; A96F418A1412B3A30067FE9A /* WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WheelJoint.cpp; sourceTree = ""; }; A96F418B1412B3A80067FE9A /* WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelJoint.h; sourceTree = ""; }; + A96F41A21412C91E0067FE9A /* EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EdgeShape.cpp; sourceTree = ""; }; + A96F41A31412C91E0067FE9A /* EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdgeShape.h; sourceTree = ""; }; + A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_EdgeShape.cpp; sourceTree = ""; }; + A96F41A61412C92B0067FE9A /* wrap_EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_EdgeShape.h; sourceTree = ""; }; A97E3842132A9EDE00198A2F /* love-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "love-Info.plist"; sourceTree = ""; }; A986DEB1113249A800810279 /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Thread.cpp; sourceTree = ""; }; A986DEB2113249A800810279 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; @@ -1195,6 +1201,8 @@ A93E6AF010420AC7007D418B /* Contact.h */, A93E6AF110420AC7007D418B /* DistanceJoint.cpp */, A93E6AF210420AC7007D418B /* DistanceJoint.h */, + A96F41A21412C91E0067FE9A /* EdgeShape.cpp */, + A96F41A31412C91E0067FE9A /* EdgeShape.h */, A986ECAD132CEB9300F048C8 /* Fixture.cpp */, A986ECAE132CEB9B00F048C8 /* Fixture.h */, A9B6432A13BF833900DC3C7E /* FrictionJoint.cpp */, @@ -1232,6 +1240,8 @@ A93E6B5510420ACA007D418B /* wrap_Contact.h */, A93E6B5610420ACA007D418B /* wrap_DistanceJoint.cpp */, A93E6B5710420ACA007D418B /* wrap_DistanceJoint.h */, + A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */, + A96F41A61412C92B0067FE9A /* wrap_EdgeShape.h */, A9B6432D13BF87E400DC3C7E /* wrap_FrictionJoint.cpp */, A9B6432E13BF87EA00DC3C7E /* wrap_FrictionJoint.h */, A93E6B5810420ACA007D418B /* wrap_GearJoint.cpp */, @@ -1786,6 +1796,8 @@ A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */, A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */, A96F418C1412B3AD0067FE9A /* WheelJoint.cpp in Sources */, + A96F41A41412C91F0067FE9A /* EdgeShape.cpp in Sources */, + A96F41A71412C92B0067FE9A /* wrap_EdgeShape.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index 3fa88e1d0..d8b619799 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -44,10 +44,7 @@ namespace box2d { return shape->m_radius; } - - /** - * Gets the radius for the circle. - **/ + void CircleShape::setRadius(float r) { shape->m_radius = r; diff --git a/src/modules/physics/box2d/EdgeShape.cpp b/src/modules/physics/box2d/EdgeShape.cpp new file mode 100644 index 000000000..196ea9940 --- /dev/null +++ b/src/modules/physics/box2d/EdgeShape.cpp @@ -0,0 +1,44 @@ +/** +* 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. +**/ + +#include "EdgeShape.h" + +// Module +#include "Body.h" +#include "World.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + EdgeShape::EdgeShape(b2EdgeShape * e) + { + shape = e; + } + + EdgeShape::~EdgeShape() + { + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/EdgeShape.h b/src/modules/physics/box2d/EdgeShape.h new file mode 100644 index 000000000..67569b51b --- /dev/null +++ b/src/modules/physics/box2d/EdgeShape.h @@ -0,0 +1,54 @@ +/** +* 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_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); + + virtual ~EdgeShape(); + }; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_EDGE_SHAPE_H diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 40fd67f12..20a584021 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -62,30 +62,27 @@ namespace box2d return new Body(world, b2Vec2(0, 0), 1, 1); } - CircleShape * Physics::newCircleShape(Body * body, float radius) + CircleShape * Physics::newCircleShape(float radius) { - return newCircleShape(body, 0, 0, radius); + return newCircleShape(0, 0, radius); } - CircleShape * Physics::newCircleShape(Body * body, float x, float y, float radius) + CircleShape * Physics::newCircleShape(float x, float y, float radius) { - b2CircleDef def; - def.density = 1.0f; - def.localPosition.Set(x, y); - def.friction = 0.5f; - def.restitution = 0.1f; - def.radius = radius; - return new CircleShape(body, &def); + b2CircleShape s; + s.m_p = b2Vec2(x, y); + s.m_radius = radius; + return new CircleShape(&s); } PolygonShape * Physics::newRectangleShape(float w, float h) { - return newRectangleShape(body, 0, 0, w, h, 0); + return newRectangleShape(0, 0, w, h, 0); } PolygonShape * Physics::newRectangleShape(float x, float y, float w, float h) { - return newRectangleShape(body, x, y, w, h, 0); + return newRectangleShape(x, y, w, h, 0); } PolygonShape * Physics::newRectangleShape(float x, float y, float w, float h, float angle) @@ -95,11 +92,11 @@ namespace box2d return new PolygonShape(&s); } - PolygonShape * Physics::newEdgeShape(float x1, float y1, float x2, float y2) + EdgeShape * Physics::newEdgeShape(float x1, float y1, float x2, float y2) { - b2PolygonShape s; - s.SetAsEdge(b2vec2(x1, y1), b2vec2(x2, y2)); - return new PolygonShape(&s); + b2EdgeShape s; + s.Set(b2Vec2(x1, y1), b2Vec2(x2, y2)); + return new EdgeShape(&s); } int Physics::newPolygonShape(lua_State * L) @@ -181,6 +178,16 @@ namespace box2d { return new FrictionJoint(body1, body2, x, y); } + + WeldJoint * Physics::newWeldJoint(Body * body1, Body * body2, float x, float y) + { + return new WeldJoint(body1, body2, x, y); + } + + WheelJoint * Physics::newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay) + { + return new WheelJoint(body1, body2, x, y, ax, ay); + } } // box2d } // physics diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 6f631cd97..9e78e14de 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -29,6 +29,7 @@ #include "Shape.h" #include "CircleShape.h" #include "PolygonShape.h" +#include "EdgeShape.h" #include "Joint.h" #include "MouseJoint.h" #include "DistanceJoint.h" @@ -37,6 +38,8 @@ #include "PulleyJoint.h" #include "GearJoint.h" #include "FrictionJoint.h" +#include "WeldJoint.h" +#include "WheelJoint.h" namespace love { @@ -89,15 +92,13 @@ namespace box2d Body * newBody(World * world); /** - * Creates a new CircleShape at the Body origin. - * @param body The Body to create the Shape on. + * 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 coorinates. - * @param body The Body to create the Shape on. + * 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. @@ -134,19 +135,17 @@ namespace box2d PolygonShape * newRectangleShape(float x, float y, float w, float h, float angle); /** - * Shorthand for creating edge PolygonShapes. The edge - * 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 * newEdgeShape(float x1, float y1, float x2, float y2); + * 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. - * @param body The body to create this shape on. * @param ... A variable number of vertices. **/ int newPolygonShape(lua_State * L); @@ -207,6 +206,22 @@ namespace box2d * @param y Anchor along the y-axis. (World coordinates) **/ FrictionJoint * newFrictionJoint(Body * body1, Body * body2, float x, float y); + + /** + * Creates a new WeldJoint connecting body1 with body2. + * @param x Anchor along the x-axis. (World coordinates) + * @param y Anchor along the y-axis. (World coordinates) + **/ + WeldJoint * newWeldJoint(Body * body1, Body * body2, float x, float y); + + /** + * Creates a new WheelJoint connecting body1 with body2. + * @param x Anchor along the x-axis. (World coordinates) + * @param y Anchor along the y-axis. (World coordinates) + * @param ax The x-component of the world-axis. + * @param ay The y-component of the world-axis. + **/ + WheelJoint * newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay); }; // Physics diff --git a/src/modules/physics/box2d/Shape.cpp b/src/modules/physics/box2d/Shape.cpp index c3d30854c..e5ab9f7c7 100644 --- a/src/modules/physics/box2d/Shape.cpp +++ b/src/modules/physics/box2d/Shape.cpp @@ -51,6 +51,10 @@ namespace box2d 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; } diff --git a/src/modules/physics/box2d/wrap_EdgeShape.cpp b/src/modules/physics/box2d/wrap_EdgeShape.cpp new file mode 100644 index 000000000..be64c4feb --- /dev/null +++ b/src/modules/physics/box2d/wrap_EdgeShape.cpp @@ -0,0 +1,48 @@ +/** +* 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. +**/ + +#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); + } + + static const luaL_Reg functions[] = { + // From Shape. + { "getType", w_Shape_getType }, + { "destroy", w_Shape_destroy }, + { 0, 0 } + }; + + int luaopen_edgeshape(lua_State * L) + { + return luax_register_type(L, "EdgeShape", functions); + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/wrap_EdgeShape.h b/src/modules/physics/box2d/wrap_EdgeShape.h new file mode 100644 index 000000000..4b9cba3b4 --- /dev/null +++ b/src/modules/physics/box2d/wrap_EdgeShape.h @@ -0,0 +1,42 @@ +/** +* 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_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H +#define LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H + +// LOVE +#include +#include "wrap_Shape.h" +#include "EdgeShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + EdgeShape * luax_checkedgeshape(lua_State * L, int idx); + int luaopen_edgeshape(lua_State * L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 434b4fa61..78508fe3c 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -118,8 +118,8 @@ namespace box2d float y1 = (float)luaL_checknumber(L, 2); float x2 = (float)luaL_checknumber(L, 3); float y2 = (float)luaL_checknumber(L, 4); - PolygonShape * shape = instance->newEdgeShape(x1, y1, x2, y2); - luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); + EdgeShape * shape = instance->newEdgeShape(x1, y1, x2, y2); + luax_newtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, (void*)shape); return 1; } @@ -215,6 +215,30 @@ namespace box2d luax_newtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, (void*)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 x = (float)luaL_checknumber(L, 3); + float y = (float)luaL_checknumber(L, 4); + WeldJoint * j = instance->newWeldJoint(body1, body2, x, y); + luax_newtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, (void*)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 x = (float)luaL_checknumber(L, 3); + float y = (float)luaL_checknumber(L, 4); + float ax = (float)luaL_checknumber(L, 5); + float ay = (float)luaL_checknumber(L, 6); + WheelJoint * j = instance->newWheelJoint(body1, body2, x, y, ax, ay); + luax_newtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, (void*)j); + return 1; + } // List of functions to wrap. static const luaL_Reg functions[] = { @@ -223,6 +247,7 @@ namespace box2d { "newCircleShape", w_newCircleShape }, { "newRectangleShape", w_newRectangleShape }, { "newPolygonShape", w_newPolygonShape }, + { "newEdgeShape", w_newEdgeShape }, { "newDistanceJoint", w_newDistanceJoint }, { "newMouseJoint", w_newMouseJoint }, { "newRevoluteJoint", w_newRevoluteJoint }, @@ -230,6 +255,8 @@ namespace box2d { "newPulleyJoint", w_newPulleyJoint }, { "newGearJoint", w_newGearJoint }, { "newFrictionJoint", w_newFrictionJoint }, + { "newWeldJoint", w_newWeldJoint }, + { "newWheelJoint", w_newWheelJoint }, { 0, 0 }, }; @@ -240,6 +267,7 @@ namespace box2d luaopen_shape, luaopen_circleshape, luaopen_polygonshape, + luaopen_edgeshape, luaopen_joint, luaopen_mousejoint, luaopen_distancejoint, @@ -248,6 +276,7 @@ namespace box2d luaopen_pulleyjoint, luaopen_gearjoint, luaopen_frictionjoint, + luaopen_weldjoint, 0 }; diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index bdf1bfee3..fb715d32b 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -30,6 +30,7 @@ #include "wrap_Shape.h" #include "wrap_CircleShape.h" #include "wrap_PolygonShape.h" +#include "wrap_EdgeShape.h" #include "wrap_Joint.h" #include "wrap_MouseJoint.h" #include "wrap_DistanceJoint.h" @@ -38,6 +39,8 @@ #include "wrap_PulleyJoint.h" #include "wrap_GearJoint.h" #include "wrap_FrictionJoint.h" +#include "wrap_WeldJoint.h" +#include "wrap_WheelJoint.h" namespace love { @@ -49,8 +52,8 @@ namespace box2d int w_newBody(lua_State * L); int w_newCircleShape(lua_State * L); int w_newRectangleShape(lua_State * L); - int w_newEdgeShape(lua_State * L); int w_newPolygonShape(lua_State * L); + int w_newEdgeShape(lua_State * L); int w_newDistanceJoint(lua_State * L); int w_newMouseJoint(lua_State * L); int w_newRevoluteJoint(lua_State * L); @@ -58,6 +61,8 @@ namespace box2d 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); extern "C" LOVE_EXPORT int luaopen_love_physics(lua_State * L); } // box2d diff --git a/src/modules/physics/box2d/wrap_WheelJoint.cpp b/src/modules/physics/box2d/wrap_WheelJoint.cpp index bffd37a56..abd4561ba 100644 --- a/src/modules/physics/box2d/wrap_WheelJoint.cpp +++ b/src/modules/physics/box2d/wrap_WheelJoint.cpp @@ -18,7 +18,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#include "wrap_PrismaticJoint.h" +#include "wrap_WheelJoint.h" namespace love { @@ -26,148 +26,122 @@ namespace physics { namespace box2d { - PrismaticJoint * luax_checkprismaticjoint(lua_State * L, int idx) + WheelJoint * luax_checkwheeljoint(lua_State * L, int idx) { - return luax_checktype(L, idx, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T); + return luax_checktype(L, idx, "WheelJoint", PHYSICS_WHEEL_JOINT_T); } - int w_PrismaticJoint_getJointTranslation(lua_State * L) + int w_WheelJoint_getJointTranslation(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + WheelJoint * t = luax_checkwheeljoint(L, 1); lua_pushnumber(L, t->getJointTranslation()); return 1; } - int w_PrismaticJoint_getJointSpeed(lua_State * L) + int w_WheelJoint_getJointSpeed(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + WheelJoint * t = luax_checkwheeljoint(L, 1); lua_pushnumber(L, t->getJointSpeed()); return 1; } - int w_PrismaticJoint_enableMotor(lua_State * L) + int w_WheelJoint_enableMotor(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + WheelJoint * t = luax_checkwheeljoint(L, 1); bool arg1 = luax_toboolean(L, 2); t->enableMotor(arg1); return 0; } - int w_PrismaticJoint_isMotorEnabled(lua_State * L) + int w_WheelJoint_isMotorEnabled(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + WheelJoint * t = luax_checkwheeljoint(L, 1); luax_pushboolean(L, t->isMotorEnabled()); return 1; } - int w_PrismaticJoint_setMaxMotorForce(lua_State * L) + int w_WheelJoint_setMotorSpeed(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); + WheelJoint * t = luax_checkwheeljoint(L, 1); float arg1 = (float)luaL_checknumber(L, 2); t->setMotorSpeed(arg1); return 0; } - int w_PrismaticJoint_getMotorSpeed(lua_State * L) + int w_WheelJoint_getMotorSpeed(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + WheelJoint * t = luax_checkwheeljoint(L, 1); lua_pushnumber(L, t->getMotorSpeed()); return 1; } - - int w_PrismaticJoint_getMotorForce(lua_State * L) + + int w_WheelJoint_setMaxMotorTorque(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - lua_pushnumber(L, t->getMotorForce()); - return 1; - } - - int w_PrismaticJoint_enableLimit(lua_State * L) - { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - bool arg1 = luax_toboolean(L, 2); - t->enableLimit(arg1); - return 0; - } - - int w_PrismaticJoint_isLimitEnabled(lua_State * L) - { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - luax_pushboolean(L, t->isLimitEnabled()); - return 1; - } - - int w_PrismaticJoint_setUpperLimit(lua_State * L) - { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); + WheelJoint * t = luax_checkwheeljoint(L, 1); float arg1 = (float)luaL_checknumber(L, 2); - t->setUpperLimit(arg1); + t->setMaxMotorTorque(arg1); return 0; } - - int w_PrismaticJoint_setLowerLimit(lua_State * L) + + int w_WheelJoint_getMaxMotorTorque(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - float arg1 = (float)luaL_checknumber(L, 2); - 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); - t->setLimits(arg1, arg2); - return 0; - } - - int w_PrismaticJoint_getLowerLimit(lua_State * L) - { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - lua_pushnumber(L, t->getLowerLimit()); + WheelJoint * t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getMaxMotorTorque()); return 1; } - - int w_PrismaticJoint_getUpperLimit(lua_State * L) + + int w_WheelJoint_getMotorTorque(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - lua_pushnumber(L, t->getUpperLimit()); + 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_PrismaticJoint_getLimits(lua_State * L) + + int w_WheelJoint_setSpringFrequencyHz(lua_State * L) { - PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - lua_remove(L, 1); - return t->getLimits(L); + WheelJoint * t = luax_checkwheeljoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setSpringFrequencyHz(arg1); + return 0; + } + + int w_WheelJoint_getSpringFrequencyHz(lua_State * L) + { + WheelJoint * t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getSpringFrequencyHz()); + 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_PrismaticJoint_getJointTranslation }, - { "getJointSpeed", w_PrismaticJoint_getJointSpeed }, - { "enableMotor", w_PrismaticJoint_enableMotor }, - { "isMotorEnabled", w_PrismaticJoint_isMotorEnabled }, - { "setMaxMotorForce", w_PrismaticJoint_setMaxMotorForce }, - { "setMotorSpeed", w_PrismaticJoint_setMotorSpeed }, - { "getMotorSpeed", w_PrismaticJoint_getMotorSpeed }, - { "getMotorForce", w_PrismaticJoint_getMotorForce }, - { "enableLimit", w_PrismaticJoint_enableLimit }, - { "isLimitEnabled", w_PrismaticJoint_isLimitEnabled }, - { "setUpperLimit", w_PrismaticJoint_setUpperLimit }, - { "setLowerLimit", w_PrismaticJoint_setLowerLimit }, - { "setLimits", w_PrismaticJoint_setLimits }, - { "getLowerLimit", w_PrismaticJoint_getLowerLimit }, - { "getUpperLimit", w_PrismaticJoint_getUpperLimit }, - { "getLimits", w_PrismaticJoint_getLimits }, + { "getJointTranslation", w_WheelJoint_getJointTranslation }, + { "getJointSpeed", w_WheelJoint_getJointSpeed }, + { "enableMotor", w_WheelJoint_enableMotor }, + { "isMotorEnabled", w_WheelJoint_isMotorEnabled }, + { "setMotorSpeed", w_WheelJoint_setMotorSpeed }, + { "getMotorSpeed", w_WheelJoint_getMotorSpeed }, + { "setMaxMotorTorque", w_WheelJoint_setMaxMotorTorque }, + { "getMaxMotorTorque", w_WheelJoint_getMaxMotorTorque }, + { "getMotorTorque", w_WheelJoint_getMotorTorque }, + { "setSpringFrequencyHz", w_WheelJoint_setSpringFrequencyHz }, + { "getSpringFrequencyHz", w_WheelJoint_getSpringFrequencyHz }, + { "setSpringDampingRatio", w_WheelJoint_setSpringDampingRatio }, + { "getSpringDampingRatio", w_WheelJoint_getSpringDampingRatio }, // From Joint. { "getType", w_Joint_getType }, { "getAnchors", w_Joint_getAnchors }, @@ -178,9 +152,9 @@ namespace box2d { 0, 0 } }; - int luaopen_prismaticjoint(lua_State * L) + int luaopen_wheeljoint(lua_State * L) { - return luax_register_type(L, "PrismaticJoint", functions); + return luax_register_type(L, "WheelJoint", functions); } } // box2d diff --git a/src/modules/physics/box2d/wrap_WheelJoint.h b/src/modules/physics/box2d/wrap_WheelJoint.h index 203edaea7..b31a5be87 100644 --- a/src/modules/physics/box2d/wrap_WheelJoint.h +++ b/src/modules/physics/box2d/wrap_WheelJoint.h @@ -18,13 +18,13 @@ * 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 +#ifndef LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H // LOVE #include #include "wrap_Joint.h" -#include "PrismaticJoint.h" +#include "WheelJoint.h" namespace love { @@ -32,27 +32,24 @@ 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_enableMotor(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_enableLimit(lua_State * L); - int w_PrismaticJoint_isLimitEnabled(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); - int luaopen_prismaticjoint(lua_State * L); + 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_enableMotor(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_setSpringFrequencyHz(lua_State * L); + int w_WheelJoint_getSpringFrequencyHz(lua_State * L); + int w_WheelJoint_setSpringDampingRatio(lua_State * L); + int w_WheelJoint_getSpringDampingRatio(lua_State * L); + int luaopen_wheeljoint(lua_State * L); } // box2d } // physics } // love -#endif // LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H +#endif // LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H From 31f290f062f6d24041b24e7918213f3abd06769d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 5 Sep 2011 19:22:08 +0200 Subject: [PATCH 164/384] Update changelog according to (Anonymous user)'s Guide To A Better Love Changelog for 0.8.0. --- changes.txt | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/changes.txt b/changes.txt index 242c7b9c6..e501e5300 100644 --- a/changes.txt +++ b/changes.txt @@ -9,7 +9,7 @@ LOVE 0.8.0 [Rubber Piggy] * 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 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. @@ -22,14 +22,15 @@ LOVE 0.8.0 [Rubber Piggy] * 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 Thread:getKeys. + * Added option of fractions for Quads. + * Added PNG, JPEG and GIF support to ImageData:encode. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. * Fixed tracebacks not showing filenames. * Fixed love.graphics.push/pop capable of causing overflows/underflows. - * Fixed setScissor on framebuffers. + * 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. @@ -37,7 +38,7 @@ LOVE 0.8.0 [Rubber Piggy] * 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 SpriteBatch support on Intel cards. * Fixed love.filesystem.lines() leaking. * Fixed Source controls inconsistencies. * Fixed most leaking on unclosed File objects. @@ -47,19 +48,20 @@ LOVE 0.8.0 [Rubber Piggy] * Fixed ordering of loaders, love should have priority over lua. * Renamed SpriteBatch's lock/unlock to bind/unbind. - * Renamed Framebuffer to Canvas - - * Updated love.joystick to be 1-indexed. - * Updated love.thread to use get/set instead of send/receive. - * Updated font engine. - * Updated line drawing to a custom system. - * Updated love.timer.sleep to use seconds, like the rest of love. - * Updated love.graphics.circle to have max(10, r) as default for segments. + * Renamed Framebuffer to Canvas. + * Renamed love.thread.get/set to send/receive. * Removed canvas auto-clearing. * Removed EncodedImageData. * Removed old syntax for require (with extension). + * Updated love.joystick to be 1-indexed. + * Updated font engine. + * Updated line drawing to a custom system. + * Updated love.timer.sleep to use seconds, like the rest of love. + * Updated love.graphics.circle to have max(10, r) as default for segments. + * Updated ImageData:encode to write to files directly. + LOVE 0.7.2 [Game Slave] ----------------------- From 78389d2e695b4027f683c210746f0d6db1bd48a6 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 5 Sep 2011 19:26:20 +0200 Subject: [PATCH 165/384] Oops, reversed that. --- changes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changes.txt b/changes.txt index e501e5300..92061937a 100644 --- a/changes.txt +++ b/changes.txt @@ -49,7 +49,7 @@ LOVE 0.8.0 [Rubber Piggy] * Renamed SpriteBatch's lock/unlock to bind/unbind. * Renamed Framebuffer to Canvas. - * Renamed love.thread.get/set to send/receive. + * Renamed love.thread.send/receive to set/get. * Removed canvas auto-clearing. * Removed EncodedImageData. From d5dce6284ff0b115fe70fde3ffd8da3f89806907 Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 7 Sep 2011 13:42:51 +0200 Subject: [PATCH 166/384] Fix issue #294: Canvas not working when not rendering to default render target. --- src/modules/graphics/opengl/Canvas.h | 21 +++++++++++++++++++ src/modules/graphics/opengl/wrap_Graphics.cpp | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index dd69140e7..ae07ce9c7 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -49,6 +49,27 @@ namespace opengl bool loadVolatile(); void unloadVolatile(); + /// Unbind the current canvas on construction and rebind it upon destruction. + // Exception safe temporary unbinding/rebinding for techniques that require + // the default canvas to work (e.g. stencils). + // XXX: If a canvas is switched between creating and destroying an unbinder + // object, the canvas will not be switched back. + struct TemporaryUnbinder + { + Canvas * canvas; + inline TemporaryUnbinder() : canvas(Canvas::current) + { + if (NULL != canvas) + Canvas::bindDefaultCanvas(); + } + + inline ~TemporaryUnbinder() + { + if (NULL != canvas && NULL == Canvas::current) + canvas->startGrab(); + } + }; + private: friend class PixelEffect; GLuint getTextureName() const { return img; } diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 0de2d5e10..6faaefb53 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -24,6 +24,7 @@ #include #include +#include namespace love { @@ -168,6 +169,9 @@ namespace opengl static int setStencil(lua_State * L, bool invert) { + // stencils require the default fb to work properly + Canvas::TemporaryUnbinder unbinder; + // no argument -> clear mask if (lua_isnoneornil(L, 1)) { instance->discardStencil(); From 2eb9ee20d5cb954810bddbc5e7379f4f51805a0f Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 7 Sep 2011 13:52:07 +0200 Subject: [PATCH 167/384] Fix issue #291: Usage of unsanitized GLSL compiler errors. Compiler errors may contain vsprintf-escape sequences, which is used by love::Exception. Wrap errors in %s to avoid garbage output. --- src/modules/graphics/opengl/PixelEffect.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/modules/graphics/opengl/PixelEffect.cpp b/src/modules/graphics/opengl/PixelEffect.cpp index 2737d3c2b..1c9dc684f 100644 --- a/src/modules/graphics/opengl/PixelEffect.cpp +++ b/src/modules/graphics/opengl/PixelEffect.cpp @@ -80,15 +80,15 @@ namespace opengl glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &strlen); char *error_str = new char[strlen]; glGetShaderInfoLog(shader, strlen, NULL, error_str); - - std::stringstream error_message; - error_message << "Cannot compile shader:" << std::endl << std::string(error_str); + std::string tmp(error_str); // cleanup before throw delete[] error_str; glDeleteShader(shader); glDeleteProgram(_program); - throw love::Exception(error_message.str().c_str()); + + // XXX: errorlog may contain escape sequences. + throw love::Exception("Cannot compile shader:\n%s", tmp.c_str()); } // link fragment shader @@ -99,13 +99,12 @@ namespace opengl if (GL_FALSE == link_ok) { // this should not happen if compiling is ok, but one can never be too careful // get linker error - std::stringstream error_message; - error_message << "Cannot compile shader:" << std::endl << getWarnings(); + std::string tmp(getWarnings()); // cleanup before throw glDeleteShader(shader); glDeleteProgram(_program); - throw love::Exception(error_message.str().c_str()); + throw love::Exception("Cannot compile shader:\n%s", tmp.c_str()); } glDeleteShader(shader); From eec02505451d70072dfbab683d67d40bea8488fc Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 7 Sep 2011 23:32:54 +0200 Subject: [PATCH 168/384] Fix issue #292: Can't send arrays to pixeleffects. Arrays of numbers, vectors and matrices are supported. --- src/modules/graphics/opengl/PixelEffect.cpp | 31 ++-- src/modules/graphics/opengl/PixelEffect.h | 4 +- .../graphics/opengl/wrap_PixelEffect.cpp | 136 ++++++++++++++---- src/scripts/graphics.lua | 29 ++-- src/scripts/graphics.lua.h | 48 ++++--- 5 files changed, 177 insertions(+), 71 deletions(-) diff --git a/src/modules/graphics/opengl/PixelEffect.cpp b/src/modules/graphics/opengl/PixelEffect.cpp index 1c9dc684f..d155ee653 100644 --- a/src/modules/graphics/opengl/PixelEffect.cpp +++ b/src/modules/graphics/opengl/PixelEffect.cpp @@ -2,7 +2,6 @@ #include "GLee.h" #include #include -#include namespace { @@ -148,28 +147,28 @@ namespace opengl glUseProgram(0); } - void PixelEffect::sendFloat(const std::string& name, int count, const GLfloat* vec) + void PixelEffect::sendFloat(const std::string& name, int size, const GLfloat* vec, int count) { TemporaryAttacher attacher(this); GLint location = getUniformLocation(name); - if (count < 1 || count > 4) { - throw love::Exception("Invalid variable count: %d (expected 1-4).", count); + if (size < 1 || size > 4) { + throw love::Exception("Invalid variable size: %d (expected 1-4).", size); } - switch (count) { + switch (size) { case 4: - glUniform4fv(location, 1, vec); + glUniform4fv(location, count, vec); break; case 3: - glUniform3fv(location, 1, vec); + glUniform3fv(location, count, vec); break; case 2: - glUniform2fv(location, 1, vec); + glUniform2fv(location, count, vec); break; case 1: default: - glUniform1fv(location, 1, vec); + glUniform1fv(location, count, vec); break; } @@ -177,7 +176,7 @@ namespace opengl checkSetUniformError(); } - void PixelEffect::sendMatrix(const std::string& name, int size, const GLfloat* m) + void PixelEffect::sendMatrix(const std::string& name, int size, const GLfloat* m, int count) { TemporaryAttacher attacher(this); GLint location = getUniformLocation(name); @@ -189,14 +188,14 @@ namespace opengl switch (size) { case 4: - glUniformMatrix4fv(location, 1, GL_FALSE, m); + glUniformMatrix4fv(location, count, GL_FALSE, m); break; case 3: - glUniformMatrix3fv(location, 1, GL_FALSE, m); + glUniformMatrix3fv(location, count, GL_FALSE, m); break; case 2: default: - glUniformMatrix2fv(location, 1, GL_FALSE, m); + glUniformMatrix2fv(location, count, GL_FALSE, m); break; } @@ -257,9 +256,9 @@ namespace opengl if (GL_INVALID_OPERATION == error_code) { throw love::Exception( "Invalid operation:\n" - "Trying to send more than one value to a float variable, or" - "Size of shader variable does not match indicated size, or" - "Invalid variable name."); + "- Trying to send the wrong value type to shader variable, or\n" + "- Trying to send array values with wrong dimension, or\n" + "- Invalid variable name."); } } } // opengl diff --git a/src/modules/graphics/opengl/PixelEffect.h b/src/modules/graphics/opengl/PixelEffect.h index db439db4c..47927b627 100644 --- a/src/modules/graphics/opengl/PixelEffect.h +++ b/src/modules/graphics/opengl/PixelEffect.h @@ -28,8 +28,8 @@ namespace opengl static void detach(); static bool isSupported(); - void sendFloat(const std::string& name, int count, const GLfloat* vec); - void sendMatrix(const std::string& name, int size, const GLfloat* m); + void sendFloat(const std::string& name, int size, const GLfloat* vec, int count); + void sendMatrix(const std::string& name, int size, const GLfloat* m, int count); void sendImage(const std::string& name, const Image& image); void sendCanvas(const std::string& name, const Canvas& canvas); diff --git a/src/modules/graphics/opengl/wrap_PixelEffect.cpp b/src/modules/graphics/opengl/wrap_PixelEffect.cpp index 9e7e9d909..fa02aa6bf 100644 --- a/src/modules/graphics/opengl/wrap_PixelEffect.cpp +++ b/src/modules/graphics/opengl/wrap_PixelEffect.cpp @@ -2,6 +2,8 @@ #include "wrap_Image.h" #include "wrap_Canvas.h" #include +#include +using namespace std; namespace love { @@ -21,48 +23,128 @@ namespace opengl return 1; } - int w_PixelEffect_sendFloat(lua_State * L) + static int _sendScalars(lua_State * L, PixelEffect * effect, const char * name, int count) { - size_t count = lua_gettop(L) - 2; - PixelEffect * effect = luax_checkpixeleffect(L, 1); - const char* name = luaL_checkstring(L, 2); - - if (count < 1 || count > 4) - return luaL_error(L, "Invalid variable count (expected 1-4, got %d).", count); - - float values[4] = {0,0,0,0}; - for (unsigned int i = 0; i < count; ++i) - values[i] = (float) luaL_checknumber(L, i+1 + 2); - - try { - effect->sendFloat(name, count, values); - } catch(love::Exception& e) { - luaL_error(L, e.what()); + float * values = new float[count]; + for (int i = 0; i < count; ++i) { + if (!lua_isnumber(L, 3 + i)) { + delete[] values; + return luaL_typerror(L, 3 + i, "number"); + } + values[i] = (float)lua_tonumber(L, 3 + i); } + try { + effect->sendFloat(name, 1, values, count); + } catch(love::Exception& e) { + delete[] values; + return luaL_error(L, e.what()); + } + + delete[] values; return 0; } + static int _sendVectors(lua_State * L, PixelEffect * effect, const char * name, int count) + { + int dimension = lua_objlen(L, 3); + float * values = new float[count * dimension]; + + for (int i = 0; i < count; ++i) { + if (!lua_istable(L, 3 + i)) { + delete[] values; + return luaL_typerror(L, 3 + i, "table"); + } + if (lua_objlen(L, 3 + i) != dimension) { + delete[] values; + return luaL_error(L, "Error in argument %d: Expected table size %d, got %d.", + 3+i, dimension, lua_objlen(L, 3+i)); + } + + for (int k = 1; k <= dimension; ++k) { + lua_rawgeti(L, 3 + i, k); + values[i * dimension + k - 1] = (float)lua_tonumber(L, -1); + } + lua_pop(L, dimension); + } + + try { + effect->sendFloat(name, dimension, values, count); + } catch(love::Exception& e) { + delete[] values; + return luaL_error(L, e.what()); + } + + delete[] values; + return 0; + } + + int w_PixelEffect_sendFloat(lua_State * L) + { + PixelEffect * effect = luax_checkpixeleffect(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."); + + if (lua_isnumber(L, 3)) + return _sendScalars(L, effect, name, count); + else if (lua_istable(L, 3)) + return _sendVectors(L, effect, name, count); + + return luaL_typerror(L, 3, "number or table"); + } + int w_PixelEffect_sendMatrix(lua_State * L) { - size_t count = lua_gettop(L) - 3; + int count = lua_gettop(L) - 2; PixelEffect * effect = luax_checkpixeleffect(L, 1); const char* name = luaL_checkstring(L, 2); - int size = luaL_checkinteger(L, 3); - if (size < 2 || size > 4) - return luaL_error(L, "Invalid matrix size: %dx%d (only 2x2, 3x3 and 4x4 matrices are supported).", count, count); + if (!lua_istable(L, 3)) + return luaL_typerror(L, 3, "matrix table"); - float values[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - for (unsigned int i = 0; i < count; ++i) - values[i] = (float) luaL_checknumber(L, i+1 + 3); + lua_getfield(L, 3, "dimension"); + int dimension = lua_tointeger(L, -1); + lua_pop(L, 1); - try { - effect->sendFloat(name, size, values); - } catch(love::Exception& e) { - luaL_error(L, e.what()); + if (dimension < 2 || dimension > 4) + return luaL_error(L, "Invalid matrix size: %dx%d (only 2x2, 3x3 and 4x4 matrices are supported).", + count, count); + + 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); + cout << i << "." << k << " = " << (float)lua_tonumber(L, -1) << endl; + } + + lua_pop(L, 1 + dimension); } + try { + effect->sendMatrix(name, dimension, values, count); + } catch(love::Exception& e) { + delete[] values; + return luaL_error(L, e.what()); + } + + delete[] values; return 0; } diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index ad2c07f5a..bfb051873 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -1318,9 +1318,26 @@ do return table.concat(lines, "\n") end + -- helper to transform a matrix from {{a,b,c}, {d,e,f}, ...} to + -- {a, b, c, d, e, f, ...} + local function flattenMatrices(mat, ...) + if not mat then return end + + local ret,l = {}, 1 + ret.dimension = #mat + + for i = 1,#mat do + for k = 1,#mat[i] do + ret[l], l = tonumber(mat[i][k]), l+1 + end + end + + return ret, flattenMatrices(...) + end + -- automagic uniform setter local function pixeleffect_dispatch_send(self, name, value, ...) - if type(value) == "number" then -- scalar or vector + if type(value) == "number" then -- scalar self:sendFloat(name, value, ...) elseif type(value) == "userdata" and value:typeOf("Image") then self:sendImage(name, value) @@ -1328,15 +1345,9 @@ do self:sendCanvas(name, value) elseif type(value) == "table" then -- vector or matrix if type(value[1]) == "number" then - self:sendFloat(name, unpack(value)) + self:sendFloat(name, value, ...) elseif type(value[1]) == "table" then - local m,l = {}, 0 - for i = 1,#value do - for k = 1,#value[i] do - m[l], l = tonumber(value[i][k]), l+1 - end - end - self:sendMatrix(name, #value, unpack(m)) + self:sendMatrix(name, flattenMatrices(value, ...)) else error("Cannot send value (unsupported type: {"..type(value[1]).."}).") end diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index 929f0f09c..37087fdb9 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -6359,6 +6359,33 @@ const unsigned char graphics_lua[] = 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 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,0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x7b, 0x7b, 0x61, 0x2c, 0x62, 0x2c, 0x63, 0x7d, 0x2c, 0x20, 0x7b, 0x64, 0x2c, 0x65, 0x2c, 0x66, + 0x7d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x7d, 0x20, 0x74, 0x6f, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x7b, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x65, + 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6c, + 0x61, 0x74, 0x74, 0x65, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x63, 0x65, 0x73, 0x28, 0x6d, 0x61, 0x74, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x2c, 0x20, 0x31, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x2e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, + 0x23, 0x6d, 0x61, 0x74, 0x0a,0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x23, 0x6d, 0x61, 0x74, 0x20, 0x64, + 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x23, 0x6d, 0x61, 0x74, 0x5b, + 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x5b, 0x6c, 0x5d, 0x2c, 0x20, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x6f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6d, 0x61, 0x74, 0x5b, 0x69, 0x5d, 0x5b, 0x6b, 0x5d, 0x29, 0x2c, + 0x20, 0x6c, 0x2b, 0x31, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x63, 0x65, 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, 0x09, 0x2d, 0x2d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x69, @@ -6367,8 +6394,7 @@ const unsigned char graphics_lua[] = 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x6f, 0x72, - 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x0a, 0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, @@ -6391,25 +6417,13 @@ const unsigned char graphics_lua[] = 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74, - 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x29, 0x29, 0x0a, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x2c, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x2c, 0x20, 0x30, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x23, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x23, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x6d, 0x5b, 0x6c, 0x5d, 0x2c, 0x20, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x6f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5b, 0x69, 0x5d, 0x5b, 0x6b, 0x5d, - 0x29, 0x2c, 0x20, 0x6c, 0x2b, 0x31, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x4d, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x29, 0x29, 0x0a, + 0x78, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x4d, 0x61, 0x74, + 0x72, 0x69, 0x63, 0x65, 0x73, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x28, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, From 4f0028050d5ac25b46295bd49902b8e051e9535f Mon Sep 17 00:00:00 2001 From: vrld Date: Thu, 8 Sep 2011 12:25:43 +0200 Subject: [PATCH 169/384] Fix issue #294 (really this time). Add stencil attachment to framebuffer creation. Needed to remove depth attachment to make it work, but that should not change anything, since depth test is not enabled anyway. May need testing nonetheless. --- src/modules/graphics/opengl/Canvas.cpp | 85 ++++++++++--------- src/modules/graphics/opengl/Canvas.h | 2 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 3 - 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index 5d82d6637..ee5c07dcf 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -14,39 +14,44 @@ namespace opengl // strategy for fbo creation, interchangable at runtime: // none, opengl >= 3.0, extensions struct FramebufferStrategy { - /// create a new framebuffer, depthbuffer and texture + /// create a new framebuffer, stencilbuffer and texture /** - * @param[out] framebuffer Framebuffer name - * @param[out] depthbuffer Depthbuffer name - * @param[out] img Texture name - * @param[in] width Width of framebuffer - * @param[in] height Height of framebuffer + * @param[out] framebuffer Framebuffer name + * @param[out] stencilbuffer Stencilbuffer name + * @param[out] img Texture name + * @param[in] width Width of framebuffer + * @param[in] height Height of framebuffer * @return Creation status */ virtual GLenum createFBO(GLuint&, GLuint&, GLuint&, int, int) { return GL_FRAMEBUFFER_UNSUPPORTED; } /// remove objects /** - * @param[in] framebuffer Framebuffer name - * @param[in] depthbuffer Depthbuffer name - * @param[in] img Texture name + * @param[in] framebuffer Framebuffer name + * @param[in] stencilbuffer Stencilbuffer name + * @param[in] img Texture name */ virtual void deleteFBO(GLuint, GLuint, GLuint) {} virtual void bindFBO(GLuint) {} }; struct FramebufferStrategyGL3 : public FramebufferStrategy { - virtual GLenum createFBO(GLuint& framebuffer, GLuint& depthbuffer, GLuint& img, int width, int height) + virtual GLenum createFBO(GLuint& framebuffer, GLuint& stencilbuffer, GLuint& img, int width, int height) { // get currently bound fbo to reset to it later GLint current_fbo; glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - // generate depth buffer - glGenRenderbuffers(1, &depthbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + // create framebuffer + glGenFramebuffers(1, &framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + + // create stencil buffer + glGenRenderbuffers(1, &stencilbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, stencilbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX, width, height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, stencilbuffer); // generate texture save target glGenTextures(1, &img); @@ -56,24 +61,21 @@ namespace opengl glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(GL_TEXTURE_2D, 0); - - // create framebuffer - glGenFramebuffers(1, &framebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, img, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, depthbuffer); + + // check status GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); // unbind framebuffer + glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)current_fbo); return status; } - virtual void deleteFBO(GLuint framebuffer, GLuint depthbuffer, GLuint img) + virtual void deleteFBO(GLuint framebuffer, GLuint stencilbuffer, GLuint img) { glDeleteTextures(1, &img); - glDeleteRenderbuffers(1, &depthbuffer); + glDeleteRenderbuffers(1, &stencilbuffer); glDeleteFramebuffers(1, &framebuffer); } @@ -85,16 +87,21 @@ namespace opengl struct FramebufferStrategyEXT : public FramebufferStrategy { - virtual GLenum createFBO(GLuint& framebuffer, GLuint& depthbuffer, GLuint& img, int width, int height) + virtual GLenum createFBO(GLuint& framebuffer, GLuint& stencilbuffer, GLuint& img, int width, int height) { GLint current_fbo; glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, ¤t_fbo); - // generate depth buffer - glGenRenderbuffersEXT(1, &depthbuffer); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthbuffer); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, width, height); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + // create framebuffer + glGenFramebuffersEXT(1, &framebuffer); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); + + // create stencil buffer + glGenRenderbuffersEXT(1, &stencilbuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencilbuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, width, height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, stencilbuffer); // generate texture save target glGenTextures(1, &img); @@ -104,25 +111,22 @@ namespace opengl glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(GL_TEXTURE_2D, 0); - - // create framebuffer - glGenFramebuffersEXT(1, &framebuffer); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, img, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, depthbuffer); + + // check status GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); // unbind framebuffer + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, (GLuint)current_fbo); return status; } - virtual void deleteFBO(GLuint framebuffer, GLuint depthbuffer, GLuint img) + virtual void deleteFBO(GLuint framebuffer, GLuint stencilbuffer, GLuint img) { glDeleteTextures(1, &img); - glDeleteRenderbuffersEXT(1, &depthbuffer); + glDeleteRenderbuffersEXT(1, &stencilbuffer); glDeleteFramebuffersEXT(1, &framebuffer); } @@ -213,9 +217,8 @@ namespace opengl current->stopGrab(); // bind buffer and clear screen - glPushAttrib(GL_VIEWPORT_BIT | GL_DEPTH_BUFFER_BIT | GL_TRANSFORM_BIT); + glPushAttrib(GL_VIEWPORT_BIT | GL_TRANSFORM_BIT); strategy->bindFBO(fbo); - glClear(GL_DEPTH_BUFFER_BIT); glViewport(0, 0, width, height); // Reset the projection matrix @@ -366,7 +369,7 @@ namespace opengl bool Canvas::loadVolatile() { - status = strategy->createFBO(fbo, depthbuffer, img, width, height); + status = strategy->createFBO(fbo, stencilbuffer, img, width, height); if (status != GL_FRAMEBUFFER_COMPLETE) return false; @@ -382,7 +385,7 @@ namespace opengl { settings.filter = getFilter(); settings.wrap = getWrap(); - strategy->deleteFBO(fbo, depthbuffer, img); + strategy->deleteFBO(fbo, stencilbuffer, img); } int Canvas::getWidth() diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index ae07ce9c7..0eb4be4f7 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -77,7 +77,7 @@ namespace opengl GLsizei width; GLsizei height; GLuint fbo; - GLuint depthbuffer; + GLuint stencilbuffer; GLuint img; vertex vertices[4]; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 6faaefb53..5d8668944 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -169,9 +169,6 @@ namespace opengl static int setStencil(lua_State * L, bool invert) { - // stencils require the default fb to work properly - Canvas::TemporaryUnbinder unbinder; - // no argument -> clear mask if (lua_isnoneornil(L, 1)) { instance->discardStencil(); From 65f8bcd3758ec1ecfef51e1ef4bac661d85bc194 Mon Sep 17 00:00:00 2001 From: vrld Date: Thu, 8 Sep 2011 16:09:10 +0200 Subject: [PATCH 170/384] Another take at issue #294, which should fix issues with nVidia cards. According to http://www.opengl.org/wiki/Image_Formats#Depth_stencil_formats, no driver really supported an individial stencil attachment. Combined depth/stencil buffers have support since OpenGL 3.0 or with the packed_depth_stencil extension. --- src/modules/graphics/opengl/Canvas.cpp | 74 +++++++++++++------------- src/modules/graphics/opengl/Canvas.h | 23 +------- 2 files changed, 39 insertions(+), 58 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index ee5c07dcf..60cf10ca2 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -14,10 +14,10 @@ namespace opengl // strategy for fbo creation, interchangable at runtime: // none, opengl >= 3.0, extensions struct FramebufferStrategy { - /// create a new framebuffer, stencilbuffer and texture + /// create a new framebuffer, depth_stencil and texture /** * @param[out] framebuffer Framebuffer name - * @param[out] stencilbuffer Stencilbuffer name + * @param[out] depth_stencil Name for packed depth and stencil buffer * @param[out] img Texture name * @param[in] width Width of framebuffer * @param[in] height Height of framebuffer @@ -28,7 +28,7 @@ namespace opengl /// remove objects /** * @param[in] framebuffer Framebuffer name - * @param[in] stencilbuffer Stencilbuffer name + * @param[in] depth_stencil Name for packed depth and stencil buffer * @param[in] img Texture name */ virtual void deleteFBO(GLuint, GLuint, GLuint) {} @@ -36,7 +36,7 @@ namespace opengl }; struct FramebufferStrategyGL3 : public FramebufferStrategy { - virtual GLenum createFBO(GLuint& framebuffer, GLuint& stencilbuffer, GLuint& img, int width, int height) + virtual GLenum createFBO(GLuint& framebuffer, GLuint& depth_stencil, GLuint& img, int width, int height) { // get currently bound fbo to reset to it later GLint current_fbo; @@ -47,11 +47,13 @@ namespace opengl glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); // create stencil buffer - glGenRenderbuffers(1, &stencilbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, stencilbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX, width, height); + glGenRenderbuffers(1, &depth_stencil); + glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, stencilbuffer); + GL_RENDERBUFFER, depth_stencil); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, depth_stencil); // generate texture save target glGenTextures(1, &img); @@ -72,10 +74,10 @@ namespace opengl glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)current_fbo); return status; } - virtual void deleteFBO(GLuint framebuffer, GLuint stencilbuffer, GLuint img) + virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img) { glDeleteTextures(1, &img); - glDeleteRenderbuffers(1, &stencilbuffer); + glDeleteRenderbuffers(1, &depth_stencil); glDeleteFramebuffers(1, &framebuffer); } @@ -87,7 +89,7 @@ namespace opengl struct FramebufferStrategyEXT : public FramebufferStrategy { - virtual GLenum createFBO(GLuint& framebuffer, GLuint& stencilbuffer, GLuint& img, int width, int height) + virtual GLenum createFBO(GLuint& framebuffer, GLuint& depth_stencil, GLuint& img, int width, int height) { GLint current_fbo; glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, ¤t_fbo); @@ -97,11 +99,13 @@ namespace opengl glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); // create stencil buffer - glGenRenderbuffersEXT(1, &stencilbuffer); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencilbuffer); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, width, height); + glGenRenderbuffersEXT(1, &depth_stencil); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_stencil); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, width, height); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, stencilbuffer); + GL_RENDERBUFFER_EXT, depth_stencil); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, depth_stencil); // generate texture save target glGenTextures(1, &img); @@ -123,10 +127,10 @@ namespace opengl return status; } - virtual void deleteFBO(GLuint framebuffer, GLuint stencilbuffer, GLuint img) + virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img) { glDeleteTextures(1, &img); - glDeleteRenderbuffersEXT(1, &stencilbuffer); + glDeleteRenderbuffersEXT(1, &depth_stencil); glDeleteFramebuffersEXT(1, &framebuffer); } @@ -146,6 +150,18 @@ namespace opengl Canvas* Canvas::current = NULL; + static void loadStrategy() + { + if (!strategy) { + if (GLEE_VERSION_3_0 || GLEE_ARB_framebuffer_object) + strategy = &strategyGL3; + else if (GLEE_EXT_framebuffer_object && GLEE_EXT_packed_depth_stencil) + strategy = &strategyEXT; + else + strategy = &strategyNone; + } + } + Canvas::Canvas(int width, int height) : width(width), height(height) { @@ -166,14 +182,7 @@ namespace opengl vertices[2].s = 1; vertices[2].t = 0; vertices[3].s = 1; vertices[3].t = 1; - if (!strategy) { - if (GLEE_VERSION_3_0 || GLEE_ARB_framebuffer_object) - strategy = &strategyGL3; - else if (GLEE_EXT_framebuffer_object) - strategy = &strategyEXT; - else - strategy = &strategyNone; - } + loadStrategy(); loadVolatile(); } @@ -189,14 +198,7 @@ namespace opengl bool Canvas::isSupported() { - if (!strategy) { - if (GLEE_VERSION_3_0 || GLEE_ARB_framebuffer_object) - strategy = &strategyGL3; - else if (GLEE_EXT_framebuffer_object) - strategy = &strategyEXT; - else - strategy = &strategyNone; - } + loadStrategy(); return (strategy != &strategyNone); } @@ -260,7 +262,7 @@ namespace opengl strategy->bindFBO(fbo); glPushAttrib(GL_COLOR_BUFFER_BIT); glClearColor((float)c.r/255.0f, (float)c.g/255.0f, (float)c.b/255.0f, (float)c.a/255.0f); - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glPopAttrib(); strategy->bindFBO(previous); @@ -369,7 +371,7 @@ namespace opengl bool Canvas::loadVolatile() { - status = strategy->createFBO(fbo, stencilbuffer, img, width, height); + status = strategy->createFBO(fbo, depth_stencil, img, width, height); if (status != GL_FRAMEBUFFER_COMPLETE) return false; @@ -385,7 +387,7 @@ namespace opengl { settings.filter = getFilter(); settings.wrap = getWrap(); - strategy->deleteFBO(fbo, stencilbuffer, img); + strategy->deleteFBO(fbo, depth_stencil, img); } int Canvas::getWidth() diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index 0eb4be4f7..a3ef7c323 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -49,27 +49,6 @@ namespace opengl bool loadVolatile(); void unloadVolatile(); - /// Unbind the current canvas on construction and rebind it upon destruction. - // Exception safe temporary unbinding/rebinding for techniques that require - // the default canvas to work (e.g. stencils). - // XXX: If a canvas is switched between creating and destroying an unbinder - // object, the canvas will not be switched back. - struct TemporaryUnbinder - { - Canvas * canvas; - inline TemporaryUnbinder() : canvas(Canvas::current) - { - if (NULL != canvas) - Canvas::bindDefaultCanvas(); - } - - inline ~TemporaryUnbinder() - { - if (NULL != canvas && NULL == Canvas::current) - canvas->startGrab(); - } - }; - private: friend class PixelEffect; GLuint getTextureName() const { return img; } @@ -77,7 +56,7 @@ namespace opengl GLsizei width; GLsizei height; GLuint fbo; - GLuint stencilbuffer; + GLuint depth_stencil; GLuint img; vertex vertices[4]; From 9199f1be5bcd0fbd9795926851fdf005351edda2 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 10 Sep 2011 15:34:45 +0200 Subject: [PATCH 171/384] Catch ALL the utf8 errors (bug #244) --- src/modules/graphics/opengl/Font.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 7b4386eb5..a850c7c55 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -174,7 +174,7 @@ namespace opengl dx += glyph->spacing; } } - catch (utf8::invalid_utf8 e) + catch (utf8::exception e) { glPopMatrix(); throw love::Exception(e.what()); @@ -210,7 +210,7 @@ namespace opengl temp += static_cast(g->spacing * mSpacing); } } - catch (utf8::invalid_utf8 e) + catch (utf8::exception e) { throw love::Exception(e.what()); } From c28659ae3387d536e7147db727fcf41ac59f6e65 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 10 Sep 2011 17:28:38 +0200 Subject: [PATCH 172/384] Rework source updates, do clean stopping of streaming sources once they end. (bug #295) --- src/modules/audio/Source.h | 2 +- src/modules/audio/null/Source.cpp | 3 +- src/modules/audio/null/Source.h | 2 +- src/modules/audio/openal/Pool.cpp | 14 ++--- src/modules/audio/openal/Source.cpp | 86 +++++++++++++++++------------ src/modules/audio/openal/Source.h | 2 +- 6 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/modules/audio/Source.h b/src/modules/audio/Source.h index b91067638..45bc359d6 100644 --- a/src/modules/audio/Source.h +++ b/src/modules/audio/Source.h @@ -64,7 +64,7 @@ namespace audio virtual bool isStopped() const = 0; virtual bool isPaused() const = 0; virtual bool isFinished() const = 0; - virtual void update() = 0; + virtual bool update() = 0; virtual void setPitch(float pitch) = 0; virtual float getPitch() const = 0; diff --git a/src/modules/audio/null/Source.cpp b/src/modules/audio/null/Source.cpp index 4da104c23..e2ea14a2c 100644 --- a/src/modules/audio/null/Source.cpp +++ b/src/modules/audio/null/Source.cpp @@ -77,8 +77,9 @@ namespace null return true; } - void Source::update() + bool Source::update() { + return false; } void Source::setPitch(float pitch) diff --git a/src/modules/audio/null/Source.h b/src/modules/audio/null/Source.h index 0d5c5c2f6..51e0f9cd8 100644 --- a/src/modules/audio/null/Source.h +++ b/src/modules/audio/null/Source.h @@ -52,7 +52,7 @@ namespace null virtual bool isStopped() const; virtual bool isPaused() const; virtual bool isFinished() const; - virtual void update(); + virtual bool update(); virtual void setPitch(float pitch); virtual float getPitch() const; virtual void setVolume(float volume); diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index c9c81e64e..7e9d46558 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -86,18 +86,14 @@ namespace openal while(i != playing.end()) { - if(i->first->isStopped()) + if(!i->first->update()) { i->first->stopAtomic(); i->first->release(); available.push(i->second); - playing.erase(i++); - } - else - { - i->first->update(); - i++; + playing.erase(i); } + i++; } } @@ -219,9 +215,7 @@ namespace openal void Pool::rewind(Source * source) { thread::Lock lock(mutex); - ALuint out; - if(findSource(source, out)) - source->rewindAtomic(); + source->rewindAtomic(); } void Pool::release(Source * source) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index c2a5894ce..090472a84 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -143,49 +143,67 @@ namespace openal return type == TYPE_STATIC ? isStopped() : isStopped() && !isLooping() && decoder->isFinished(); } - void Source::update() + bool Source::update() { - if(valid && type == TYPE_STATIC) + 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(valid && type == TYPE_STREAM && !(!isLooping() && isFinished())) + else if (type == TYPE_STREAM) { - // Number of processed buffers. - ALint processed; - - alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); - - while(processed--) + if (isLooping() || !isFinished()) { - 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); + // Number of processed buffers. + ALint processed; + + 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; + } + else + { + // Actually stop the source, + // 'just running out' is bad + // practice, and prevents + // rewinds. + stopAtomic(); + rewindAtomic(); + return false; } } + return false; } void Source::setPitch(float pitch) diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index c84d35b08..901bbbbfc 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -85,7 +85,7 @@ namespace openal virtual bool isStopped() const; virtual bool isPaused() const; virtual bool isFinished() const; - virtual void update(); + virtual bool update(); virtual void setPitch(float pitch); virtual float getPitch() const; virtual void setVolume(float volume); From 96a5a3e402a2c7d4c8c44ca8d8b418e5c2204238 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 11 Sep 2011 12:51:34 +0200 Subject: [PATCH 173/384] Catch not just the generic utf8 exception, but a few specific ones as well (bug #244) --- src/modules/graphics/opengl/Font.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index a850c7c55..28b104401 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -174,6 +174,16 @@ namespace opengl dx += glyph->spacing; } } + catch (utf8::invalid_code_point e) + { + glPopMatrix(); + throw love::Exception(e.what()); + } + catch (utf8::invalid_utf8 e) + { + glPopMatrix(); + throw love::Exception(e.what()); + } catch (utf8::exception e) { glPopMatrix(); @@ -210,6 +220,16 @@ namespace opengl temp += static_cast(g->spacing * mSpacing); } } + catch (utf8::invalid_code_point e) + { + glPopMatrix(); + throw love::Exception(e.what()); + } + catch (utf8::invalid_utf8 e) + { + glPopMatrix(); + throw love::Exception(e.what()); + } catch (utf8::exception e) { throw love::Exception(e.what()); From 8f9a4ef15dd00796aa4a0a931f2a7d6c44b6455b Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 11 Sep 2011 22:29:37 +0200 Subject: [PATCH 174/384] Improve stop and rewind logic for openal --- src/modules/audio/openal/Pool.cpp | 1 + src/modules/audio/openal/Source.cpp | 63 ++++++++++++----------------- 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index 7e9d46558..e20cbd05e 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -89,6 +89,7 @@ namespace openal if(!i->first->update()) { i->first->stopAtomic(); + i->first->rewindAtomic(); i->first->release(); available.push(i->second); playing.erase(i); diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 090472a84..399d271da 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -153,55 +153,42 @@ namespace openal alSourcei(source, AL_LOOPING, isLooping() ? AL_TRUE : AL_FALSE); return !isStopped(); } - else if (type == TYPE_STREAM) + else if (type == TYPE_STREAM && (isLooping() || !isFinished())) { - if (isLooping() || !isFinished()) + // Number of processed buffers. + ALint processed; + + alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); + + while(processed--) { - // Number of processed buffers. - ALint processed; + ALuint buffer; - alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); + float curOffsetSamples, curOffsetSecs; - while(processed--) - { - ALuint buffer; + alGetSourcef(source, AL_SAMPLE_OFFSET, &curOffsetSamples); - float curOffsetSamples, curOffsetSecs; + ALint b; + alGetSourcei(source, AL_BUFFER, &b); + int freq; + alGetBufferi(b, AL_FREQUENCY, &freq); + curOffsetSecs = curOffsetSamples / freq; - alGetSourcef(source, AL_SAMPLE_OFFSET, &curOffsetSamples); + // Get a free buffer. + alSourceUnqueueBuffers(source, 1, &buffer); - ALint b; - alGetSourcei(source, AL_BUFFER, &b); - int freq; - alGetBufferi(b, AL_FREQUENCY, &freq); - curOffsetSecs = curOffsetSamples / freq; + float newOffsetSamples, newOffsetSecs; - // Get a free buffer. - alSourceUnqueueBuffers(source, 1, &buffer); + alGetSourcef(source, AL_SAMPLE_OFFSET, &newOffsetSamples); + newOffsetSecs = newOffsetSamples / freq; - float newOffsetSamples, newOffsetSecs; + offsetSamples += (curOffsetSamples - newOffsetSamples); + offsetSeconds += (curOffsetSecs - 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; - } - else - { - // Actually stop the source, - // 'just running out' is bad - // practice, and prevents - // rewinds. - stopAtomic(); - rewindAtomic(); - return false; + streamAtomic(buffer, decoder); + alSourceQueueBuffers(source, 1, &buffer); } + return true; } return false; } From dc873c24f06cc9686a5fc1bf4dc53cea4a7b56eb Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 11 Sep 2011 22:55:34 +0200 Subject: [PATCH 175/384] Some exception cleanup --- src/common/Exception.cpp | 5 ++++ src/common/Exception.h | 2 ++ src/modules/graphics/opengl/Font.cpp | 28 +++---------------- .../physics/box2d/Source/Common/b2Settings.h | 2 +- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/common/Exception.cpp b/src/common/Exception.cpp index 6ef8b2819..8d0a9ed6e 100644 --- a/src/common/Exception.cpp +++ b/src/common/Exception.cpp @@ -30,6 +30,11 @@ namespace love va_end(args); } + Exception::Exception(int unparsed, const char * str) + { + strncpy(buffer, str, BUFFER_SIZE); + } + const char * Exception::what() const throw() { return (const char *)buffer; diff --git a/src/common/Exception.h b/src/common/Exception.h index 15a233f7e..337ec9d36 100644 --- a/src/common/Exception.h +++ b/src/common/Exception.h @@ -24,6 +24,7 @@ #include #include // vararg #include // vsnprintf +#include // strncpy namespace love { @@ -54,6 +55,7 @@ namespace love * @param fmt The format string (see printf). **/ Exception(const char * fmt, ...); + Exception(int unparsed, const char * str); /** * Returns a string containing reason for the exception. diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 28b104401..10046413e 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -174,20 +174,10 @@ namespace opengl dx += glyph->spacing; } } - catch (utf8::invalid_code_point e) + catch (utf8::exception & e) { glPopMatrix(); - throw love::Exception(e.what()); - } - catch (utf8::invalid_utf8 e) - { - glPopMatrix(); - throw love::Exception(e.what()); - } - catch (utf8::exception e) - { - glPopMatrix(); - throw love::Exception(e.what()); + throw love::Exception(1, e.what()); } glPopMatrix(); } @@ -220,19 +210,9 @@ namespace opengl temp += static_cast(g->spacing * mSpacing); } } - catch (utf8::invalid_code_point e) + catch (utf8::exception & e) { - glPopMatrix(); - throw love::Exception(e.what()); - } - catch (utf8::invalid_utf8 e) - { - glPopMatrix(); - throw love::Exception(e.what()); - } - catch (utf8::exception e) - { - throw love::Exception(e.what()); + throw love::Exception(1, e.what()); } return temp; diff --git a/src/modules/physics/box2d/Source/Common/b2Settings.h b/src/modules/physics/box2d/Source/Common/b2Settings.h index 2ba53255e..545b6f64b 100644 --- a/src/modules/physics/box2d/Source/Common/b2Settings.h +++ b/src/modules/physics/box2d/Source/Common/b2Settings.h @@ -25,7 +25,7 @@ #define B2_NOT_USED(x) x //#define b2Assert(A) assert(A) -#define b2Assert(A) {if(!(A)) throw love::Exception(#A);} +#define b2Assert(A) {if(!(A)) throw love::Exception(1, #A);} // need to include NDS jtypes.h instead of From 99660f39ab7e932769f83384eeb3cbace6239af0 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 15 Sep 2011 12:40:16 -0400 Subject: [PATCH 176/384] Added RopeJoint --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 12 ++++ src/modules/physics/box2d/Physics.cpp | 5 ++ src/modules/physics/box2d/Physics.h | 11 ++++ src/modules/physics/box2d/RopeJoint.cpp | 59 ++++++++++++++++++ src/modules/physics/box2d/RopeJoint.h | 62 +++++++++++++++++++ src/modules/physics/box2d/wrap_Physics.cpp | 17 +++++ src/modules/physics/box2d/wrap_Physics.h | 2 + src/modules/physics/box2d/wrap_RopeJoint.cpp | 60 ++++++++++++++++++ src/modules/physics/box2d/wrap_RopeJoint.h | 43 +++++++++++++ 9 files changed, 271 insertions(+) create mode 100644 src/modules/physics/box2d/RopeJoint.cpp create mode 100644 src/modules/physics/box2d/RopeJoint.h create mode 100644 src/modules/physics/box2d/wrap_RopeJoint.cpp create mode 100644 src/modules/physics/box2d/wrap_RopeJoint.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 0b351b637..70382453f 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -209,6 +209,8 @@ A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9BD60701226C988007DEC63 /* Framebuffer.cpp */; }; A9BD60751226C988007DEC63 /* wrap_Framebuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9BD60721226C988007DEC63 /* wrap_Framebuffer.cpp */; }; A9CF0E8610B9EB1000E6F37E /* utf8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9CF0E8510B9EB1000E6F37E /* utf8.cpp */; }; + A9D1D20214224E1300A8BC2F /* RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D1D20114224E1300A8BC2F /* RopeJoint.cpp */; }; + A9D1D2041422578C00A8BC2F /* wrap_RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D1D2031422578A00A8BC2F /* wrap_RopeJoint.cpp */; }; A9D307EA106635C3004FEDF8 /* physfs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9DEC1C11046EFA70049C70C /* Love.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1BF1046EFA60049C70C /* Love.icns */; }; @@ -669,6 +671,10 @@ A9BFAA851137C1CE005FE0AD /* ThreadModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadModule.h; sourceTree = ""; }; A9CF0E8410B9EB1000E6F37E /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = ""; }; A9CF0E8510B9EB1000E6F37E /* utf8.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utf8.cpp; sourceTree = ""; }; + A9D1D20014224DFF00A8BC2F /* RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RopeJoint.h; sourceTree = ""; }; + A9D1D20114224E1300A8BC2F /* RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RopeJoint.cpp; sourceTree = ""; }; + A9D1D2031422578A00A8BC2F /* wrap_RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RopeJoint.cpp; sourceTree = ""; }; + A9D1D2051422579500A8BC2F /* wrap_RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_RopeJoint.h; sourceTree = ""; }; A9D307E9106635C3004FEDF8 /* physfs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = physfs.framework; path = /Library/Frameworks/physfs.framework; sourceTree = ""; }; A9DEC1BF1046EFA60049C70C /* Love.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Love.icns; path = icons/Love.icns; sourceTree = ""; }; A9DEC1C01046EFA70049C70C /* LoveDocument.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = LoveDocument.icns; path = icons/LoveDocument.icns; sourceTree = ""; }; @@ -1222,6 +1228,8 @@ A93E6B0310420AC8007D418B /* PrismaticJoint.h */, A93E6B0410420AC8007D418B /* PulleyJoint.cpp */, A93E6B0510420AC8007D418B /* PulleyJoint.h */, + A9D1D20114224E1300A8BC2F /* RopeJoint.cpp */, + A9D1D20014224DFF00A8BC2F /* RopeJoint.h */, A93E6B0610420AC8007D418B /* RevoluteJoint.cpp */, A93E6B0710420AC8007D418B /* RevoluteJoint.h */, A93E6B0810420AC8007D418B /* Shape.cpp */, @@ -1260,6 +1268,8 @@ A93E6B6510420ACA007D418B /* wrap_PulleyJoint.h */, A93E6B6610420ACA007D418B /* wrap_RevoluteJoint.cpp */, A93E6B6710420ACA007D418B /* wrap_RevoluteJoint.h */, + A9D1D2031422578A00A8BC2F /* wrap_RopeJoint.cpp */, + A9D1D2051422579500A8BC2F /* wrap_RopeJoint.h */, A93E6B6810420ACA007D418B /* wrap_Shape.cpp */, A93E6B6910420ACA007D418B /* wrap_Shape.h */, A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */, @@ -1798,6 +1808,8 @@ A96F418C1412B3AD0067FE9A /* WheelJoint.cpp in Sources */, A96F41A41412C91F0067FE9A /* EdgeShape.cpp in Sources */, A96F41A71412C92B0067FE9A /* wrap_EdgeShape.cpp in Sources */, + A9D1D20214224E1300A8BC2F /* RopeJoint.cpp in Sources */, + A9D1D2041422578C00A8BC2F /* wrap_RopeJoint.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 20a584021..bf43ddb22 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -188,6 +188,11 @@ namespace box2d { return new WheelJoint(body1, body2, x, y, ax, ay); } + + RopeJoint * Physics::newRopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength) + { + return new RopeJoint(body1, body2, x1, y1, x2, y2, maxLength); + } } // box2d } // physics diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 9e78e14de..94839e865 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -40,6 +40,7 @@ #include "FrictionJoint.h" #include "WeldJoint.h" #include "WheelJoint.h" +#include "RopeJoint.h" namespace love { @@ -222,6 +223,16 @@ namespace box2d * @param ay The y-component of the world-axis. **/ WheelJoint * newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay); + + /** + * 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. + **/ + RopeJoint * newRopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength); }; // Physics diff --git a/src/modules/physics/box2d/RopeJoint.cpp b/src/modules/physics/box2d/RopeJoint.cpp new file mode 100644 index 000000000..5cbd26698 --- /dev/null +++ b/src/modules/physics/box2d/RopeJoint.cpp @@ -0,0 +1,59 @@ +/** +* 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. +**/ + +#include "RopeJoint.h" + +// Module +#include "Body.h" +#include "World.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + RopeJoint::RopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength) + : Joint(body1, body2), joint(NULL) + { + b2RopeJointDef def; + def.bodyA = body1->body; + def.bodyB = body2->body; + def.localAnchorA = world->scaleDown(b2Vec2(x1,y1)); + def.localAnchorB = world->scaleDown(b2Vec2(x2,y2)); + def.maxLength = world->scaleDown(maxLength); + joint = (b2RopeJoint*)createJoint(&def); + } + + RopeJoint::~RopeJoint() + { + destroyJoint(joint); + joint = 0; + } + + float RopeJoint::getMaxLength() const + { + return world->scaleUp(joint->GetMaxLength()); + } + + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/RopeJoint.h b/src/modules/physics/box2d/RopeJoint.h new file mode 100644 index 000000000..886f459cd --- /dev/null +++ b/src/modules/physics/box2d/RopeJoint.h @@ -0,0 +1,62 @@ +/** +* 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_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 + { + private: + // The Box2D RopeJoint object. + b2RopeJoint * joint; + public: + + /** + * Creates a RopeJoint connecting body1 to body2. + **/ + RopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength); + + virtual ~RopeJoint(); + + /** + * Gets the maximum length of the rope. + **/ + float getMaxLength() const; + + }; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_ROPE_JOINT_H diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 78508fe3c..f72f6f6bd 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -239,6 +239,20 @@ namespace box2d luax_newtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, (void*)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); + RopeJoint * j = instance->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength); + luax_newtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, (void*)j); + return 1; + } // List of functions to wrap. static const luaL_Reg functions[] = { @@ -257,6 +271,7 @@ namespace box2d { "newFrictionJoint", w_newFrictionJoint }, { "newWeldJoint", w_newWeldJoint }, { "newWheelJoint", w_newWheelJoint }, + { "newRopeJoint", w_newRopeJoint }, { 0, 0 }, }; @@ -277,6 +292,8 @@ namespace box2d luaopen_gearjoint, luaopen_frictionjoint, luaopen_weldjoint, + luaopen_wheeljoint, + luaopen_ropejoint, 0 }; diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index fb715d32b..c87684796 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -41,6 +41,7 @@ #include "wrap_FrictionJoint.h" #include "wrap_WeldJoint.h" #include "wrap_WheelJoint.h" +#include "wrap_RopeJoint.h" namespace love { @@ -63,6 +64,7 @@ namespace box2d int w_newFrictionJoint(lua_State * L); int w_newWeldJoint(lua_State * L); int w_newWheelJoint(lua_State * L); + int w_newRopeJoint(lua_State * L); extern "C" LOVE_EXPORT int luaopen_love_physics(lua_State * L); } // box2d diff --git a/src/modules/physics/box2d/wrap_RopeJoint.cpp b/src/modules/physics/box2d/wrap_RopeJoint.cpp new file mode 100644 index 000000000..a86ba666a --- /dev/null +++ b/src/modules/physics/box2d/wrap_RopeJoint.cpp @@ -0,0 +1,60 @@ +/** +* 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. +**/ + +#include "wrap_RopeJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + RopeJoint * luax_checkropejoint(lua_State * L, int idx) + { + return luax_checktype(L, idx, "RopeJoint", PHYSICS_ROPE_JOINT_T); + } + + 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 } + }; + + int luaopen_ropejoint(lua_State * L) + { + return luax_register_type(L, "RopeJoint", functions); + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/wrap_RopeJoint.h b/src/modules/physics/box2d/wrap_RopeJoint.h new file mode 100644 index 000000000..d1cc17ce4 --- /dev/null +++ b/src/modules/physics/box2d/wrap_RopeJoint.h @@ -0,0 +1,43 @@ +/** +* 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_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H + +// LOVE +#include +#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); + int luaopen_ropejoint(lua_State * L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H From e5fa4c87c63ed575e215e0681c382831b6946c7c Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 15 Sep 2011 14:28:48 -0400 Subject: [PATCH 177/384] exposed collideConnected flag --HG-- branch : box2d-update --- src/modules/physics/box2d/DistanceJoint.cpp | 3 +- src/modules/physics/box2d/DistanceJoint.h | 2 +- src/modules/physics/box2d/FrictionJoint.cpp | 3 +- src/modules/physics/box2d/FrictionJoint.h | 2 +- src/modules/physics/box2d/GearJoint.cpp | 3 +- src/modules/physics/box2d/GearJoint.h | 2 +- src/modules/physics/box2d/Physics.cpp | 36 ++++++++++---------- src/modules/physics/box2d/Physics.h | 18 +++++----- src/modules/physics/box2d/PrismaticJoint.cpp | 3 +- src/modules/physics/box2d/PrismaticJoint.h | 2 +- src/modules/physics/box2d/PulleyJoint.cpp | 3 +- src/modules/physics/box2d/PulleyJoint.h | 2 +- src/modules/physics/box2d/RevoluteJoint.cpp | 3 +- src/modules/physics/box2d/RevoluteJoint.h | 2 +- src/modules/physics/box2d/RopeJoint.cpp | 3 +- src/modules/physics/box2d/RopeJoint.h | 2 +- src/modules/physics/box2d/WeldJoint.cpp | 3 +- src/modules/physics/box2d/WeldJoint.h | 2 +- src/modules/physics/box2d/WheelJoint.cpp | 3 +- src/modules/physics/box2d/WheelJoint.h | 2 +- src/modules/physics/box2d/wrap_Physics.cpp | 27 ++++++++++----- 21 files changed, 72 insertions(+), 54 deletions(-) diff --git a/src/modules/physics/box2d/DistanceJoint.cpp b/src/modules/physics/box2d/DistanceJoint.cpp index d05ee3883..8ffa8ca9c 100644 --- a/src/modules/physics/box2d/DistanceJoint.cpp +++ b/src/modules/physics/box2d/DistanceJoint.cpp @@ -30,11 +30,12 @@ namespace physics { namespace box2d { - DistanceJoint::DistanceJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2) + 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, world->scaleDown(b2Vec2(x1,y1)), world->scaleDown(b2Vec2(x2,y2))); + def.collideConnected = collideConnected; joint = (b2DistanceJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/DistanceJoint.h b/src/modules/physics/box2d/DistanceJoint.h index 2363f1643..19ce1cb19 100644 --- a/src/modules/physics/box2d/DistanceJoint.h +++ b/src/modules/physics/box2d/DistanceJoint.h @@ -44,7 +44,7 @@ namespace box2d /** * Creates a DistanceJoint connecting body1 to body2. **/ - DistanceJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2); + DistanceJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, bool collideConnected); virtual ~DistanceJoint(); diff --git a/src/modules/physics/box2d/FrictionJoint.cpp b/src/modules/physics/box2d/FrictionJoint.cpp index f4d818803..f606199dd 100644 --- a/src/modules/physics/box2d/FrictionJoint.cpp +++ b/src/modules/physics/box2d/FrictionJoint.cpp @@ -32,11 +32,12 @@ namespace physics { namespace box2d { - FrictionJoint::FrictionJoint(Body * body1, Body * body2, float x, float y) + FrictionJoint::FrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) : Joint(body1, body2), joint(NULL) { b2FrictionJointDef def; def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); + def.collideConnected = collideConnected; joint = (b2FrictionJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/FrictionJoint.h b/src/modules/physics/box2d/FrictionJoint.h index ed4599f68..d334c4799 100644 --- a/src/modules/physics/box2d/FrictionJoint.h +++ b/src/modules/physics/box2d/FrictionJoint.h @@ -45,7 +45,7 @@ namespace box2d /** * Creates a new FrictionJoint connecting body1 and body2. **/ - FrictionJoint(Body * body1, Body * body2, float x, float y); + FrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); virtual ~FrictionJoint(); diff --git a/src/modules/physics/box2d/GearJoint.cpp b/src/modules/physics/box2d/GearJoint.cpp index aad347f45..5fc0f7dc1 100644 --- a/src/modules/physics/box2d/GearJoint.cpp +++ b/src/modules/physics/box2d/GearJoint.cpp @@ -30,7 +30,7 @@ namespace physics { namespace box2d { - GearJoint::GearJoint(Joint * joint1, Joint * joint2, float ratio) + GearJoint::GearJoint(Joint * joint1, Joint * joint2, float ratio, bool collideConnected) : Joint(joint1->body2, joint2->body2), joint(NULL) { b2GearJointDef def; @@ -39,6 +39,7 @@ namespace box2d def.bodyA = joint1->body2->body; def.bodyB = joint2->body2->body; def.ratio = ratio; + def.collideConnected = collideConnected; joint = (b2GearJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/GearJoint.h b/src/modules/physics/box2d/GearJoint.h index 3be2be3af..58eb648be 100644 --- a/src/modules/physics/box2d/GearJoint.h +++ b/src/modules/physics/box2d/GearJoint.h @@ -52,7 +52,7 @@ namespace box2d /** * Creates a GearJoint connecting joint1 to joint2. **/ - GearJoint(Joint * joint1, Joint * joint2, float ratio); + GearJoint(Joint * joint1, Joint * joint2, float ratio, bool collideConnected); virtual ~GearJoint(); diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index bf43ddb22..b8d781eed 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -144,9 +144,9 @@ namespace box2d return 1; } - DistanceJoint * Physics::newDistanceJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2) + 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); + return new DistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected); } MouseJoint * Physics::newMouseJoint(Body * body, float x, float y) @@ -154,44 +154,44 @@ namespace box2d return new MouseJoint(body, x, y); } - RevoluteJoint * Physics::newRevoluteJoint(Body * body1, Body * body2, float x, float y) + RevoluteJoint * Physics::newRevoluteJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) { - return new RevoluteJoint(body1, body2, x, y); + return new RevoluteJoint(body1, body2, x, y, collideConnected); } - PrismaticJoint * Physics::newPrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay) + PrismaticJoint * Physics::newPrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected) { - return new PrismaticJoint(body1, body2, x, y, ax, ay); + return new PrismaticJoint(body1, body2, x, y, ax, ay, collideConnected); } - PulleyJoint * Physics::newPulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio) + 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); + return new PulleyJoint(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, ratio, collideConnected); } - GearJoint * Physics::newGearJoint(Joint * joint1, Joint * joint2, float ratio) + GearJoint * Physics::newGearJoint(Joint * joint1, Joint * joint2, float ratio, bool collideConnected) { - return new GearJoint(joint1, joint2, ratio); + return new GearJoint(joint1, joint2, ratio, collideConnected); } - FrictionJoint * Physics::newFrictionJoint(Body * body1, Body * body2, float x, float y) + FrictionJoint * Physics::newFrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) { - return new FrictionJoint(body1, body2, x, y); + return new FrictionJoint(body1, body2, x, y, collideConnected); } - WeldJoint * Physics::newWeldJoint(Body * body1, Body * body2, float x, float y) + WeldJoint * Physics::newWeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) { - return new WeldJoint(body1, body2, x, y); + return new WeldJoint(body1, body2, x, y, collideConnected); } - WheelJoint * Physics::newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay) + WheelJoint * Physics::newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected) { - return new WheelJoint(body1, body2, x, y, ax, ay); + return new WheelJoint(body1, body2, x, y, ax, ay, collideConnected); } - RopeJoint * Physics::newRopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength) + 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); + return new RopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); } } // box2d diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 94839e865..267a159de 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -158,7 +158,7 @@ namespace box2d * @param x2 Anchor2 along the x-axis. (World coordinates) * @param y2 Anchor2 along the y-axis. (World coordinates) **/ - DistanceJoint * newDistanceJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2); + 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. @@ -172,7 +172,7 @@ namespace box2d * @param x Anchor along the x-axis. (World coordinates) * @param y Anchor along the y-axis. (World coordinates) **/ - RevoluteJoint * newRevoluteJoint(Body * body1, Body * body2, float x, float y); + RevoluteJoint * newRevoluteJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); /** * Creates a new PrismaticJoint connecting body1 with body2. @@ -181,7 +181,7 @@ namespace box2d * @param ax The x-component of the world-axis. * @param ay The y-component of the world-axis. **/ - PrismaticJoint * newPrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay); + PrismaticJoint * newPrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected); /** * Creates a new PulleyJoint connecting body1 with body2. @@ -191,7 +191,7 @@ namespace box2d * @param anchor2 World anchor on body2. * @param ratio The pulley ratio. **/ - PulleyJoint * newPulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio); + 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. @@ -199,21 +199,21 @@ namespace box2d * @param joint2 The second joint. * @param ratio The gear ratio. **/ - GearJoint * newGearJoint(Joint * joint1, Joint * joint2, float ratio); + GearJoint * newGearJoint(Joint * joint1, Joint * joint2, float ratio, bool collideConnected); /** * Creates a new FrictionJoint connecting body1 with body2. * @param x Anchor along the x-axis. (World coordinates) * @param y Anchor along the y-axis. (World coordinates) **/ - FrictionJoint * newFrictionJoint(Body * body1, Body * body2, float x, float y); + FrictionJoint * newFrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); /** * Creates a new WeldJoint connecting body1 with body2. * @param x Anchor along the x-axis. (World coordinates) * @param y Anchor along the y-axis. (World coordinates) **/ - WeldJoint * newWeldJoint(Body * body1, Body * body2, float x, float y); + WeldJoint * newWeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); /** * Creates a new WheelJoint connecting body1 with body2. @@ -222,7 +222,7 @@ namespace box2d * @param ax The x-component of the world-axis. * @param ay The y-component of the world-axis. **/ - WheelJoint * newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay); + WheelJoint * newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected); /** * Creates a new RopeJoint connecting body1 with body2. @@ -232,7 +232,7 @@ namespace box2d * @param y2 Anchor2 along the y-axis. (Local coordinates) * @param maxLength The maximum distance for the bodies. **/ - RopeJoint * newRopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength); + RopeJoint * newRopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected); }; // Physics diff --git a/src/modules/physics/box2d/PrismaticJoint.cpp b/src/modules/physics/box2d/PrismaticJoint.cpp index 4556073a7..57ae56b4b 100644 --- a/src/modules/physics/box2d/PrismaticJoint.cpp +++ b/src/modules/physics/box2d/PrismaticJoint.cpp @@ -30,7 +30,7 @@ namespace physics { namespace box2d { - PrismaticJoint::PrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay) + PrismaticJoint::PrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected) : Joint(body1, body2), joint(NULL) { b2PrismaticJointDef def; @@ -39,6 +39,7 @@ namespace box2d def.lowerTranslation = 0.0f; def.upperTranslation = 100.0f; def.enableLimit = true; + def.collideConnected = collideConnected; joint = (b2PrismaticJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/PrismaticJoint.h b/src/modules/physics/box2d/PrismaticJoint.h index 38b7787e9..5e0c39222 100644 --- a/src/modules/physics/box2d/PrismaticJoint.h +++ b/src/modules/physics/box2d/PrismaticJoint.h @@ -46,7 +46,7 @@ namespace box2d /** * Creates a new PrismaticJoint connecting body1 and body2. **/ - PrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay); + PrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected); virtual ~PrismaticJoint(); diff --git a/src/modules/physics/box2d/PulleyJoint.cpp b/src/modules/physics/box2d/PulleyJoint.cpp index d45c850da..387a75d41 100644 --- a/src/modules/physics/box2d/PulleyJoint.cpp +++ b/src/modules/physics/box2d/PulleyJoint.cpp @@ -30,12 +30,13 @@ namespace physics { namespace box2d { - PulleyJoint::PulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio) + PulleyJoint::PulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected) : Joint(body1, body2), joint(NULL) { b2PulleyJointDef def; def.Initialize(body1->body, body2->body, world->scaleDown(groundAnchor1), world->scaleDown(groundAnchor2), \ world->scaleDown(anchor1), world->scaleDown(anchor2), ratio); + def.collideConnected = collideConnected; joint = (b2PulleyJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/PulleyJoint.h b/src/modules/physics/box2d/PulleyJoint.h index a352c738a..ba1eb201f 100644 --- a/src/modules/physics/box2d/PulleyJoint.h +++ b/src/modules/physics/box2d/PulleyJoint.h @@ -46,7 +46,7 @@ namespace box2d /** * Creates a PulleyJoint connecting body1 to body2. **/ - PulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio); + PulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected); virtual ~PulleyJoint(); diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index d725efa6e..cf22a195a 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -32,11 +32,12 @@ namespace physics { namespace box2d { - RevoluteJoint::RevoluteJoint(Body * body1, Body * body2, float x, float y) + 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, world->scaleDown(b2Vec2(x,y))); + def.collideConnected = collideConnected; joint = (b2RevoluteJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/RevoluteJoint.h b/src/modules/physics/box2d/RevoluteJoint.h index 51acf26fe..4f5a57064 100644 --- a/src/modules/physics/box2d/RevoluteJoint.h +++ b/src/modules/physics/box2d/RevoluteJoint.h @@ -46,7 +46,7 @@ namespace box2d /** * Creates a new RevoluteJoint connecting body1 and body2. **/ - RevoluteJoint(Body * body1, Body * body2, float x, float y); + RevoluteJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); virtual ~RevoluteJoint(); diff --git a/src/modules/physics/box2d/RopeJoint.cpp b/src/modules/physics/box2d/RopeJoint.cpp index 5cbd26698..6becef476 100644 --- a/src/modules/physics/box2d/RopeJoint.cpp +++ b/src/modules/physics/box2d/RopeJoint.cpp @@ -30,7 +30,7 @@ namespace physics { namespace box2d { - RopeJoint::RopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength) + 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; @@ -39,6 +39,7 @@ namespace box2d def.localAnchorA = world->scaleDown(b2Vec2(x1,y1)); def.localAnchorB = world->scaleDown(b2Vec2(x2,y2)); def.maxLength = world->scaleDown(maxLength); + def.collideConnected = collideConnected; joint = (b2RopeJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/RopeJoint.h b/src/modules/physics/box2d/RopeJoint.h index 886f459cd..0d3244b1c 100644 --- a/src/modules/physics/box2d/RopeJoint.h +++ b/src/modules/physics/box2d/RopeJoint.h @@ -44,7 +44,7 @@ namespace box2d /** * Creates a RopeJoint connecting body1 to body2. **/ - RopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength); + RopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected); virtual ~RopeJoint(); diff --git a/src/modules/physics/box2d/WeldJoint.cpp b/src/modules/physics/box2d/WeldJoint.cpp index 05cb7647f..1b07e04b9 100644 --- a/src/modules/physics/box2d/WeldJoint.cpp +++ b/src/modules/physics/box2d/WeldJoint.cpp @@ -32,11 +32,12 @@ namespace physics { namespace box2d { - WeldJoint::WeldJoint(Body * body1, Body * body2, float x, float y) + WeldJoint::WeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) : Joint(body1, body2), joint(NULL) { b2WeldJointDef def; def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); + def.collideConnected = collideConnected; joint = (b2WeldJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/WeldJoint.h b/src/modules/physics/box2d/WeldJoint.h index ce38a3759..c8bb6856c 100644 --- a/src/modules/physics/box2d/WeldJoint.h +++ b/src/modules/physics/box2d/WeldJoint.h @@ -45,7 +45,7 @@ namespace box2d /** * Creates a new WeldJoint connecting body1 and body2. **/ - WeldJoint(Body * body1, Body * body2, float x, float y); + WeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); virtual ~WeldJoint(); diff --git a/src/modules/physics/box2d/WheelJoint.cpp b/src/modules/physics/box2d/WheelJoint.cpp index 01f836338..5ccd7099a 100644 --- a/src/modules/physics/box2d/WheelJoint.cpp +++ b/src/modules/physics/box2d/WheelJoint.cpp @@ -30,12 +30,13 @@ namespace physics { namespace box2d { - WheelJoint::WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay) + WheelJoint::WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected) : Joint(body1, body2), joint(NULL) { b2WheelJointDef def; def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y)), b2Vec2(ax,ay)); + def.collideConnected = collideConnected; joint = (b2WheelJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/WheelJoint.h b/src/modules/physics/box2d/WheelJoint.h index 431ca6fa7..eb4053636 100644 --- a/src/modules/physics/box2d/WheelJoint.h +++ b/src/modules/physics/box2d/WheelJoint.h @@ -47,7 +47,7 @@ namespace box2d /** * Creates a new WheelJoint connecting body1 and body2. **/ - WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay); + WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected); virtual ~WheelJoint(); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index f72f6f6bd..90c75150e 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -136,7 +136,8 @@ namespace box2d float y1 = (float)luaL_checknumber(L, 4); float x2 = (float)luaL_checknumber(L, 5); float y2 = (float)luaL_checknumber(L, 6); - DistanceJoint * j = instance->newDistanceJoint(body1, body2, x1, y1, x2, y2); + bool collideConnected = luax_optboolean(L, 7, false); + DistanceJoint * j = instance->newDistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected); luax_newtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, (void*)j); return 1; } @@ -157,7 +158,8 @@ namespace box2d Body * body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); float x = (float)luaL_checknumber(L, 3); float y = (float)luaL_checknumber(L, 4); - RevoluteJoint * j = instance->newRevoluteJoint(body1, body2, x, y); + bool collideConnected = luax_optboolean(L, 5, false); + RevoluteJoint * j = instance->newRevoluteJoint(body1, body2, x, y, collideConnected); luax_newtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, (void*)j); return 1; } @@ -170,7 +172,8 @@ namespace box2d float y = (float)luaL_checknumber(L, 4); float ax = (float)luaL_checknumber(L, 5); float ay = (float)luaL_checknumber(L, 6); - PrismaticJoint * j = instance->newPrismaticJoint(body1, body2, x, y, ax, ay); + bool collideConnected = luax_optboolean(L, 7, false); + PrismaticJoint * j = instance->newPrismaticJoint(body1, body2, x, y, ax, ay, collideConnected); luax_newtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, (void*)j); return 1; } @@ -188,8 +191,9 @@ namespace box2d 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 = instance->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio); + PulleyJoint * j = instance->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio, collideConnected); luax_newtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, (void*)j); return 1; } @@ -199,8 +203,9 @@ namespace box2d 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 = instance->newGearJoint(joint1, joint2, ratio); + GearJoint * j = instance->newGearJoint(joint1, joint2, ratio, collideConnected); luax_newtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, (void*)j); return 1; } @@ -211,7 +216,8 @@ namespace box2d Body * body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); float x = (float)luaL_checknumber(L, 3); float y = (float)luaL_checknumber(L, 4); - FrictionJoint * j = instance->newFrictionJoint(body1, body2, x, y); + bool collideConnected = luax_optboolean(L, 5, false); + FrictionJoint * j = instance->newFrictionJoint(body1, body2, x, y, collideConnected); luax_newtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, (void*)j); return 1; } @@ -222,7 +228,8 @@ namespace box2d Body * body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); float x = (float)luaL_checknumber(L, 3); float y = (float)luaL_checknumber(L, 4); - WeldJoint * j = instance->newWeldJoint(body1, body2, x, y); + bool collideConnected = luax_optboolean(L, 5, false); + WeldJoint * j = instance->newWeldJoint(body1, body2, x, y, collideConnected); luax_newtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, (void*)j); return 1; } @@ -235,7 +242,8 @@ namespace box2d float y = (float)luaL_checknumber(L, 4); float ax = (float)luaL_checknumber(L, 5); float ay = (float)luaL_checknumber(L, 6); - WheelJoint * j = instance->newWheelJoint(body1, body2, x, y, ax, ay); + bool collideConnected = luax_optboolean(L, 7, false); + WheelJoint * j = instance->newWheelJoint(body1, body2, x, y, ax, ay, collideConnected); luax_newtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, (void*)j); return 1; } @@ -249,7 +257,8 @@ namespace box2d float x2 = (float)luaL_checknumber(L, 5); float y2 = (float)luaL_checknumber(L, 6); float maxLength = (float)luaL_checknumber(L, 7); - RopeJoint * j = instance->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength); + bool collideConnected = luax_optboolean(L, 8, false); + RopeJoint * j = instance->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); luax_newtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, (void*)j); return 1; } From d8f3db668213b04b380ca41e68ef42859b63536a Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 15 Sep 2011 15:31:09 -0400 Subject: [PATCH 178/384] exposed new Shape functions --HG-- branch : box2d-update --- src/modules/physics/box2d/Shape.cpp | 75 ++++++++++++++++++- src/modules/physics/box2d/Shape.h | 11 ++- .../physics/box2d/wrap_CircleShape.cpp | 6 ++ src/modules/physics/box2d/wrap_EdgeShape.cpp | 6 ++ .../physics/box2d/wrap_PolygonShape.cpp | 6 ++ src/modules/physics/box2d/wrap_Shape.cpp | 56 ++++++++++++++ src/modules/physics/box2d/wrap_Shape.h | 8 ++ 7 files changed, 165 insertions(+), 3 deletions(-) diff --git a/src/modules/physics/box2d/Shape.cpp b/src/modules/physics/box2d/Shape.cpp index e5ab9f7c7..177ebfad7 100644 --- a/src/modules/physics/box2d/Shape.cpp +++ b/src/modules/physics/box2d/Shape.cpp @@ -33,8 +33,8 @@ namespace physics { namespace box2d { - Shape::Shape() - : shape(NULL) + Shape::Shape(World * world) + : world(world), shape(NULL) { } @@ -59,6 +59,77 @@ namespace box2d return SHAPE_INVALID; } } + + float Shape::getRadius() const + { + return world->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(world->scaleDown(b2Vec2(x, y)), b2Rot(r)); + return shape->TestPoint(transform, world->scaleDown(point)); + } + + int Shape::rayCast(lua_State * L) const + { + float p1x = world->scaleDown((float)luaL_checknumber(L, 1)); + float p1y = world->scaleDown((float)luaL_checknumber(L, 2)); + float p2x = world->scaleDown((float)luaL_checknumber(L, 3)); + float p2y = world->scaleDown((float)luaL_checknumber(L, 4)); + float maxFraction = (float)luaL_checknumber(L, 5); + float x = world->scaleDown((float)luaL_checknumber(L, 6)); + float y = world->scaleDown((float)luaL_checknumber(L, 7)); + float r = (float)luaL_checknumber(L, 8); + int childIndex = (int)luaL_optint(L, 9, 0); + b2RayCastInput input; + input.p1.Set(p1x, p1y); + input.p2.Set(p2x, p2y); + input.maxFraction = maxFraction; + b2Transform transform(b2Vec2(x, y), b2Rot(r)); + b2RayCastOutput output; + shape->RayCast(&output, input, transform, childIndex); + lua_pushnumber(L, world->scaleUp(output.normal.x)); + lua_pushnumber(L, world->scaleUp(output.normal.y)); + lua_pushnumber(L, output.fraction); + return 3; + } + + int Shape::computeAABB(lua_State * L) const + { + float x = world->scaleDown((float)luaL_checknumber(L, 1)); + float y = world->scaleDown((float)luaL_checknumber(L, 2)); + float r = (float)luaL_checknumber(L, 3); + int childIndex = (int)luaL_optint(L, 4, 0); + b2Transform transform(b2Vec2(x, y), b2Rot(r)); + b2AABB box; + shape->ComputeAABB(&box, transform, childIndex); + box = world->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 = world->scaleDown((float)luaL_checknumber(L, 1)); + b2MassData data; + shape->ComputeMass(&data, density); + b2Vec2 center = world->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; + } } // box2d } // physics diff --git a/src/modules/physics/box2d/Shape.h b/src/modules/physics/box2d/Shape.h index bb77239f3..e89e10d2e 100644 --- a/src/modules/physics/box2d/Shape.h +++ b/src/modules/physics/box2d/Shape.h @@ -44,6 +44,9 @@ namespace box2d **/ class Shape : public love::physics::Shape { + private: + World * world; // We need a reference for scaling up/down + protected: // The Box2D shape. @@ -54,7 +57,7 @@ namespace box2d /** * Creates a Shape. **/ - Shape(); + Shape(World * world); virtual ~Shape(); @@ -63,6 +66,12 @@ namespace box2d * 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; }; } // box2d diff --git a/src/modules/physics/box2d/wrap_CircleShape.cpp b/src/modules/physics/box2d/wrap_CircleShape.cpp index a17bef0d9..f205dfa5e 100644 --- a/src/modules/physics/box2d/wrap_CircleShape.cpp +++ b/src/modules/physics/box2d/wrap_CircleShape.cpp @@ -51,6 +51,12 @@ namespace box2d { "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 }, { "destroy", w_Shape_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_EdgeShape.cpp b/src/modules/physics/box2d/wrap_EdgeShape.cpp index be64c4feb..3a8f23276 100644 --- a/src/modules/physics/box2d/wrap_EdgeShape.cpp +++ b/src/modules/physics/box2d/wrap_EdgeShape.cpp @@ -34,6 +34,12 @@ namespace box2d static const luaL_Reg functions[] = { // 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 }, { "destroy", w_Shape_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_PolygonShape.cpp b/src/modules/physics/box2d/wrap_PolygonShape.cpp index 8b8a5cc28..e86029fc6 100644 --- a/src/modules/physics/box2d/wrap_PolygonShape.cpp +++ b/src/modules/physics/box2d/wrap_PolygonShape.cpp @@ -42,6 +42,12 @@ namespace box2d { "getPoints", w_PolygonShape_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 }, { "destroy", w_Shape_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Shape.cpp b/src/modules/physics/box2d/wrap_Shape.cpp index 510b75b16..23ebe6284 100644 --- a/src/modules/physics/box2d/wrap_Shape.cpp +++ b/src/modules/physics/box2d/wrap_Shape.cpp @@ -40,6 +40,56 @@ namespace box2d 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, 1); + float y = (float)luaL_checknumber(L, 2); + float r = (float)luaL_checknumber(L, 3); + float px = (float)luaL_checknumber(L, 4); + float py = (float)luaL_checknumber(L, 5); + 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); + return t->rayCast(L); + } + + 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); + } int w_Shape_destroy(lua_State * L) { @@ -53,6 +103,12 @@ namespace box2d 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 }, { "destroy", w_Shape_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Shape.h b/src/modules/physics/box2d/wrap_Shape.h index 02950111d..cc26c5c2b 100644 --- a/src/modules/physics/box2d/wrap_Shape.h +++ b/src/modules/physics/box2d/wrap_Shape.h @@ -33,6 +33,14 @@ 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); + int w_Shape_destroy(lua_State * L); int luaopen_shape(lua_State * L); From 1fa99d022a3e25fef336ac7fc0f74b5d4316ec4f Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 15 Sep 2011 15:35:11 -0400 Subject: [PATCH 179/384] Documented collideConnected flag --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 267a159de..ed2ca3d54 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -157,6 +157,7 @@ namespace box2d * @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); @@ -171,6 +172,7 @@ namespace box2d * 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); @@ -180,6 +182,7 @@ namespace box2d * @param y World-anchor 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 x, float y, float ax, float ay, bool collideConnected); @@ -190,6 +193,7 @@ namespace box2d * @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); @@ -198,6 +202,7 @@ namespace box2d * @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); @@ -205,6 +210,7 @@ namespace box2d * Creates a new FrictionJoint 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. **/ FrictionJoint * newFrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); @@ -212,6 +218,7 @@ namespace box2d * Creates a new WeldJoint 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. **/ WeldJoint * newWeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); @@ -221,6 +228,7 @@ namespace box2d * @param y Anchor 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 x, float y, float ax, float ay, bool collideConnected); @@ -231,6 +239,7 @@ namespace box2d * @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); From e69cafe86889a57e270937d895c0d9437b4762e8 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 15 Sep 2011 16:13:54 -0400 Subject: [PATCH 180/384] Switched get/setMeter from being a World method to a love.physics function --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 41 +++++------ src/modules/physics/box2d/Contact.cpp | 15 ++-- src/modules/physics/box2d/DistanceJoint.cpp | 7 +- src/modules/physics/box2d/FrictionJoint.cpp | 3 +- src/modules/physics/box2d/Joint.cpp | 9 +-- src/modules/physics/box2d/MouseJoint.cpp | 9 +-- src/modules/physics/box2d/Physics.cpp | 64 +++++++++++++++++ src/modules/physics/box2d/Physics.h | 73 ++++++++++++++++++++ src/modules/physics/box2d/PrismaticJoint.cpp | 29 ++++---- src/modules/physics/box2d/PulleyJoint.cpp | 17 ++--- src/modules/physics/box2d/RevoluteJoint.cpp | 3 +- src/modules/physics/box2d/RopeJoint.cpp | 9 +-- src/modules/physics/box2d/Shape.cpp | 37 +++++----- src/modules/physics/box2d/Shape.h | 4 +- src/modules/physics/box2d/WeldJoint.cpp | 3 +- src/modules/physics/box2d/WheelJoint.cpp | 25 +++---- src/modules/physics/box2d/World.cpp | 71 ++----------------- src/modules/physics/box2d/World.h | 71 ------------------- src/modules/physics/box2d/wrap_Physics.cpp | 15 ++++ src/modules/physics/box2d/wrap_Physics.h | 2 + src/modules/physics/box2d/wrap_World.cpp | 17 ----- src/modules/physics/box2d/wrap_World.h | 2 - 22 files changed, 270 insertions(+), 256 deletions(-) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 5487414c8..4d51f12c3 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -23,6 +23,7 @@ #include #include "World.h" +#include "Physics.h" namespace love { @@ -35,7 +36,7 @@ namespace box2d { world->retain(); b2BodyDef def; - def.position = world->scaleDown(p); + def.position = Physics::scaleDown(p); def.massData.mass = m; def.massData.I = i; body = world->world->CreateBody(&def); @@ -50,24 +51,24 @@ namespace box2d float Body::getX() { - return world->scaleUp(body->GetPosition().x); + return Physics::scaleUp(body->GetPosition().x); } float Body::getY() { - return world->scaleUp(body->GetPosition().y); + return Physics::scaleUp(body->GetPosition().y); } void Body::getPosition(float & x_o, float & y_o) { - b2Vec2 v = world->scaleUp(body->GetPosition()); + 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 = world->scaleUp(body->GetLinearVelocity()); + b2Vec2 v = Physics::scaleUp(body->GetLinearVelocity()); x_o = v.x; y_o = v.y; } @@ -79,14 +80,14 @@ namespace box2d void Body::getWorldCenter(float & x_o, float & y_o) { - b2Vec2 v = world->scaleUp(body->GetWorldCenter()); + 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 = world->scaleUp(body->GetLocalCenter()); + b2Vec2 v = Physics::scaleUp(body->GetLocalCenter()); x_o = v.x; y_o = v.y; } @@ -123,7 +124,7 @@ namespace box2d void Body::applyImpulse(float jx, float jy, float rx, float ry) { - body->ApplyImpulse(b2Vec2(jx, jy), world->scaleDown(b2Vec2(rx, ry))); + body->ApplyImpulse(b2Vec2(jx, jy), Physics::scaleDown(b2Vec2(rx, ry))); } void Body::applyTorque(float t) @@ -133,7 +134,7 @@ namespace box2d void Body::applyForce(float fx, float fy, float rx, float ry) { - body->ApplyForce(b2Vec2(fx, fy), world->scaleDown(b2Vec2(rx, ry))); + body->ApplyForce(b2Vec2(fx, fy), Physics::scaleDown(b2Vec2(rx, ry))); } void Body::applyForce(float fx, float fy) @@ -143,17 +144,17 @@ namespace box2d void Body::setX(float x) { - body->SetXForm(world->scaleDown(b2Vec2(x, getY())), getAngle()); + body->SetXForm(Physics::scaleDown(b2Vec2(x, getY())), getAngle()); } void Body::setY(float y) { - body->SetXForm(world->scaleDown(b2Vec2(getX(), y)), getAngle()); + body->SetXForm(Physics::scaleDown(b2Vec2(getX(), y)), getAngle()); } void Body::setLinearVelocity(float x, float y) { - body->SetLinearVelocity(world->scaleDown(b2Vec2(x, y))); + body->SetLinearVelocity(Physics::scaleDown(b2Vec2(x, y))); } void Body::setAngle(float d) @@ -168,7 +169,7 @@ namespace box2d void Body::setPosition(float x, float y) { - body->SetXForm(world->scaleDown(b2Vec2(x, y)), body->GetAngle()); + body->SetXForm(Physics::scaleDown(b2Vec2(x, y)), body->GetAngle()); } void Body::setAngularDamping(float d) @@ -189,7 +190,7 @@ namespace box2d void Body::setMass(float x, float y, float m, float i) { b2MassData massData; - massData.center = world->scaleDown(b2Vec2(x, y)); + massData.center = Physics::scaleDown(b2Vec2(x, y)); massData.mass = m; massData.I = i; body->SetMass(&massData); @@ -206,42 +207,42 @@ namespace box2d void Body::getWorldPoint(float x, float y, float & x_o, float & y_o) { - b2Vec2 v = world->scaleUp(body->GetWorldPoint(world->scaleDown(b2Vec2(x, y)))); + 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 = world->scaleUp(body->GetWorldVector(world->scaleDown(b2Vec2(x, y)))); + b2Vec2 v = Physics::scaleUp(body->GetWorldVector(Physics::scaleDown(b2Vec2(x, y)))); x_o = v.x; y_o = v.y; } void Body::getLocalPoint(float x, float y, float & x_o, float & y_o) { - b2Vec2 v = world->scaleUp(body->GetLocalPoint(world->scaleDown(b2Vec2(x, y)))); + 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 = world->scaleUp(body->GetLocalVector(world->scaleDown(b2Vec2(x, y)))); + 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 = world->scaleUp(body->GetLinearVelocityFromWorldPoint(world->scaleDown(b2Vec2(x, y)))); + 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 = world->scaleUp(body->GetLinearVelocityFromLocalPoint(world->scaleDown(b2Vec2(x, y)))); + b2Vec2 v = Physics::scaleUp(body->GetLinearVelocityFromLocalPoint(Physics::scaleDown(b2Vec2(x, y)))); x_o = v.x; y_o = v.y; } diff --git a/src/modules/physics/box2d/Contact.cpp b/src/modules/physics/box2d/Contact.cpp index 8495920be..f048e8c62 100644 --- a/src/modules/physics/box2d/Contact.cpp +++ b/src/modules/physics/box2d/Contact.cpp @@ -20,6 +20,7 @@ #include "Contact.h" #include "World.h" +#include "Physics.h" namespace love { @@ -41,30 +42,30 @@ namespace box2d int Contact::getPosition(lua_State * L) { love::luax_assert_argc(L, 1, 1); - lua_pushnumber(L, world->scaleUp(point.position.x)); - lua_pushnumber(L, world->scaleUp(point.position.y)); + lua_pushnumber(L, Physics::scaleUp(point.position.x)); + lua_pushnumber(L, Physics::scaleUp(point.position.y)); return 2; } int Contact::getVelocity(lua_State * L) { love::luax_assert_argc(L, 1, 1); - lua_pushnumber(L, world->scaleUp(point.velocity.x)); - lua_pushnumber(L, world->scaleUp(point.velocity.y)); + lua_pushnumber(L, Physics::scaleUp(point.velocity.x)); + lua_pushnumber(L, Physics::scaleUp(point.velocity.y)); return 2; } int Contact::getNormal(lua_State * L) { love::luax_assert_argc(L, 1, 1); - lua_pushnumber(L, world->scaleUp(point.normal.x)); - lua_pushnumber(L, world->scaleUp(point.normal.y)); + lua_pushnumber(L, Physics::scaleUp(point.normal.x)); + lua_pushnumber(L, Physics::scaleUp(point.normal.y)); return 2; } float Contact::getSeparation() const { - return world->scaleUp(point.separation); + return Physics::scaleUp(point.separation); } float Contact::getFriction() const diff --git a/src/modules/physics/box2d/DistanceJoint.cpp b/src/modules/physics/box2d/DistanceJoint.cpp index 8ffa8ca9c..3ecd450d8 100644 --- a/src/modules/physics/box2d/DistanceJoint.cpp +++ b/src/modules/physics/box2d/DistanceJoint.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -34,7 +35,7 @@ namespace box2d : Joint(body1, body2), joint(NULL) { b2DistanceJointDef def; - def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x1,y1)), world->scaleDown(b2Vec2(x2,y2))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x1,y1)), Physics::scaleDown(b2Vec2(x2,y2))); def.collideConnected = collideConnected; joint = (b2DistanceJoint*)createJoint(&def); } @@ -47,12 +48,12 @@ namespace box2d void DistanceJoint::setLength(float length) { - joint->SetLength(world->scaleDown(length)); + joint->SetLength(Physics::scaleDown(length)); } float DistanceJoint::getLength() const { - return world->scaleUp(joint->GetLength()); + return Physics::scaleUp(joint->GetLength()); } void DistanceJoint::setFrequency(float hz) diff --git a/src/modules/physics/box2d/FrictionJoint.cpp b/src/modules/physics/box2d/FrictionJoint.cpp index f606199dd..699bd478a 100644 --- a/src/modules/physics/box2d/FrictionJoint.cpp +++ b/src/modules/physics/box2d/FrictionJoint.cpp @@ -25,6 +25,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -36,7 +37,7 @@ namespace box2d : Joint(body1, body2), joint(NULL) { b2FrictionJointDef def; - def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y))); def.collideConnected = collideConnected; joint = (b2FrictionJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/Joint.cpp b/src/modules/physics/box2d/Joint.cpp index 79cf039f0..1aa48f00d 100644 --- a/src/modules/physics/box2d/Joint.cpp +++ b/src/modules/physics/box2d/Joint.cpp @@ -26,6 +26,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -87,10 +88,10 @@ namespace box2d int Joint::getAnchors(lua_State * L) { - lua_pushnumber(L, world->scaleUp(joint->GetAnchorA().x)); - lua_pushnumber(L, world->scaleUp(joint->GetAnchorA().y)); - lua_pushnumber(L, world->scaleUp(joint->GetAnchorB().x)); - lua_pushnumber(L, world->scaleUp(joint->GetAnchorB().y)); + 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; } diff --git a/src/modules/physics/box2d/MouseJoint.cpp b/src/modules/physics/box2d/MouseJoint.cpp index 5fee8b23f..9ea217b6f 100644 --- a/src/modules/physics/box2d/MouseJoint.cpp +++ b/src/modules/physics/box2d/MouseJoint.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -38,7 +39,7 @@ namespace box2d def.bodyA = body1->world->getGroundBody(); def.bodyB = body1->body; def.maxForce = 1000.0f * body1->body->GetMass(); - def.target = body1->world->scaleDown(b2Vec2(x,y)); + def.target = Physics::scaleDown(b2Vec2(x,y)); joint = (b2MouseJoint*)createJoint(&def); } @@ -50,13 +51,13 @@ namespace box2d void MouseJoint::setTarget(float x, float y) { - joint->SetTarget(world->scaleDown(b2Vec2(x, y))); + joint->SetTarget(Physics::scaleDown(b2Vec2(x, y))); } int MouseJoint::getTarget(lua_State * L) { - lua_pushnumber(L, world->scaleUp(joint->GetTarget().x)); - lua_pushnumber(L, world->scaleUp(joint->GetTarget().y)); + lua_pushnumber(L, Physics::scaleUp(joint->GetTarget().x)); + lua_pushnumber(L, Physics::scaleUp(joint->GetTarget().y)); return 2; } diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index b8d781eed..6a270036e 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -193,6 +193,70 @@ namespace box2d { return new RopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); } + + + + void Physics::setMeter(int meter) + { + Physics::meter = meter; + } + + 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 diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index ed2ca3d54..7dd2c6322 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -50,6 +50,11 @@ namespace box2d { class Physics : public Module { + private: + + // The length of one meter in pixels. + static int meter; + public: // Implements Module. @@ -242,6 +247,74 @@ namespace box2d * @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); + + /** + * Sets the number of pixels in one meter. + * @param pixels The number of pixels in one meter. (1m ~= 3.3ft). + **/ + static void setMeter(int meter); + + /** + * Gets the number of pixels in one meter. + * @param pixels 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 v 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 v The unscaled input AABB. + * @return The scaled AABB. + **/ + static b2AABB scaleUp(const b2AABB & aabb); }; // Physics diff --git a/src/modules/physics/box2d/PrismaticJoint.cpp b/src/modules/physics/box2d/PrismaticJoint.cpp index 57ae56b4b..17b6b1c7e 100644 --- a/src/modules/physics/box2d/PrismaticJoint.cpp +++ b/src/modules/physics/box2d/PrismaticJoint.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -35,7 +36,7 @@ namespace box2d { b2PrismaticJointDef def; - def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y)), b2Vec2(ax,ay)); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y)), b2Vec2(ax,ay)); def.lowerTranslation = 0.0f; def.upperTranslation = 100.0f; def.enableLimit = true; @@ -51,12 +52,12 @@ namespace box2d float PrismaticJoint::getJointTranslation() const { - return world->scaleDown(joint->GetJointTranslation()); + return Physics::scaleDown(joint->GetJointTranslation()); } float PrismaticJoint::getJointSpeed() const { - return world->scaleDown(joint->GetJointSpeed()); + return Physics::scaleDown(joint->GetJointSpeed()); } void PrismaticJoint::enableMotor(bool motor) @@ -71,22 +72,22 @@ namespace box2d void PrismaticJoint::setMaxMotorForce(float force) { - joint->SetMaxMotorForce(world->scaleDown(force)); + joint->SetMaxMotorForce(Physics::scaleDown(force)); } void PrismaticJoint::setMotorSpeed(float speed) { - joint->SetMotorSpeed(world->scaleDown(speed)); + joint->SetMotorSpeed(Physics::scaleDown(speed)); } float PrismaticJoint::getMotorSpeed() const { - return world->scaleUp(joint->GetMotorSpeed()); + return Physics::scaleUp(joint->GetMotorSpeed()); } float PrismaticJoint::getMotorForce(float inv_dt) const { - return world->scaleUp(joint->GetMotorForce(inv_dt)); + return Physics::scaleUp(joint->GetMotorForce(inv_dt)); } void PrismaticJoint::enableLimit(bool limit) @@ -101,33 +102,33 @@ namespace box2d void PrismaticJoint::setUpperLimit(float limit) { - joint->SetLimits(joint->GetLowerLimit(), world->scaleDown(limit)); + joint->SetLimits(joint->GetLowerLimit(), Physics::scaleDown(limit)); } void PrismaticJoint::setLowerLimit(float limit) { - joint->SetLimits(world->scaleDown(limit), joint->GetUpperLimit()); + joint->SetLimits(Physics::scaleDown(limit), joint->GetUpperLimit()); } void PrismaticJoint::setLimits(float lower, float upper) { - joint->SetLimits(world->scaleDown(lower), world->scaleDown(upper)); + joint->SetLimits(Physics::scaleDown(lower), Physics::scaleDown(upper)); } float PrismaticJoint::getLowerLimit() const { - return world->scaleUp(joint->GetLowerLimit()); + return Physics::scaleUp(joint->GetLowerLimit()); } float PrismaticJoint::getUpperLimit() const { - return world->scaleUp(joint->GetUpperLimit()); + return Physics::scaleUp(joint->GetUpperLimit()); } int PrismaticJoint::getLimits(lua_State * L) { - lua_pushnumber(L, world->scaleUp(joint->GetLowerLimit())); - lua_pushnumber(L, world->scaleUp(joint->GetUpperLimit())); + lua_pushnumber(L, Physics::scaleUp(joint->GetLowerLimit())); + lua_pushnumber(L, Physics::scaleUp(joint->GetUpperLimit())); return 2; } diff --git a/src/modules/physics/box2d/PulleyJoint.cpp b/src/modules/physics/box2d/PulleyJoint.cpp index 387a75d41..84e449eaf 100644 --- a/src/modules/physics/box2d/PulleyJoint.cpp +++ b/src/modules/physics/box2d/PulleyJoint.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -34,8 +35,8 @@ namespace box2d : Joint(body1, body2), joint(NULL) { b2PulleyJointDef def; - def.Initialize(body1->body, body2->body, world->scaleDown(groundAnchor1), world->scaleDown(groundAnchor2), \ - world->scaleDown(anchor1), world->scaleDown(anchor2), ratio); + def.Initialize(body1->body, body2->body, Physics::scaleDown(groundAnchor1), Physics::scaleDown(groundAnchor2), \ + Physics::scaleDown(anchor1), Physics::scaleDown(anchor2), ratio); def.collideConnected = collideConnected; joint = (b2PulleyJoint*)createJoint(&def); @@ -49,21 +50,21 @@ namespace box2d int PulleyJoint::getGroundAnchors(lua_State * L) { - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorA().x)); - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorA().y)); - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorB().x)); - lua_pushnumber(L, world->scaleUp(joint->GetGroundAnchorB().y)); + 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::getLength1() const { - return world->scaleUp(joint->GetLength1()); + return Physics::scaleUp(joint->GetLength1()); } float PulleyJoint::getLength2() const { - return world->scaleUp(joint->GetLength2()); + return Physics::scaleUp(joint->GetLength2()); } float PulleyJoint::getRatio() const diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index cf22a195a..1a6251c8d 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -25,6 +25,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -36,7 +37,7 @@ namespace box2d : Joint(body1, body2), joint(NULL) { b2RevoluteJointDef def; - def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y))); def.collideConnected = collideConnected; joint = (b2RevoluteJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/RopeJoint.cpp b/src/modules/physics/box2d/RopeJoint.cpp index 6becef476..7516d7311 100644 --- a/src/modules/physics/box2d/RopeJoint.cpp +++ b/src/modules/physics/box2d/RopeJoint.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -36,9 +37,9 @@ namespace box2d b2RopeJointDef def; def.bodyA = body1->body; def.bodyB = body2->body; - def.localAnchorA = world->scaleDown(b2Vec2(x1,y1)); - def.localAnchorB = world->scaleDown(b2Vec2(x2,y2)); - def.maxLength = world->scaleDown(maxLength); + def.localAnchorA = Physics::scaleDown(b2Vec2(x1,y1)); + def.localAnchorB = Physics::scaleDown(b2Vec2(x2,y2)); + def.maxLength = Physics::scaleDown(maxLength); def.collideConnected = collideConnected; joint = (b2RopeJoint*)createJoint(&def); } @@ -51,7 +52,7 @@ namespace box2d float RopeJoint::getMaxLength() const { - return world->scaleUp(joint->GetMaxLength()); + return Physics::scaleUp(joint->GetMaxLength()); } diff --git a/src/modules/physics/box2d/Shape.cpp b/src/modules/physics/box2d/Shape.cpp index 177ebfad7..6b6b99e4e 100644 --- a/src/modules/physics/box2d/Shape.cpp +++ b/src/modules/physics/box2d/Shape.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" // STD #include @@ -33,8 +34,8 @@ namespace physics { namespace box2d { - Shape::Shape(World * world) - : world(world), shape(NULL) + Shape::Shape() + : shape(NULL) { } @@ -62,7 +63,7 @@ namespace box2d float Shape::getRadius() const { - return world->scaleUp(shape->m_radius); + return Physics::scaleUp(shape->m_radius); } int Shape::getChildCount() const @@ -73,19 +74,19 @@ namespace box2d bool Shape::testPoint(float x, float y, float r, float px, float py) const { b2Vec2 point(px, py); - b2Transform transform(world->scaleDown(b2Vec2(x, y)), b2Rot(r)); - return shape->TestPoint(transform, world->scaleDown(point)); + 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 = world->scaleDown((float)luaL_checknumber(L, 1)); - float p1y = world->scaleDown((float)luaL_checknumber(L, 2)); - float p2x = world->scaleDown((float)luaL_checknumber(L, 3)); - float p2y = world->scaleDown((float)luaL_checknumber(L, 4)); + 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 = world->scaleDown((float)luaL_checknumber(L, 6)); - float y = world->scaleDown((float)luaL_checknumber(L, 7)); + 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, 0); b2RayCastInput input; @@ -95,22 +96,22 @@ namespace box2d b2Transform transform(b2Vec2(x, y), b2Rot(r)); b2RayCastOutput output; shape->RayCast(&output, input, transform, childIndex); - lua_pushnumber(L, world->scaleUp(output.normal.x)); - lua_pushnumber(L, world->scaleUp(output.normal.y)); + lua_pushnumber(L, Physics::scaleUp(output.normal.x)); + lua_pushnumber(L, Physics::scaleUp(output.normal.y)); lua_pushnumber(L, output.fraction); return 3; } int Shape::computeAABB(lua_State * L) const { - float x = world->scaleDown((float)luaL_checknumber(L, 1)); - float y = world->scaleDown((float)luaL_checknumber(L, 2)); + 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, 0); b2Transform transform(b2Vec2(x, y), b2Rot(r)); b2AABB box; shape->ComputeAABB(&box, transform, childIndex); - box = world->scaleUp(box); + box = Physics::scaleUp(box); lua_pushnumber(L, box.lowerBound.x); lua_pushnumber(L, box.lowerBound.y); lua_pushnumber(L, box.upperBound.x); @@ -120,10 +121,10 @@ namespace box2d int Shape::computeMass(lua_State * L) const { - float density = world->scaleDown((float)luaL_checknumber(L, 1)); + float density = Physics::scaleDown((float)luaL_checknumber(L, 1)); b2MassData data; shape->ComputeMass(&data, density); - b2Vec2 center = world->scaleUp(data.center); + b2Vec2 center = Physics::scaleUp(data.center); lua_pushnumber(L, center.x); lua_pushnumber(L, center.y); lua_pushnumber(L, data.mass); diff --git a/src/modules/physics/box2d/Shape.h b/src/modules/physics/box2d/Shape.h index e89e10d2e..d388088c3 100644 --- a/src/modules/physics/box2d/Shape.h +++ b/src/modules/physics/box2d/Shape.h @@ -44,8 +44,6 @@ namespace box2d **/ class Shape : public love::physics::Shape { - private: - World * world; // We need a reference for scaling up/down protected: @@ -57,7 +55,7 @@ namespace box2d /** * Creates a Shape. **/ - Shape(World * world); + Shape(); virtual ~Shape(); diff --git a/src/modules/physics/box2d/WeldJoint.cpp b/src/modules/physics/box2d/WeldJoint.cpp index 1b07e04b9..1d1f39494 100644 --- a/src/modules/physics/box2d/WeldJoint.cpp +++ b/src/modules/physics/box2d/WeldJoint.cpp @@ -25,6 +25,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -36,7 +37,7 @@ namespace box2d : Joint(body1, body2), joint(NULL) { b2WeldJointDef def; - def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y))); def.collideConnected = collideConnected; joint = (b2WeldJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/WheelJoint.cpp b/src/modules/physics/box2d/WheelJoint.cpp index 5ccd7099a..93e59a910 100644 --- a/src/modules/physics/box2d/WheelJoint.cpp +++ b/src/modules/physics/box2d/WheelJoint.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -35,7 +36,7 @@ namespace box2d { b2WheelJointDef def; - def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y)), b2Vec2(ax,ay)); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y)), b2Vec2(ax,ay)); def.collideConnected = collideConnected; joint = (b2WheelJoint*)createJoint(&def); } @@ -48,12 +49,12 @@ namespace box2d float WheelJoint::getJointTranslation() const { - return world->scaleDown(joint->GetJointTranslation()); + return Physics::scaleDown(joint->GetJointTranslation()); } float WheelJoint::getJointSpeed() const { - return world->scaleDown(joint->GetJointSpeed()); + return Physics::scaleDown(joint->GetJointSpeed()); } void WheelJoint::enableMotor(bool motor) @@ -68,47 +69,47 @@ namespace box2d void WheelJoint::setMotorSpeed(float speed) { - joint->SetMotorSpeed(world->scaleDown(speed)); + joint->SetMotorSpeed(Physics::scaleDown(speed)); } float WheelJoint::getMotorSpeed() const { - return world->scaleUp(joint->GetMotorSpeed()); + return Physics::scaleUp(joint->GetMotorSpeed()); } void WheelJoint::setMaxMotorTorque(float torque) { - joint->SetMaxMotorTorque(world->scaleDown(torque)); + joint->SetMaxMotorTorque(Physics::scaleDown(torque)); } float WheelJoint::getMaxMotorTorque() const { - return world->scaleUp(joint->GetMaxMotorTorque()); + return Physics::scaleUp(joint->GetMaxMotorTorque()); } float WheelJoint::getMotorTorque(float inv_dt) const { - return world->scaleUp(joint->getMotorTorque(inv_dt)); + return Physics::scaleUp(joint->GetMotorTorque(inv_dt)); } void WheelJoint::setSpringFrequencyHz(float hz) { - joint->SetSpringFrequencyHz(world->scaleDown(hz)); + joint->SetSpringFrequencyHz(Physics::scaleDown(hz)); } float WheelJoint::getSpringFrequencyHz() const { - return world->scaleUp(joint->GetSpringFrequencyHz()); + return Physics::scaleUp(joint->GetSpringFrequencyHz()); } void WheelJoint::setSpringDampingRatio(float ratio) { - joint->SetSpringDampingRatio(world->scaleDown(ratio)); + joint->SetSpringDampingRatio(Physics::scaleDown(ratio)); } float WheelJoint::getSpringDampingRatio() const { - return world->scaleUp(joint->GetSpringDampingRatio()); + return Physics::scaleUp(joint->GetSpringDampingRatio()); } diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index bcb8582a7..d6de02db0 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -22,6 +22,7 @@ #include "Shape.h" #include "Contact.h" +#include "Physics.h" #include namespace love @@ -98,7 +99,7 @@ namespace box2d World::World(b2AABB aabb) : world(NULL), meter(DEFAULT_METER) { - world = new b2World(scaleDown(aabb), b2Vec2(0,0), true); + world = new b2World(Physics::scaleDown(aabb), b2Vec2(0,0), true); world->SetContactListener(this); b2BodyDef def; groundBody = world->CreateBody(def); @@ -107,7 +108,7 @@ namespace box2d World::World(b2AABB aabb, b2Vec2 gravity, bool sleep, int meter) : world(NULL), meter(meter) { - world = new b2World(scaleDown(aabb), scaleDown(gravity), sleep); + world = new b2World(Physics::scaleDown(aabb), Physics::scaleDown(gravity), sleep); world->SetContactListener(this); } @@ -183,12 +184,12 @@ namespace box2d void World::setGravity(float x, float y) { - world->SetGravity(scaleDown(b2Vec2(x, y))); + world->SetGravity(Physics::scaleDown(b2Vec2(x, y))); } int World::getGravity(lua_State * L) { - b2Vec2 v = scaleUp(world->m_gravity); + b2Vec2 v = Physics::scaleUp(world->m_gravity); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); return 2; @@ -213,68 +214,6 @@ namespace box2d { return world->GetJointCount(); } - - void World::setMeter(int meter) - { - this->meter = meter; - } - - int World::getMeter() const - { - return this->meter; - } - - void World::scaleDown(float & x, float & y) - { - x /= (float)meter; - y /= (float)meter; - } - - void World::scaleUp(float & x, float & y) - { - x *= (float)meter; - y *= (float)meter; - } - - float World::scaleDown(float f) - { - return f/(float)meter; - } - - float World::scaleUp(float f) - { - return f*(float)meter; - } - - b2Vec2 World::scaleDown(const b2Vec2 & v) - { - b2Vec2 t = v; - scaleDown(t.x, t.y); - return t; - } - - b2Vec2 World::scaleUp(const b2Vec2 & v) - { - b2Vec2 t = v; - scaleUp(t.x, t.y); - return t; - } - - b2AABB World::scaleDown(const b2AABB & aabb) - { - b2AABB t; - t.lowerBound = scaleDown(aabb.lowerBound); - t.upperBound = scaleDown(aabb.upperBound); - return t; - } - - b2AABB World::scaleUp(const b2AABB & aabb) - { - b2AABB t; - t.lowerBound = scaleUp(aabb.lowerBound); - t.upperBound = scaleUp(aabb.upperBound); - return t; - } b2Body * World::getGroundBody() { diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 68ed12af1..238f19b7f 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -84,9 +84,6 @@ namespace box2d // Contact callbacks. ContactCallback add, persist, remove, result; - // The length of one meter in pixels. - int meter; - public: /** @@ -176,74 +173,6 @@ namespace box2d * @return The number of joints. **/ int getJointCount(); - - /** - * Sets the number of pixels in one meter. - * @param pixels The number of pixels in one meter. (1m ~= 3.3ft). - **/ - void setMeter(int meter); - - /** - * Gets the number of pixels in one meter. - * @param pixels The number of pixels in one meter. (1m ~= 3.3ft). - **/ - int getMeter() const; - - /** - * Scales a value down according to the current meter in pixels. - * @param f The unscaled input value. - **/ - float scaleDown(float f); - - /** - * Scales a value up according to the current meter in pixels. - * @param f The unscaled input value. - **/ - 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. - **/ - 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. - **/ - 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. - **/ - 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. - **/ - b2Vec2 scaleUp(const b2Vec2 & v); - - /** - * Scales a b2AABB down according to the current meter in pixels. - * @param v The unscaled input AABB. - * @return The scaled AABB. - **/ - b2AABB scaleDown(const b2AABB & aabb); - - /** - * Scales a b2AABB up according to the current meter in pixels. - * @param v The unscaled input AABB. - * @return The scaled AABB. - **/ - b2AABB scaleUp(const b2AABB & aabb); /** * Gets the ground body. diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 90c75150e..ac39f6837 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -262,6 +262,19 @@ namespace box2d luax_newtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, (void*)j); return 1; } + + int w_setMeter(lua_State * L) + { + int arg1 = luaL_checkint(L, 1); + 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[] = { @@ -281,6 +294,8 @@ namespace box2d { "newWeldJoint", w_newWeldJoint }, { "newWheelJoint", w_newWheelJoint }, { "newRopeJoint", w_newRopeJoint }, + { "getMeter", w_getMeter }, + { "setMeter", w_setMeter }, { 0, 0 }, }; diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index c87684796..47e291807 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -65,6 +65,8 @@ namespace box2d int w_newWeldJoint(lua_State * L); int w_newWheelJoint(lua_State * L); int w_newRopeJoint(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 diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index 457626c4c..7ab9e76de 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -98,21 +98,6 @@ namespace box2d lua_pushinteger(L, t->getJointCount()); return 1; } - - int w_World_setMeter(lua_State * L) - { - World * t = luax_checkworld(L, 1); - int arg1 = luaL_checkint(L, 2); - t->setMeter(arg1); - return 0; - - } - int w_World_getMeter(lua_State * L) - { - World * t = luax_checkworld(L, 1); - lua_pushinteger(L, t->getMeter()); - return 1; - } static const luaL_Reg functions[] = { { "update", w_World_update }, @@ -124,8 +109,6 @@ namespace box2d { "isAllowSleep", w_World_isAllowSleep }, { "getBodyCount", w_World_getBodyCount }, { "getJointCount", w_World_getJointCount }, - { "setMeter", w_World_setMeter }, - { "getMeter", w_World_getMeter }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index dbe64d913..0ba044d84 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -41,8 +41,6 @@ namespace box2d int w_World_isAllowSleep(lua_State * L); int w_World_getBodyCount(lua_State * L); int w_World_getJointCount(lua_State * L); - int w_World_setMeter(lua_State * L); - int w_World_getMeter(lua_State * L); int luaopen_world(lua_State * L); } // box2d From a56566818363e2394aac514a8715a260f45a835d Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 15 Sep 2011 17:17:28 -0400 Subject: [PATCH 181/384] Add ChainShape --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 12 ++ src/modules/physics/box2d/ChainShape.cpp | 95 ++++++++++++++ src/modules/physics/box2d/ChainShape.h | 101 +++++++++++++++ src/modules/physics/box2d/Physics.cpp | 34 ++++- src/modules/physics/box2d/Physics.h | 7 + src/modules/physics/box2d/wrap_ChainShape.cpp | 122 ++++++++++++++++++ src/modules/physics/box2d/wrap_ChainShape.h | 50 +++++++ src/modules/physics/box2d/wrap_Physics.cpp | 7 + src/modules/physics/box2d/wrap_Physics.h | 2 + 9 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 src/modules/physics/box2d/ChainShape.cpp create mode 100644 src/modules/physics/box2d/ChainShape.h create mode 100644 src/modules/physics/box2d/wrap_ChainShape.cpp create mode 100644 src/modules/physics/box2d/wrap_ChainShape.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 70382453f..befd5e9e1 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -211,6 +211,8 @@ A9CF0E8610B9EB1000E6F37E /* utf8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9CF0E8510B9EB1000E6F37E /* utf8.cpp */; }; A9D1D20214224E1300A8BC2F /* RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D1D20114224E1300A8BC2F /* RopeJoint.cpp */; }; A9D1D2041422578C00A8BC2F /* wrap_RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D1D2031422578A00A8BC2F /* wrap_RopeJoint.cpp */; }; + A9D1D20A1422959100A8BC2F /* ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D1D2091422959100A8BC2F /* ChainShape.cpp */; }; + A9D1D20D14229B6500A8BC2F /* wrap_ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D1D20C14229B5800A8BC2F /* wrap_ChainShape.cpp */; }; A9D307EA106635C3004FEDF8 /* physfs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9DEC1C11046EFA70049C70C /* Love.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1BF1046EFA60049C70C /* Love.icns */; }; @@ -675,6 +677,10 @@ A9D1D20114224E1300A8BC2F /* RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RopeJoint.cpp; sourceTree = ""; }; A9D1D2031422578A00A8BC2F /* wrap_RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RopeJoint.cpp; sourceTree = ""; }; A9D1D2051422579500A8BC2F /* wrap_RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_RopeJoint.h; sourceTree = ""; }; + A9D1D2091422959100A8BC2F /* ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChainShape.cpp; sourceTree = ""; }; + A9D1D20B142295A800A8BC2F /* ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChainShape.h; sourceTree = ""; }; + A9D1D20C14229B5800A8BC2F /* wrap_ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ChainShape.cpp; sourceTree = ""; }; + A9D1D20E14229B7300A8BC2F /* wrap_ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ChainShape.h; sourceTree = ""; }; A9D307E9106635C3004FEDF8 /* physfs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = physfs.framework; path = /Library/Frameworks/physfs.framework; sourceTree = ""; }; A9DEC1BF1046EFA60049C70C /* Love.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Love.icns; path = icons/Love.icns; sourceTree = ""; }; A9DEC1C01046EFA70049C70C /* LoveDocument.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = LoveDocument.icns; path = icons/LoveDocument.icns; sourceTree = ""; }; @@ -1201,6 +1207,8 @@ A93E6AEB10420AC7007D418B /* Body.cpp */, A93E6AEC10420AC7007D418B /* Body.h */, A986EBC3132CE6D800F048C8 /* Box2D */, + A9D1D2091422959100A8BC2F /* ChainShape.cpp */, + A9D1D20B142295A800A8BC2F /* ChainShape.h */, A93E6AED10420AC7007D418B /* CircleShape.cpp */, A93E6AEE10420AC7007D418B /* CircleShape.h */, A93E6AEF10420AC7007D418B /* Contact.cpp */, @@ -1242,6 +1250,8 @@ A93E6B4F10420ACA007D418B /* World.h */, A93E6B5010420ACA007D418B /* wrap_Body.cpp */, A93E6B5110420ACA007D418B /* wrap_Body.h */, + A9D1D20C14229B5800A8BC2F /* wrap_ChainShape.cpp */, + A9D1D20E14229B7300A8BC2F /* wrap_ChainShape.h */, A93E6B5210420ACA007D418B /* wrap_CircleShape.cpp */, A93E6B5310420ACA007D418B /* wrap_CircleShape.h */, A93E6B5410420ACA007D418B /* wrap_Contact.cpp */, @@ -1810,6 +1820,8 @@ A96F41A71412C92B0067FE9A /* wrap_EdgeShape.cpp in Sources */, A9D1D20214224E1300A8BC2F /* RopeJoint.cpp in Sources */, A9D1D2041422578C00A8BC2F /* wrap_RopeJoint.cpp in Sources */, + A9D1D20A1422959100A8BC2F /* ChainShape.cpp in Sources */, + A9D1D20D14229B6500A8BC2F /* wrap_ChainShape.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/modules/physics/box2d/ChainShape.cpp b/src/modules/physics/box2d/ChainShape.cpp new file mode 100644 index 000000000..1e74d5177 --- /dev/null +++ b/src/modules/physics/box2d/ChainShape.cpp @@ -0,0 +1,95 @@ +/** +* 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. +**/ + +#include "ChainShape.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + ChainShape::ChainShape(b2ChainShape * c, bool loop) + : loop(loop) + { + shape = c; + } + + 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::setPrevVertex(float x, float y) + { + if (loop) { + throw love::Exception("Physics error: Can't call setPrevVertex 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; + c->GetChildEdge(&e, index); + return new EdgeShape(&e); + } + + int ChainShape::getVertexCount() const + { + b2ChainShape * c = (b2ChainShape *)shape; + return c->GetVertexCount(); + } + + b2Vec2 ChainShape::getVertex(int index) const + { + b2ChainShape * c = (b2ChainShape *)shape; + const b2Vec2 & v = c->GetVertex(index); + return Physics::scaleUp(v); + } + + const b2Vec2 * ChainShape::getVertices() const + { + b2ChainShape * c = (b2ChainShape *)shape; + return c->GetVertices(); + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/ChainShape.h b/src/modules/physics/box2d/ChainShape.h new file mode 100644 index 000000000..c96f4e228 --- /dev/null +++ b/src/modules/physics/box2d/ChainShape.h @@ -0,0 +1,101 @@ +/** +* 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_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 + { + private: + // True if this ChainShape is a loop. + bool loop; + + public: + + /** + * Create a new ChainShape from a Box2D chain shape. + * @param c The chain shape. + **/ + ChainShape(b2ChainShape * c, bool loop = false); + + 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 setPrevVertex(float x, float y); + + /** + * 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 getVertex(int index) const; + + /** + * Returns all of the vertices. + * @returns The vertices the shape comprises. + **/ + const b2Vec2 * getVertices() const; + + }; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_CHAIN_SHAPE_H diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 6a270036e..a9887cf78 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -128,7 +128,7 @@ namespace box2d if(count < 3) return luaL_error(L, "Polygon degenerated to less than three points."); - b2Vec2 vecs[] = new b2vec2[count]; + b2Vec2 * vecs = new b2Vec2[count]; for (int i = 0; i < count; i++) { vecs[i].Set(convex_hull[i].x, convex_hull[i].y); @@ -143,6 +143,38 @@ namespace box2d 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; + + bool loop = luax_toboolean(L, 1); + + b2Vec2 * vecs = new b2Vec2[vcount]; + + for(int i = 0;i(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); + c->setNextVertex(x, y); + return 0; + } + + int w_ChainShape_setPrevVertex(lua_State * L) + { + ChainShape * c = luax_checkchainshape(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + c->setPrevVertex(x, y); + return 0; + } + + int w_ChainShape_getChildEdge(lua_State * L) + { + ChainShape * c = luax_checkchainshape(L, 1); + int index = luaL_checkint(L, 2); + EdgeShape * e = c->getChildEdge(index); + luax_newtype(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_getVertex(lua_State * L) + { + ChainShape * c = luax_checkchainshape(L, 1); + int index = luaL_checkint(L, 2); + b2Vec2 v = c->getVertex(index); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + return 2; + } + + int w_ChainShape_getVertices(lua_State * L) + { + ChainShape * c = luax_checkchainshape(L, 1); + const b2Vec2 * verts = c->getVertices(); + int count = c->getVertexCount(); + lua_createtable(L, count*2, 0); + for (int i = 0; i < count; i++) { + b2Vec2 v = Physics::scaleUp(verts[i]); + lua_pushnumber(L, v.x); + lua_rawseti(L, -2, i*2+1); + lua_pushnumber(L, v.y); + lua_rawseti(L, -2, i*2+2); + } + return 1; + } + + static const luaL_Reg functions[] = { + { "setNextVertex", w_ChainShape_setNextVertex }, + { "setPrevVertex", w_ChainShape_setPrevVertex }, + { "getChildEdge", w_ChainShape_getChildEdge }, + { "getVertexCount", w_ChainShape_getVertexCount }, + { "getVertex", w_ChainShape_getVertex }, + { "getVertices", w_ChainShape_getVertices }, + // 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 }, + { "destroy", w_Shape_destroy }, + { 0, 0 } + }; + + int luaopen_chainshape(lua_State * L) + { + return luax_register_type(L, "ChainShape", functions); + } + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/wrap_ChainShape.h b/src/modules/physics/box2d/wrap_ChainShape.h new file mode 100644 index 000000000..88989d063 --- /dev/null +++ b/src/modules/physics/box2d/wrap_ChainShape.h @@ -0,0 +1,50 @@ +/** +* 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_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H +#define LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H + +// LOVE +#include +#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_setPrevVertex(lua_State * L); + int w_ChainShape_getChildEdge(lua_State * L); + int w_ChainShape_getVertexCount(lua_State * L); + int w_ChainShape_getVertex(lua_State * L); + int w_ChainShape_getVertices(lua_State * L); + + int luaopen_chainshape(lua_State * L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index ac39f6837..111a46d39 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -127,6 +127,11 @@ namespace box2d { return instance->newPolygonShape(L); } + + int w_newChainShape(lua_State * L) + { + return instance->newChainShape(L); + } int w_newDistanceJoint(lua_State * L) { @@ -284,6 +289,7 @@ namespace box2d { "newRectangleShape", w_newRectangleShape }, { "newPolygonShape", w_newPolygonShape }, { "newEdgeShape", w_newEdgeShape }, + { "newChainShape", w_newChainShape }, { "newDistanceJoint", w_newDistanceJoint }, { "newMouseJoint", w_newMouseJoint }, { "newRevoluteJoint", w_newRevoluteJoint }, @@ -307,6 +313,7 @@ namespace box2d luaopen_circleshape, luaopen_polygonshape, luaopen_edgeshape, + luaopen_chainshape, luaopen_joint, luaopen_mousejoint, luaopen_distancejoint, diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 47e291807..29d7e2e58 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -31,6 +31,7 @@ #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" @@ -55,6 +56,7 @@ namespace box2d 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); From 05c2749760c233c43745aeb55ffc914232a91ad0 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 21 Sep 2011 21:26:34 +0200 Subject: [PATCH 182/384] Joysticks are supposed to be 1-indexed, even in the callbacks.. --- src/modules/event/sdl/wrap_Event.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/event/sdl/wrap_Event.cpp b/src/modules/event/sdl/wrap_Event.cpp index 8a519b780..a7f93a40e 100644 --- a/src/modules/event/sdl/wrap_Event.cpp +++ b/src/modules/event/sdl/wrap_Event.cpp @@ -108,8 +108,8 @@ namespace sdl return 4; case Event::TYPE_JOYSTICK_PRESSED: case Event::TYPE_JOYSTICK_RELEASED: - lua_pushinteger(L, msg.joystick.index); - lua_pushinteger(L, msg.joystick.button); + lua_pushinteger(L, msg.joystick.index+1); + lua_pushinteger(L, msg.joystick.button+1); return 3; case Event::TYPE_FOCUS: lua_pushboolean(L, msg.focus.f); From 3c7310e76d45f9f0a181997b07d3c293b9c09573 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 16:09:18 -0400 Subject: [PATCH 183/384] Update to Box2D 2.2.1 (stop updating, Erin!) --HG-- branch : box2d-update --- src/modules/physics/box2d/Box2D/Box2D.h | 2 - .../Box2D/Collision/Shapes/b2ChainShape.h | 15 -- .../Box2D/Collision/Shapes/b2EdgeShape.h | 4 + .../box2d/Box2D/Collision/b2Distance.cpp | 10 +- .../physics/box2d/Box2D/Common/b2Math.cpp | 41 ++++ .../physics/box2d/Box2D/Common/b2Math.h | 14 ++ .../physics/box2d/Box2D/Common/b2Settings.cpp | 13 +- .../physics/box2d/Box2D/Common/b2Settings.h | 3 + .../physics/box2d/Box2D/Common/b2Timer.cpp | 4 +- .../physics/box2d/Box2D/Common/b2Timer.h | 2 +- .../Box2D/Dynamics/Joints/b2DistanceJoint.cpp | 26 ++- .../Box2D/Dynamics/Joints/b2DistanceJoint.h | 20 +- .../Box2D/Dynamics/Joints/b2FrictionJoint.cpp | 16 ++ .../Box2D/Dynamics/Joints/b2FrictionJoint.h | 9 + .../Box2D/Dynamics/Joints/b2GearJoint.cpp | 45 +++-- .../box2d/Box2D/Dynamics/Joints/b2GearJoint.h | 12 ++ .../box2d/Box2D/Dynamics/Joints/b2Joint.cpp | 1 + .../box2d/Box2D/Dynamics/Joints/b2Joint.h | 10 +- .../Box2D/Dynamics/Joints/b2MouseJoint.h | 3 + .../Dynamics/Joints/b2PrismaticJoint.cpp | 68 +++++-- .../Box2D/Dynamics/Joints/b2PrismaticJoint.h | 26 ++- .../Box2D/Dynamics/Joints/b2PulleyJoint.cpp | 22 +++ .../Box2D/Dynamics/Joints/b2PulleyJoint.h | 5 + .../Box2D/Dynamics/Joints/b2RevoluteJoint.cpp | 21 ++ .../Box2D/Dynamics/Joints/b2RevoluteJoint.h | 19 +- .../Box2D/Dynamics/Joints/b2RopeJoint.cpp | 15 ++ .../box2d/Box2D/Dynamics/Joints/b2RopeJoint.h | 12 +- .../Box2D/Dynamics/Joints/b2WeldJoint.cpp | 179 ++++++++++++++---- .../box2d/Box2D/Dynamics/Joints/b2WeldJoint.h | 42 +++- .../Box2D/Dynamics/Joints/b2WheelJoint.cpp | 21 +- .../Box2D/Dynamics/Joints/b2WheelJoint.h | 22 ++- .../physics/box2d/Box2D/Dynamics/b2Body.cpp | 30 +++ .../physics/box2d/Box2D/Dynamics/b2Body.h | 5 +- .../box2d/Box2D/Dynamics/b2ContactManager.cpp | 20 +- .../box2d/Box2D/Dynamics/b2Fixture.cpp | 75 ++++++++ .../physics/box2d/Box2D/Dynamics/b2Fixture.h | 13 +- .../physics/box2d/Box2D/Dynamics/b2TimeStep.h | 24 +-- .../physics/box2d/Box2D/Dynamics/b2World.cpp | 85 ++++++++- .../physics/box2d/Box2D/Dynamics/b2World.h | 14 +- 39 files changed, 815 insertions(+), 153 deletions(-) diff --git a/src/modules/physics/box2d/Box2D/Box2D.h b/src/modules/physics/box2d/Box2D/Box2D.h index 817cd1ccf..66d221742 100755 --- a/src/modules/physics/box2d/Box2D/Box2D.h +++ b/src/modules/physics/box2d/Box2D/Box2D.h @@ -64,6 +64,4 @@ For discussion please visit http://box2d.org/forum #include #include -#include - #endif diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h index 34593e2b8..6aa41ea41 100755 --- a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h @@ -79,21 +79,6 @@ public: /// @see b2Shape::ComputeMass void ComputeMass(b2MassData* massData, float32 density) const; - /// Get the number of vertices. - int32 GetVertexCount() const { return m_count; } - - /// Get the vertices (read-only). - const b2Vec2& GetVertex(int32 index) const - { - b2Assert(0 <= index && index < m_count); - return m_vertices[index]; - } - - /// Get the vertices (read-only). - const b2Vec2* GetVertices() const { return m_vertices; } - -protected: - /// The vertices. Owned by this class. b2Vec2* m_vertices; diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h index 780eb2c5c..99f822bec 100755 --- a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h +++ b/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h @@ -63,6 +63,10 @@ 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; } diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp b/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp index 2bfb7598a..1010c8c0e 100755 --- a/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp +++ b/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp @@ -50,16 +50,16 @@ void b2DistanceProxy::Set(const b2Shape* shape, int32 index) case b2Shape::e_chain: { const b2ChainShape* chain = (b2ChainShape*)shape; - b2Assert(0 <= index && index < chain->GetVertexCount()); + b2Assert(0 <= index && index < chain->m_count); - m_buffer[0] = chain->GetVertex(index); - if (index + 1 < chain->GetVertexCount()) + m_buffer[0] = chain->m_vertices[index]; + if (index + 1 < chain->m_count) { - m_buffer[1] = chain->GetVertex(index + 1); + m_buffer[1] = chain->m_vertices[index + 1]; } else { - m_buffer[1] = chain->GetVertex(0); + m_buffer[1] = chain->m_vertices[0]; } m_vertices = m_buffer; diff --git a/src/modules/physics/box2d/Box2D/Common/b2Math.cpp b/src/modules/physics/box2d/Box2D/Common/b2Math.cpp index b06111dc4..4974fe187 100755 --- a/src/modules/physics/box2d/Box2D/Common/b2Math.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2Math.cpp @@ -51,3 +51,44 @@ b2Vec2 b2Mat33::Solve22(const b2Vec2& b) const 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/src/modules/physics/box2d/Box2D/Common/b2Math.h b/src/modules/physics/box2d/Box2D/Common/b2Math.h index fdcd939de..9808258bf 100755 --- a/src/modules/physics/box2d/Box2D/Common/b2Math.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Math.h @@ -295,6 +295,14 @@ struct b2Mat33 /// 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; }; @@ -533,6 +541,12 @@ 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) { diff --git a/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp b/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp index 97f5283f4..05a322305 100755 --- a/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp @@ -18,8 +18,10 @@ #include #include +#include +#include -b2Version b2_version = {2, 2, 0}; +b2Version b2_version = {2, 2, 1}; // Memory allocators. Modify these to use your own allocator. void* b2Alloc(int32 size) @@ -31,3 +33,12 @@ 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); +} \ No newline at end of file diff --git a/src/modules/physics/box2d/Box2D/Common/b2Settings.h b/src/modules/physics/box2d/Box2D/Common/b2Settings.h index eabc526d0..7e0a165b5 100755 --- a/src/modules/physics/box2d/Box2D/Common/b2Settings.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Settings.h @@ -132,6 +132,9 @@ 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 diff --git a/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp b/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp index b1863c296..ea3479f11 100755 --- a/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp +++ b/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp @@ -18,11 +18,11 @@ #include -#if defined(WIN32) +#if defined(_WIN32) float64 b2Timer::s_invFrequency = 0.0f; -#include +#include b2Timer::b2Timer() { diff --git a/src/modules/physics/box2d/Box2D/Common/b2Timer.h b/src/modules/physics/box2d/Box2D/Common/b2Timer.h index 678f6ffe4..19bde287f 100755 --- a/src/modules/physics/box2d/Box2D/Common/b2Timer.h +++ b/src/modules/physics/box2d/Box2D/Common/b2Timer.h @@ -35,7 +35,7 @@ public: private: -#if defined(WIN32) +#if defined(_WIN32) float64 m_start; static float64 s_invFrequency; #elif defined(__linux__) || defined (__APPLE__) diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp index 7b0e2a507..1ced7d9de 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp @@ -123,8 +123,13 @@ void b2DistanceJoint::InitVelocityConstraints(const b2SolverData& data) m_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f; m_bias = C * h * k * m_gamma; - m_mass = invMass + m_gamma; - m_mass = m_mass != 0.0f ? 1.0f / m_mass : 0.0f; + 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) @@ -236,3 +241,20 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h index a8d35a5e6..9d0528b95 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h @@ -44,16 +44,17 @@ struct b2DistanceJointDef : public b2JointDef void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchorA, const b2Vec2& anchorB); - /// The local anchor point relative to body1's origin. + /// The local anchor point relative to bodyA's origin. b2Vec2 localAnchorA; - /// The local anchor point relative to body2's origin. + /// 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. + /// The mass-spring-damper frequency in Hertz. A value of 0 + /// disables softness. float32 frequencyHz; /// The damping ratio. 0 = no damping, 1 = critical damping. @@ -78,19 +79,28 @@ public: /// 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. + /// Set/get frequency in Hz. void SetFrequency(float32 hz); float32 GetFrequency() const; - // Set/get damping ratio. + /// Set/get damping ratio. void SetDampingRatio(float32 ratio); float32 GetDampingRatio() const; + /// Dump joint to dmLog + void Dump(); + protected: friend class b2Joint; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp index 8c363e6a1..075e72bb4 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp @@ -233,3 +233,19 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h index 3e72be2fe..785d9ac15 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h @@ -61,6 +61,12 @@ public: 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); @@ -73,6 +79,9 @@ public: /// Get the maximum friction torque in N*m. float32 GetMaxTorque() const; + /// Dump joint to dmLog + void Dump(); + protected: friend class b2Joint; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp index cff95f2bc..201f01233 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp @@ -44,16 +44,21 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) : b2Joint(def) { - m_typeA = def->joint1->GetType(); - m_typeB = def->joint2->GetType(); + 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; - m_bodyC = def->joint1->GetBodyA(); - m_bodyA = def->joint1->GetBodyB(); + // 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; @@ -76,7 +81,7 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) b2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint1; m_localAnchorC = prismatic->m_localAnchorA; m_localAnchorA = prismatic->m_localAnchorB; - m_referenceAngleA = prismatic->m_refAngle; + m_referenceAngleA = prismatic->m_referenceAngle; m_localAxisC = prismatic->m_localXAxisA; b2Vec2 pC = m_localAnchorC; @@ -84,8 +89,8 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) coordinateA = b2Dot(pA - pC, m_localAxisC); } - m_bodyD = def->joint2->GetBodyA(); - m_bodyB = def->joint2->GetBodyB(); + m_bodyD = m_joint2->GetBodyA(); + m_bodyB = m_joint2->GetBodyB(); // Get geometry of joint2 b2Transform xfB = m_bodyB->m_xf; @@ -108,7 +113,7 @@ b2GearJoint::b2GearJoint(const b2GearJointDef* def) b2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint2; m_localAnchorD = prismatic->m_localAnchorA; m_localAnchorB = prismatic->m_localAnchorB; - m_referenceAngleB = prismatic->m_refAngle; + m_referenceAngleB = prismatic->m_referenceAngle; m_localAxisD = prismatic->m_localXAxisA; b2Vec2 pD = m_localAnchorD; @@ -315,9 +320,9 @@ bool b2GearJoint::SolvePositionConstraints(const b2SolverData& data) if (m_typeB == e_revoluteJoint) { JvBD.SetZero(); - JwB = 1.0f; - JwD = 1.0f; - mass += m_iB + m_iD; + JwB = m_ratio; + JwD = m_ratio; + mass += m_ratio * m_ratio * (m_iB + m_iD); coordinateB = aB - aD - m_referenceAngleB; } @@ -398,3 +403,21 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h index 5651d5418..48cdfd886 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h @@ -62,10 +62,19 @@ public: 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; @@ -75,6 +84,9 @@ protected: void SolveVelocityConstraints(const b2SolverData& data); bool SolvePositionConstraints(const b2SolverData& data); + b2Joint* m_joint1; + b2Joint* m_joint2; + b2JointType m_typeA; b2JointType m_typeB; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp index eee195a9d..85322f77c 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp @@ -177,6 +177,7 @@ b2Joint::b2Joint(const b2JointDef* def) 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; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h index ed6ad4103..90154ccb8 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h @@ -118,10 +118,10 @@ public: /// Get the anchor point on bodyB in world coordinates. virtual b2Vec2 GetAnchorB() const = 0; - /// Get the reaction force on body2 at the joint anchor in Newtons. + /// 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 body2 in N*m. + /// 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. @@ -142,10 +142,14 @@ public: /// 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"); } + 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); @@ -167,6 +171,8 @@ protected: b2Body* m_bodyA; b2Body* m_bodyB; + int32 m_index; + bool m_islandFlag; bool m_collideConnected; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h index 3c90d0161..bb2e28418 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h @@ -89,6 +89,9 @@ public: void SetDampingRatio(float32 ratio); float32 GetDampingRatio() const; + /// The mouse joint does not support dumping. + void Dump() { b2Log("Mouse joint dumping is not supported.\n"); } + protected: friend class b2Joint; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp index 99f0c7d6f..88a388072 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp @@ -103,8 +103,9 @@ b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) m_localAnchorA = def->localAnchorA; m_localAnchorB = def->localAnchorB; m_localXAxisA = def->localAxisA; + m_localXAxisA.Normalize(); m_localYAxisA = b2Cross(1.0f, m_localXAxisA); - m_refAngle = def->referenceAngle; + m_referenceAngle = def->referenceAngle; m_impulse.SetZero(); m_motorMass = 0.0; @@ -348,6 +349,17 @@ void b2PrismaticJoint::SolveVelocityConstraints(const b2SolverData& data) vB += mB * P; wB += iB * LB; + + b2Vec2 Cdot10 = Cdot1; + + Cdot1.x = b2Dot(m_perp, vB - vA) + m_s2 * wB - m_s1 * wA; + Cdot1.y = wB - wA; + + if (b2Abs(Cdot1.x) > 0.01f || b2Abs(Cdot1.y) > 0.01f) + { + b2Vec2 test = b2Mul22(m_K, df); + Cdot1.x += 0.0f; + } } data.velocities[m_indexA].v = vA; @@ -384,7 +396,7 @@ bool b2PrismaticJoint::SolvePositionConstraints(const b2SolverData& data) b2Vec3 impulse; b2Vec2 C1; C1.x = b2Dot(perp, d); - C1.y = aB - aA - m_refAngle; + C1.y = aB - aA - m_referenceAngle; float32 linearError = b2Abs(C1.x); float32 angularError = b2Abs(C1.y); @@ -419,43 +431,45 @@ bool b2PrismaticJoint::SolvePositionConstraints(const b2SolverData& data) if (active) { - 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 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 * m_a1 + iB * m_a2; - float32 k33 = mA + mB + iA * m_a1 * m_a1 + iB * m_a2 * m_a2; + float32 k23 = iA * a1 + iB * a2; + float32 k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; - m_K.ex.Set(k11, k12, k13); - m_K.ey.Set(k12, k22, k23); - m_K.ez.Set(k13, k23, k33); + 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 = m_K.Solve33(-C); + impulse = K.Solve33(-C); } else { - float32 k11 = mA + mB + iA * m_s1 * m_s1 + iB * m_s2 * m_s2; - float32 k12 = iA * m_s1 + iB * m_s2; + 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; } - m_K.ex.Set(k11, k12, 0.0f); - m_K.ey.Set(k12, k22, 0.0f); + b2Mat22 K; + K.ex.Set(k11, k12); + K.ey.Set(k12, k22); - b2Vec2 impulse1 = m_K.Solve22(-C1); + b2Vec2 impulse1 = K.Solve(-C1); impulse.x = impulse1.x; impulse.y = impulse1.y; impulse.z = 0.0f; @@ -599,3 +613,25 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h index f271e7579..8d0f34229 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h @@ -45,16 +45,16 @@ struct b2PrismaticJointDef : public b2JointDef } /// Initialize the bodies, anchors, axis, and reference angle using the world - /// anchor and world axis. + /// anchor and unit world axis. void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); - /// The local anchor point relative to body1's origin. + /// The local anchor point relative to bodyA's origin. b2Vec2 localAnchorA; - /// The local anchor point relative to body2's origin. + /// The local anchor point relative to bodyB's origin. b2Vec2 localAnchorB; - /// The local translation axis in body1. + /// The local translation unit axis in bodyA. b2Vec2 localAxisA; /// The constrained angle between the bodies: bodyB_angle - bodyA_angle. @@ -92,6 +92,18 @@ public: 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; @@ -127,10 +139,14 @@ public: /// 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; @@ -145,7 +161,7 @@ protected: b2Vec2 m_localAnchorB; b2Vec2 m_localXAxisA; b2Vec2 m_localYAxisA; - float32 m_refAngle; + float32 m_referenceAngle; b2Vec3 m_impulse; float32 m_motorImpulse; float32 m_lowerTranslation; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp index 1a09d907e..e0bb7da51 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp @@ -59,6 +59,9 @@ b2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def) 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; @@ -308,3 +311,22 @@ float32 b2PulleyJoint::GetRatio() const { return m_ratio; } + +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); +} diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h index a5269c618..639789f52 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h @@ -100,6 +100,9 @@ public: /// Get the pulley ratio. float32 GetRatio() const; + /// Dump joint to dmLog + void Dump(); + protected: friend class b2Joint; @@ -111,6 +114,8 @@ protected: b2Vec2 m_groundAnchorA; b2Vec2 m_groundAnchorB; + float32 m_lengthA; + float32 m_lengthB; // Solver shared b2Vec2 m_localAnchorA; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp index 7718f03fc..ffb17252c 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp @@ -481,3 +481,24 @@ void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h index 03eae0b3a..e62cdbccd 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h @@ -52,13 +52,13 @@ struct b2RevoluteJointDef : public b2JointDef /// anchor point. void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); - /// The local anchor point relative to body1's origin. + /// The local anchor point relative to bodyA's origin. b2Vec2 localAnchorA; - /// The local anchor point relative to body2's origin. + /// The local anchor point relative to bodyB's origin. b2Vec2 localAnchorB; - /// The body2 angle minus body1 angle in the reference state (radians). + /// The bodyB angle minus bodyA angle in the reference state (radians). float32 referenceAngle; /// A flag to enable joint limits. @@ -93,6 +93,15 @@ 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; @@ -128,6 +137,7 @@ public: /// 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. @@ -141,6 +151,9 @@ public: /// Unit is N*m. float32 GetMotorTorque(float32 inv_dt) const; + /// Dump to b2Log. + void Dump(); + protected: friend class b2Joint; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp index 4b1e666c1..107ce1fa5 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp @@ -224,3 +224,18 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h index 660b4ed50..30252460c 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h @@ -64,11 +64,21 @@ public: b2Vec2 GetReactionForce(float32 inv_dt) const; float32 GetReactionTorque(float32 inv_dt) const; - /// Get the maximum length of the rope. + /// 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; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp index 11eb5ec65..9a86686e2 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp @@ -49,6 +49,8 @@ b2WeldJoint::b2WeldJoint(const b2WeldJointDef* def) m_localAnchorA = def->localAnchorA; m_localAnchorB = def->localAnchorB; m_referenceAngle = def->referenceAngle; + m_frequencyHz = def->frequencyHz; + m_dampingRatio = def->dampingRatio; m_impulse.SetZero(); } @@ -91,15 +93,50 @@ void b2WeldJoint::InitVelocityConstraints(const b2SolverData& data) float32 mA = m_invMassA, mB = m_invMassB; float32 iA = m_invIA, iB = m_invIB; - 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; + 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) { @@ -135,20 +172,47 @@ void b2WeldJoint::SolveVelocityConstraints(const b2SolverData& data) float32 mA = m_invMassA, mB = m_invMassB; float32 iA = m_invIA, iB = m_invIB; - b2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA); - float32 Cdot2 = wB - wA; - b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + if (m_frequencyHz > 0.0f) + { + float32 Cdot2 = wB - wA; - b2Vec3 impulse = -m_mass.Solve33(Cdot); - m_impulse += impulse; + float32 impulse2 = -m_mass.ez.z * (Cdot2 + m_bias + m_gamma * m_impulse.z); + m_impulse.z += impulse2; - b2Vec2 P(impulse.x, impulse.y); + wA -= iA * impulse2; + wB += iB * impulse2; - vA -= mA * P; - wA -= iA * (b2Cross(m_rA, P) + impulse.z); + b2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA); - vB += mB * P; - wB += iB * (b2Cross(m_rB, P) + impulse.z); + 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; @@ -171,33 +235,53 @@ bool b2WeldJoint::SolvePositionConstraints(const b2SolverData& data) b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); - b2Vec2 C1 = cB + rB - cA - rA; - float32 C2 = aB - aA - m_referenceAngle; + float32 positionError, angularError; - float32 positionError = C1.Length(); - float32 angularError = b2Abs(C2); + 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; - m_mass.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; - m_mass.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; - m_mass.ez.x = -rA.y * iA - rB.y * iB; - m_mass.ex.y = m_mass.ey.x; - m_mass.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; - m_mass.ez.y = rA.x * iA + 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; + if (m_frequencyHz > 0.0f) + { + b2Vec2 C1 = cB + rB - cA - rA; - b2Vec3 C(C1.x, C1.y, C2); + positionError = C1.Length(); + angularError = 0.0f; - b2Vec3 impulse = -m_mass.Solve33(C); + b2Vec2 P = -K.Solve22(C1); - b2Vec2 P(impulse.x, impulse.y); + cA -= mA * P; + aA -= iA * b2Cross(rA, P); - cA -= mA * P; - aA -= iA * (b2Cross(rA, P) + impulse.z); + cB += mB * P; + aB += iB * b2Cross(rB, P); + } + else + { + b2Vec2 C1 = cB + rB - cA - rA; + float32 C2 = aB - aA - m_referenceAngle; - cB += mB * P; - aB += iB * (b2Cross(rB, P) + impulse.z); + 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; @@ -227,3 +311,20 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h index 51c4b402b..2adfc26ab 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h @@ -32,20 +32,29 @@ struct b2WeldJointDef : public b2JointDef 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* body1, b2Body* body2, const b2Vec2& anchor); + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); - /// The local anchor point relative to body1's origin. + /// The local anchor point relative to bodyA's origin. b2Vec2 localAnchorA; - /// The local anchor point relative to body2's origin. + /// The local anchor point relative to bodyB's origin. b2Vec2 localAnchorB; - /// The body2 angle minus body1 angle in the reference state (radians). + /// 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 @@ -59,6 +68,26 @@ public: 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; @@ -69,10 +98,15 @@ protected: 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 diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp index 826192347..998c627db 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp @@ -398,7 +398,22 @@ 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/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h index 7398d218c..9a8b13639 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h @@ -46,13 +46,13 @@ struct b2WheelJointDef : public b2JointDef /// anchor and world axis. void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); - /// The local anchor point relative to body1's origin. + /// The local anchor point relative to bodyA's origin. b2Vec2 localAnchorA; - /// The local anchor point relative to body2's origin. + /// The local anchor point relative to bodyB's origin. b2Vec2 localAnchorB; - /// The local translation axis in body1. + /// The local translation axis in bodyA. b2Vec2 localAxisA; /// Enable/disable the joint motor. @@ -72,19 +72,30 @@ struct b2WheelJointDef : public b2JointDef }; /// A wheel joint. This joint provides two degrees of freedom: translation -/// along an axis fixed in body1 and rotation in the plane. You can use a +/// 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: + void GetDefinition(b2WheelJointDef* def) const; + 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; @@ -118,6 +129,9 @@ public: void SetSpringDampingRatio(float32 ratio); float32 GetSpringDampingRatio() const; + /// Dump to b2Log + void Dump(); + protected: friend class b2Joint; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp index 858977c81..b50bf45ad 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp @@ -481,4 +481,34 @@ void b2Body::SetActive(bool flag) } m_contactList = NULL; } +} + +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"); } \ No newline at end of file diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h index 5ebc5ddd1..73f2cb415 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h @@ -375,6 +375,9 @@ public: b2World* GetWorld(); const b2World* GetWorld() const; + /// Dump this body to a log file + void Dump(); + private: friend class b2World; @@ -474,7 +477,7 @@ inline const b2Vec2& b2Body::GetPosition() const inline float32 b2Body::GetAngle() const { - return m_xf.q.GetAngle(); + return m_sweep.a; } inline const b2Vec2& b2Body::GetWorldCenter() const diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp index ee12b325e..5ac12b350 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp @@ -115,16 +115,6 @@ void b2ContactManager::Collide() b2Body* bodyA = fixtureA->GetBody(); b2Body* bodyB = fixtureB->GetBody(); - 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; - } - // Is this contact flagged for filtering? if (c->m_flags & b2Contact::e_filterFlag) { @@ -150,6 +140,16 @@ void b2ContactManager::Collide() 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); diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp index 478088a44..77537b276 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp @@ -226,3 +226,78 @@ void b2Fixture::SetSensor(bool 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_vertexCount; ++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_vertexCount); + } + 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/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h index a7b5c3428..5ebd0c3fd 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h @@ -31,6 +31,13 @@ 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; @@ -56,9 +63,6 @@ struct b2FixtureDef friction = 0.2f; restitution = 0.0f; density = 0.0f; - filter.categoryBits = 0x0001; - filter.maskBits = 0xFFFF; - filter.groupIndex = 0; isSensor = false; } @@ -188,6 +192,9 @@ public: /// the body transform. const b2AABB& GetAABB(int32 childIndex) const; + /// Dump this fixture to the log file. + void Dump(int32 bodyIndex); + protected: friend class b2Body; diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h b/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h index 80916cb65..abe6fb6e0 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h @@ -21,18 +21,18 @@ #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; -}; +/// 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 diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp b/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp index 7dcddd03c..baacded4f 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp @@ -34,7 +34,7 @@ #include #include -b2World::b2World(const b2Vec2& gravity, bool doSleep) +b2World::b2World(const b2Vec2& gravity) { m_destructionListener = NULL; m_debugDraw = NULL; @@ -51,7 +51,7 @@ b2World::b2World(const b2Vec2& gravity, bool doSleep) m_stepComplete = true; - m_allowSleep = doSleep; + m_allowSleep = true; m_gravity = gravity; m_flags = e_clearForces; @@ -364,6 +364,24 @@ void b2World::DestroyJoint(b2Joint* j) } } +// +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) { @@ -1038,8 +1056,8 @@ void b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color case b2Shape::e_chain: { b2ChainShape* chain = (b2ChainShape*)fixture->GetShape(); - int32 count = chain->GetVertexCount(); - const b2Vec2* vertices = chain->GetVertices(); + int32 count = chain->m_count; + const b2Vec2* vertices = chain->m_vertices; b2Vec2 v1 = b2Mul(xf, vertices[0]); for (int32 i = 1; i < count; ++i) @@ -1237,3 +1255,62 @@ float32 b2World::GetTreeQuality() const { return m_contactManager.m_broadPhase.GetTreeQuality(); } + +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/src/modules/physics/box2d/Box2D/Dynamics/b2World.h b/src/modules/physics/box2d/Box2D/Dynamics/b2World.h index 381e1f1ac..eba757276 100755 --- a/src/modules/physics/box2d/Box2D/Dynamics/b2World.h +++ b/src/modules/physics/box2d/Box2D/Dynamics/b2World.h @@ -43,8 +43,7 @@ class b2World public: /// Construct a world object. /// @param gravity the world gravity vector. - /// @param doSleep improve performance by not simulating inactive bodies. - b2World(const b2Vec2& gravity, bool doSleep); + b2World(const b2Vec2& gravity); /// Destruct the world. All physics entities are destroyed and all heap memory is released. ~b2World(); @@ -142,14 +141,21 @@ public: 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; @@ -194,6 +200,10 @@ public: /// 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 From a956f9b0c1febe34ef03b240c41e03c703008636 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 16:17:29 -0400 Subject: [PATCH 184/384] Update WeldJoint for new soft constraint options --HG-- branch : box2d-update --- src/modules/physics/box2d/WeldJoint.cpp | 20 ++++++++++++ src/modules/physics/box2d/WeldJoint.h | 22 +++++++++++++ src/modules/physics/box2d/wrap_WeldJoint.cpp | 34 ++++++++++++++++++++ src/modules/physics/box2d/wrap_WeldJoint.h | 6 ++++ 4 files changed, 82 insertions(+) diff --git a/src/modules/physics/box2d/WeldJoint.cpp b/src/modules/physics/box2d/WeldJoint.cpp index 1d1f39494..b2882d0be 100644 --- a/src/modules/physics/box2d/WeldJoint.cpp +++ b/src/modules/physics/box2d/WeldJoint.cpp @@ -47,6 +47,26 @@ namespace box2d destroyJoint(joint); joint = 0; } + + 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 diff --git a/src/modules/physics/box2d/WeldJoint.h b/src/modules/physics/box2d/WeldJoint.h index c8bb6856c..e8469dac2 100644 --- a/src/modules/physics/box2d/WeldJoint.h +++ b/src/modules/physics/box2d/WeldJoint.h @@ -49,6 +49,28 @@ namespace box2d 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; + }; } // box2d diff --git a/src/modules/physics/box2d/wrap_WeldJoint.cpp b/src/modules/physics/box2d/wrap_WeldJoint.cpp index 4d0cbc16a..b3229323e 100644 --- a/src/modules/physics/box2d/wrap_WeldJoint.cpp +++ b/src/modules/physics/box2d/wrap_WeldJoint.cpp @@ -31,7 +31,41 @@ namespace box2d return luax_checktype(L, idx, "WeldJoint", PHYSICS_WELD_JOINT_T); } + 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 }, diff --git a/src/modules/physics/box2d/wrap_WeldJoint.h b/src/modules/physics/box2d/wrap_WeldJoint.h index bf875e85c..3874897c5 100644 --- a/src/modules/physics/box2d/wrap_WeldJoint.h +++ b/src/modules/physics/box2d/wrap_WeldJoint.h @@ -33,6 +33,12 @@ 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); + int luaopen_weldjoint(lua_State * L); } // box2d From 4980797afc148c3cc8fdc99d08210affecf9c369 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 16:27:59 -0400 Subject: [PATCH 185/384] World no longer has an explicit size --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.cpp | 8 +++----- src/modules/physics/box2d/Physics.h | 11 ++++++----- src/modules/physics/box2d/World.cpp | 12 ++++++------ src/modules/physics/box2d/World.h | 15 ++++----------- src/modules/physics/box2d/wrap_Physics.cpp | 17 +++++------------ 5 files changed, 24 insertions(+), 39 deletions(-) diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index a9887cf78..5c7c59361 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -39,12 +39,10 @@ namespace box2d return "love.physics.box2d"; } - World * Physics::newWorld(float lx, float ly, float ux, float uy, float gx, float gy, bool sleep, int meter) + World * Physics::newWorld(float gx, float gy, bool sleep, int meter) { - b2AABB aabb; - aabb.lowerBound.Set(lx, ly); - aabb.upperBound.Set(ux, uy); - return new World(aabb, b2Vec2(gx, gy), sleep, meter); + Physics::setMeter(meter); + return new World(b2Vec2(gx, gy), sleep); } Body * Physics::newBody(World * world, float x, float y, float mass, float i) diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index d15c1498f..2cca64dec 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -57,22 +57,23 @@ namespace box2d static int meter; 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 lx Lower bound on the x-axis. - * @param ly Lower bound on the y-axis. - * @param ux Upper bound on the x-axis. - * @param uy Upper bound on the y-axis. * @param gx Gravity along x-axis. * @param gy Gravity along y-axis. * @param sleep Whether the World allows sleep. * @param meter The scale in px/m. **/ - World * newWorld(float lx, float ly, float ux, float uy, float gx, float gy, bool sleep, int meter); + World * newWorld(float gx, float gy, bool sleep, int meter); /** * Creates a new Body at the specified position. diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index d6de02db0..3cf1c5b86 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -96,19 +96,19 @@ namespace box2d } - World::World(b2AABB aabb) - : world(NULL), meter(DEFAULT_METER) + World::World() + : world(NULL) { - world = new b2World(Physics::scaleDown(aabb), b2Vec2(0,0), true); + world = new b2World(b2Vec2(0,0), true); world->SetContactListener(this); b2BodyDef def; groundBody = world->CreateBody(def); } - World::World(b2AABB aabb, b2Vec2 gravity, bool sleep, int meter) - : world(NULL), meter(meter) + World::World(b2Vec2 gravity, bool sleep) + : world(NULL) { - world = new b2World(Physics::scaleDown(aabb), Physics::scaleDown(gravity), sleep); + world = new b2World(Physics::scaleDown(gravity), sleep); world->SetContactListener(this); } diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 238f19b7f..fb6447f4d 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -87,25 +87,18 @@ namespace box2d public: /** - * 30 pixels in one meter by default. + * Creates a new world. **/ - static const int DEFAULT_METER = 30; + World(); /** - * Creates a new world with the given bounding box. - * @param aabb The bounding box. - **/ - World(b2AABB aabb); - - /** - * Creates a new world with the given bounding box, gravity + * Creates a new world with the given gravity * and whether or not the bodies should sleep when appropriate. - * @param aabb The bounding box. * @param gravity The gravity of the World. * @param sleep True if the bodies should be able to sleep, * false otherwise. **/ - World(b2AABB aabb, b2Vec2 gravity, bool sleep, int meter = DEFAULT_METER); + World(b2Vec2 gravity, bool sleep); virtual ~World(); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 111a46d39..e5bab7518 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -31,19 +31,12 @@ namespace box2d int w_newWorld(lua_State * L) { - if (lua_gettop(L) < 4) - return luaL_error(L, "Incorrect number of parameters"); + float gx = (float)luaL_optnumber(L, 1, 0); + float gy = (float)luaL_optnumber(L, 2, 0); + bool sleep = luax_optboolean(L, 3, true); + int meter = (int)luaL_optnumber(L, 4, Physics::DEFAULT_METER); - 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); - float gx = (float)luaL_optnumber(L, 5, 0); - float gy = (float)luaL_optnumber(L, 6, 0); - bool sleep = luax_optboolean(L, 7, true); - int meter = (int)luaL_optnumber(L, 8, World::DEFAULT_METER); - - World * w = instance->newWorld(lx, ly, ux, uy, gx, gy, sleep, meter); + World * w = instance->newWorld(gx, gy, sleep, meter); luax_newtype(L, "World", PHYSICS_WORLD_T, (void*)w); return 1; From 95f60474179a2bef022a4107ac79eb2a05218ef1 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 17:01:53 -0400 Subject: [PATCH 186/384] Update World contact callback definitions, get ready for collision overhaul --HG-- branch : box2d-update --- src/modules/physics/box2d/Contact.cpp | 4 +- src/modules/physics/box2d/Contact.h | 6 +- src/modules/physics/box2d/World.cpp | 79 ++++++++++++------------ src/modules/physics/box2d/World.h | 22 +++---- src/modules/physics/box2d/wrap_World.cpp | 12 ++-- src/modules/physics/box2d/wrap_World.h | 4 +- 6 files changed, 65 insertions(+), 62 deletions(-) diff --git a/src/modules/physics/box2d/Contact.cpp b/src/modules/physics/box2d/Contact.cpp index f048e8c62..bc9583ab0 100644 --- a/src/modules/physics/box2d/Contact.cpp +++ b/src/modules/physics/box2d/Contact.cpp @@ -28,8 +28,8 @@ namespace physics { namespace box2d { - Contact::Contact(World * world, const b2ContactPoint * point) - : point(*point), world(world) + Contact::Contact(World * world, b2Contact * contact) + : contact(contact), world(world) { world->retain(); } diff --git a/src/modules/physics/box2d/Contact.h b/src/modules/physics/box2d/Contact.h index c5e8aa292..150bfdc91 100644 --- a/src/modules/physics/box2d/Contact.h +++ b/src/modules/physics/box2d/Contact.h @@ -49,8 +49,8 @@ namespace box2d private: - // The Box2D contact point. - b2ContactPoint point; + // The Box2D contact. + b2Contact* contact; // The parent world. Needed for scaling. World * world; @@ -63,7 +63,7 @@ namespace box2d * data pointed to. * @param point Pointer to the Box2D contact. **/ - Contact(World * world, const b2ContactPoint * point); + Contact(World * world, const b2Contact * contact); virtual ~Contact(); diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 3cf1c5b86..ab3ce8425 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -20,6 +20,7 @@ #include "World.h" +#include "Fixture.h" #include "Shape.h" #include "Contact.h" #include "Physics.h" @@ -43,7 +44,7 @@ namespace box2d delete ref; } - void World::ContactCallback::add(World * world, const b2ContactPoint* point) + void World::ContactCallback::add(World * world, const b2Contact* contact) { /** * We must copy contacts, since we're not allowed to process @@ -52,7 +53,7 @@ namespace box2d **/ if(ref != 0) - contacts.push_back(new Contact(world, point)); + contacts.push_back(new Contact(world, contact)); } void World::ContactCallback::process() @@ -68,16 +69,16 @@ namespace box2d // Push first userdata. { - shapeudata * d = (shapeudata *)(contacts[i]->point.shape1->GetUserData()); + fixtureudata * d = (fixtureudata *)(contacts[i]->contact->GetFixtureA()->GetUserData()); if(d->ref != 0) d->ref->push(); else lua_pushnil(L); } - // Push first userdata. + // Push second userdata. { - shapeudata * d = (shapeudata *)(contacts[i]->point.shape2->GetUserData()); + fixtureudata * d = (fixtureudata *)(contacts[i]->contact->GetFixtureB()->GetUserData()); if(d->ref != 0) d->ref->push(); else @@ -99,16 +100,18 @@ namespace box2d World::World() : world(NULL) { - world = new b2World(b2Vec2(0,0), true); + world = new b2World(b2Vec2(0,0)); + world->SetAllowSleeping(true); world->SetContactListener(this); b2BodyDef def; - groundBody = world->CreateBody(def); + groundBody = world->CreateBody(&def); } World::World(b2Vec2 gravity, bool sleep) : world(NULL) { - world = new b2World(Physics::scaleDown(gravity), sleep); + world = new b2World(Physics::scaleDown(gravity)); + world->SetAllowSleeping(sleep); world->SetContactListener(this); } @@ -120,33 +123,33 @@ namespace box2d void World::update(float dt) { - world->Step(dt, 10); + world->Step(dt, 8, 6); - add.process(); - persist.process(); - remove.process(); - result.process(); + begin.process(); + end.process(); + presolve.process(); + postsolve.process(); } - void World::Add(const b2ContactPoint* point) + void World::BeginContact(b2Contact* contact) { - add.add(this, point); + begin.add(this, contact); } - void World::Persist(const b2ContactPoint* point) + void World::EndContact(b2Contact* contact) { - persist.add(this, point); + end.add(this, contact); } - void World::Remove(const b2ContactPoint* point) + void World::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { - remove.add(this, point); + presolve.add(this, contact); } - void World::Result(const b2ContactPoint* point) + void World::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { - result.add(this, point); + postsolve.add(this, contact); } int World::setCallbacks(lua_State * L) @@ -157,17 +160,17 @@ namespace box2d switch(n) { case 4: - if (result.ref) delete result.ref; - result.ref = luax_refif(L, LUA_TFUNCTION); + if (postsolve.ref) delete postsolve.ref; + postsolve.ref = luax_refif(L, LUA_TFUNCTION); case 3: - if (remove.ref) delete remove.ref; - remove.ref = luax_refif(L, LUA_TFUNCTION); + if (presolve.ref) delete presolve.ref; + presolve.ref = luax_refif(L, LUA_TFUNCTION); case 2: - if (persist.ref) delete persist.ref; - persist.ref = luax_refif(L, LUA_TFUNCTION); + if (end.ref) delete end.ref; + end.ref = luax_refif(L, LUA_TFUNCTION); case 1: - if (add.ref) delete add.ref; - add.ref = luax_refif(L, LUA_TFUNCTION); + if (begin.ref) delete begin.ref; + begin.ref = luax_refif(L, LUA_TFUNCTION); } return 0; @@ -175,10 +178,10 @@ namespace box2d int World::getCallbacks(lua_State * L) { - add.ref ? add.ref->push() : lua_pushnil(L); - persist.ref ? persist.ref->push() : lua_pushnil(L); - remove.ref ? remove.ref->push() : lua_pushnil(L); - result.ref ? result.ref->push() : lua_pushnil(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 lua_gettop(L); } @@ -189,20 +192,20 @@ namespace box2d int World::getGravity(lua_State * L) { - b2Vec2 v = Physics::scaleUp(world->m_gravity); + b2Vec2 v = Physics::scaleUp(world->GetGravity()); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); return 2; } - void World::setAllowSleep(bool allow) + void World::setAllowSleeping(bool allow) { - world->m_allowSleep = allow; + world->SetAllowSleeping(allow); } - bool World::isAllowSleep() const + bool World::getAllowSleeping() const { - return world->m_allowSleep; + return world->GetAllowSleeping(); } int World::getBodyCount() diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index fb6447f4d..21ae6f754 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -69,7 +69,7 @@ namespace box2d std::vector contacts; ContactCallback(); ~ContactCallback(); - void add(World * world, const b2ContactPoint* point); + void add(World * world, const b2Contact* contact); void process(); }; @@ -82,7 +82,7 @@ namespace box2d b2Body * groundBody; // Contact callbacks. - ContactCallback add, persist, remove, result; + ContactCallback begin, end, presolve, postsolve; public: @@ -111,16 +111,16 @@ namespace box2d void update(float dt); // From b2ContactListener - void Add(const b2ContactPoint* point); - void Persist(const b2ContactPoint* point); - void Remove(const b2ContactPoint* point); - void Result(const b2ContactPoint* point); + void BeginContact(b2Contact* contact); + void EndContact(b2Contact* contact); + void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); + void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse); /** * Receives up to four Lua functions as arguments. Each function is - * collision callback for the four events (in order): add, persist, - * remove and result. The value "nil" is accepted if one or more events - * are uninteresting. + * 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); @@ -147,13 +147,13 @@ namespace box2d * Sets whether this World allows sleep. * @param allow True to allow, false to disallow. **/ - void setAllowSleep(bool allow); + void setAllowSleeping(bool allow); /** * Returns whether this World allows sleep. * @return True if allowed, false if disallowed. **/ - bool isAllowSleep() const; + bool getAllowSleeping() const; /** * Get the current body count. diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index 7ab9e76de..4e8f14dc9 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -70,18 +70,18 @@ namespace box2d return t->getGravity(L); } - int w_World_setAllowSleep(lua_State * L) + int w_World_setAllowSleeping(lua_State * L) { World * t = luax_checkworld(L, 1); bool b = luax_toboolean(L, 2); - t->setAllowSleep(b); + t->setAllowSleeping(b); return 0; } - int w_World_isAllowSleep(lua_State * L) + int w_World_getAllowSleeping(lua_State * L) { World * t = luax_checkworld(L, 1); - luax_pushboolean(L, t->isAllowSleep()); + luax_pushboolean(L, t->getAllowSleeping()); return 1; } @@ -105,8 +105,8 @@ namespace box2d { "getCallbacks", w_World_getCallbacks }, { "setGravity", w_World_setGravity }, { "getGravity", w_World_getGravity }, - { "setAllowSleep", w_World_setAllowSleep }, - { "isAllowSleep", w_World_isAllowSleep }, + { "setAllowSleeping", w_World_setAllowSleeping }, + { "getAllowSleeping", w_World_getAllowSleeping }, { "getBodyCount", w_World_getBodyCount }, { "getJointCount", w_World_getJointCount }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index 0ba044d84..7f99a7449 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -37,8 +37,8 @@ namespace box2d int w_World_getCallbacks(lua_State * L); int w_World_setGravity(lua_State * L); int w_World_getGravity(lua_State * L); - int w_World_setAllowSleep(lua_State * L); - int w_World_isAllowSleep(lua_State * L); + int w_World_setAllowSleeping(lua_State * L); + int w_World_getAllowSleeping(lua_State * L); int w_World_getBodyCount(lua_State * L); int w_World_getJointCount(lua_State * L); int luaopen_world(lua_State * L); From 71abae06c74df139cc97cf0c64acd3f81668ad03 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 18:01:40 -0400 Subject: [PATCH 187/384] Implement Fixture class properly. --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 6 + src/common/types.h | 2 + src/modules/physics/box2d/Fixture.cpp | 295 +++++++++++++++++- src/modules/physics/box2d/Fixture.h | 129 ++++---- src/modules/physics/box2d/Physics.cpp | 5 + src/modules/physics/box2d/Physics.h | 8 + src/modules/physics/box2d/Shape.h | 1 + src/modules/physics/box2d/wrap_Fixture.cpp | 284 +++++++++++++++++ src/modules/physics/box2d/wrap_Fixture.h | 67 ++++ src/modules/physics/box2d/wrap_Physics.cpp | 9 + src/modules/physics/box2d/wrap_Physics.h | 1 + 11 files changed, 745 insertions(+), 62 deletions(-) create mode 100644 src/modules/physics/box2d/wrap_Fixture.cpp create mode 100644 src/modules/physics/box2d/wrap_Fixture.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index befd5e9e1..501020983 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -139,6 +139,7 @@ A946D85510425002002BF36C /* wrap_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B9110420ACC007D418B /* wrap_Timer.cpp */; }; A946D85610425002002BF36C /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B8F10420ACC007D418B /* Timer.cpp */; }; A95684F7125D3555001B276B /* b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A95684F5125D3555001B276B /* b64.cpp */; }; + A958F911142D364C007F320F /* wrap_Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A958F910142D3627007F320F /* wrap_Fixture.cpp */; }; A968F0CF1083A9A900A895AA /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0CE1083A9A900A895AA /* Event.cpp */; }; A968F0D11083A9B900A895AA /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D01083A9B900A895AA /* File.cpp */; }; A968F0D31083A9D400A895AA /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D21083A9D400A895AA /* Graphics.cpp */; }; @@ -535,6 +536,8 @@ A946D4421176AC42005E1462 /* Font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = ""; }; A95684F5125D3555001B276B /* b64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b64.cpp; sourceTree = ""; }; A95684F6125D3555001B276B /* b64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b64.h; sourceTree = ""; }; + A958F910142D3627007F320F /* wrap_Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Fixture.cpp; sourceTree = ""; }; + A958F912142D3687007F320F /* wrap_Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Fixture.h; sourceTree = ""; }; A968F0C61083A07B00A895AA /* EnumMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EnumMap.h; sourceTree = ""; }; A968F0C71083A07C00A895AA /* StringMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringMap.h; sourceTree = ""; }; A968F0CE1083A9A900A895AA /* Event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Event.cpp; sourceTree = ""; }; @@ -1260,6 +1263,8 @@ A93E6B5710420ACA007D418B /* wrap_DistanceJoint.h */, A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */, A96F41A61412C92B0067FE9A /* wrap_EdgeShape.h */, + A958F910142D3627007F320F /* wrap_Fixture.cpp */, + A958F912142D3687007F320F /* wrap_Fixture.h */, A9B6432D13BF87E400DC3C7E /* wrap_FrictionJoint.cpp */, A9B6432E13BF87EA00DC3C7E /* wrap_FrictionJoint.h */, A93E6B5810420ACA007D418B /* wrap_GearJoint.cpp */, @@ -1822,6 +1827,7 @@ A9D1D2041422578C00A8BC2F /* wrap_RopeJoint.cpp in Sources */, A9D1D20A1422959100A8BC2F /* ChainShape.cpp in Sources */, A9D1D20D14229B6500A8BC2F /* wrap_ChainShape.cpp in Sources */, + A958F911142D364C007F320F /* wrap_Fixture.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/common/types.h b/src/common/types.h index 567d93744..876aac852 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -69,6 +69,7 @@ namespace love PHYSICS_WORLD_ID, PHYSICS_CONTACT_ID, PHYSICS_BODY_ID, + PHYSICS_FIXTURE_ID, PHYSICS_SHAPE_ID, PHYSICS_CIRCLE_SHAPE_ID, PHYSICS_POLYGON_SHAPE_ID, @@ -140,6 +141,7 @@ namespace love 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; diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index fca250b11..47d2461a3 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -1,9 +1,290 @@ -// -// Fixture.cpp -// love -// -// Created by Bill Meltsner on 3/13/11. -// Copyright 2011 Bill Meltsner. All rights reserved. -// +/** +* 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. +**/ #include "Fixture.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +// STD +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + Fixture::Fixture(Body * body, Shape * shape) + : body(body), shape(shape), fixture(NULL) + { + body->retain(); + shape->retain(); + data = new fixtureudata(); + data->ref = 0; + b2FixtureDef def; + def.shape = shape->shape; + def.userData = (void *)data; + fixture = body->body->CreateFixture(&def); + } + + Fixture::~Fixture() + { + if(data->ref != 0) + delete data->ref; + + delete data; + data = 0; + + if (fixture) + body->body->DestroyFixture(fixture); + fixture = 0; + + body->release(); + } + + Shape::Type Fixture::getType() const + { + return shape->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 + { + return shape; + } + + void Fixture::setFilterData(int * v) + { + b2Filter f; + f.categoryBits = (unsigned short)v[0]; + f.maskBits = (unsigned short)v[1]; + f.groupIndex = 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] = 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); + 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, 0); + b2RayCastInput input; + input.p1.Set(p1x, p1y); + input.p2.Set(p2x, p2y); + input.maxFraction = maxFraction; + b2Transform transform(b2Vec2(x, y), b2Rot(r)); + b2RayCastOutput output; + fixture->RayCast(&output, input, childIndex); + lua_pushnumber(L, Physics::scaleUp(output.normal.x)); + lua_pushnumber(L, Physics::scaleUp(output.normal.y)); + lua_pushnumber(L, output.fraction); + return 3; + } + + int Fixture::getBoundingBox(lua_State * L) const + { + int childIndex = (int)luaL_optint(L, 1, 0); + 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; + } + + +} // box2d +} // physics +} // love diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index 76760b5d7..c06d9d8ca 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -59,6 +59,8 @@ namespace box2d { protected: + Body * body; + Shape * shape; b2Fixture * fixture; fixtureudata * data; @@ -76,6 +78,64 @@ namespace box2d * debug drawing. **/ Shape::Type getType() const; + + /** + * Gets the Shape attached to this Fixture. + **/ + Shape * getShape() 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; + + /** + * Gets the next Fixture attached to the parent Body. + **/ + Fixture * getNext() 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. @@ -95,12 +155,6 @@ namespace box2d **/ void setDensity(float density); - /** - * Set whether this Fixture should be a sensor or not. - * @param sensor True if sensor, false if not. - **/ - void setSensor(bool sensor); - /** * Gets the friction of the Fixture. * @returns The friction. @@ -118,45 +172,19 @@ namespace box2d * @return The density. **/ float getDensity() const; - - /** - * Checks whether this Fixture acts as a sensor. - * @return True if sensor, false otherwise. - **/ - bool isSensor() const; - - /** - * Get the body attatched to this Fixture. - * @return The parent Body. - **/ - Body * getBody() const; - + /** * Checks if a point is inside the Fixture. - * @param x The x-component of the Fixture. - * @param y The y-component of 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; - + /** - * Tests whether a line segment intersects a Fixture. + * Cast a ray against this Fixture. **/ - int testSegment(lua_State * L); - - /** - * 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); - + int rayCast(lua_State * L) const; + void setGroupIndex(int index); int getGroupIndex() const; @@ -167,27 +195,18 @@ namespace box2d uint16 getBits(lua_State * L); int pushBits(lua_State * L, uint16 bits); - /** - * 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 setData(lua_State * L); - - /** - * Gets the data set with setData. If no - * data is set, nil is returned. - **/ - int getData(lua_State * L); - /** * 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); + int getBoundingBox(lua_State * L) const; + + /** + * Gets the mass data for this Fixture. + * This operation may be expensive. + **/ + int getMassData(lua_State * L) const; }; } // box2d diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 5c7c59361..3aee9e050 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -59,6 +59,11 @@ namespace box2d { return new Body(world, b2Vec2(0, 0), 1, 1); } + + Fixture * Physics::newFixture(Body * body, Shape * shape) + { + return new Fixture(body, shape); + } CircleShape * Physics::newCircleShape(float radius) { diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 2cca64dec..342eae8de 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -26,6 +26,7 @@ #include "World.h" #include "Contact.h" #include "Body.h" +#include "Fixture.h" #include "Shape.h" #include "CircleShape.h" #include "PolygonShape.h" @@ -98,6 +99,13 @@ namespace box2d * @param world The world to create the Body in. **/ Body * newBody(World * world); + + /** + * Creates a new Fixture. + * @param body The body to attach the Fixture to. + * @param shape The shape to attach to the Fixture. + **/ + Fixture * newFixture(Body * body, Shape * shape); /** * Creates a new CircleShape at (0, 0). diff --git a/src/modules/physics/box2d/Shape.h b/src/modules/physics/box2d/Shape.h index d388088c3..78334a6f7 100644 --- a/src/modules/physics/box2d/Shape.h +++ b/src/modules/physics/box2d/Shape.h @@ -44,6 +44,7 @@ namespace box2d **/ class Shape : public love::physics::Shape { + friend class Fixture; protected: diff --git a/src/modules/physics/box2d/wrap_Fixture.cpp b/src/modules/physics/box2d/wrap_Fixture.cpp new file mode 100644 index 000000000..bc758f4db --- /dev/null +++ b/src/modules/physics/box2d/wrap_Fixture.cpp @@ -0,0 +1,284 @@ +/** +* 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. +**/ + +#include "wrap_Fixture.h" +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + Fixture * luax_checkfixture(lua_State * L, int idx) + { + return luax_checktype(L, idx, "Fixture", PHYSICS_FIXTURE_T); + } + + 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); + 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_newtype(L, "Body", PHYSICS_BODY_T, (void*)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; + shape->retain(); + luax_newtype(L, "Shape", PHYSICS_SHAPE_T, (void*)shape); + 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); + return t->rayCast(L); + } + + 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) + { + Proxy * p = (Proxy *)lua_touserdata(L, 1); + p->own = false; + + Fixture * t = (Fixture *)p->data; + t->release(); + 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 } + }; + + int luaopen_fixture(lua_State * L) + { + return luax_register_type(L, "Fixture", functions); + } + +} // box2d +} // physics +} // love + diff --git a/src/modules/physics/box2d/wrap_Fixture.h b/src/modules/physics/box2d/wrap_Fixture.h new file mode 100644 index 000000000..d41f6b25a --- /dev/null +++ b/src/modules/physics/box2d/wrap_Fixture.h @@ -0,0 +1,67 @@ +/** +* 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_PHYSICS_BOX2D_WRAP_FIXTURE_H +#define LOVE_PHYSICS_BOX2D_WRAP_FIXTURE_H + +// LOVE +#include +#include "Fixture.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); + int luaopen_fixture(lua_State * L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_FIXTURE_H diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index e5bab7518..928706dde 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -53,6 +53,15 @@ namespace box2d luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); return 1; } + + int w_newFixture(lua_State * L) + { + Body * body = luax_checkbody(L, 1); + Shape * shape = luax_checkshape(L, 2); + Fixture * fixture = instance->newFixture(body, shape); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)fixture); + return 1; + } int w_newCircleShape(lua_State * L) { diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 29d7e2e58..09cf0b4cf 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -52,6 +52,7 @@ 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); From 0678eac4531a547e2d366937df0ecc08febd3ae2 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 21:25:41 -0400 Subject: [PATCH 188/384] A first attempt at overhauling collision. New everything. --HG-- branch : box2d-update --- src/modules/physics/box2d/Contact.cpp | 78 +++++++++++++------- src/modules/physics/box2d/Contact.h | 67 ++++++++++++------ src/modules/physics/box2d/World.cpp | 36 +++++++--- src/modules/physics/box2d/World.h | 8 ++- src/modules/physics/box2d/wrap_Contact.cpp | 82 +++++++++++++++++----- src/modules/physics/box2d/wrap_Contact.h | 11 ++- 6 files changed, 203 insertions(+), 79 deletions(-) diff --git a/src/modules/physics/box2d/Contact.cpp b/src/modules/physics/box2d/Contact.cpp index bc9583ab0..7a1b9ffa8 100644 --- a/src/modules/physics/box2d/Contact.cpp +++ b/src/modules/physics/box2d/Contact.cpp @@ -28,54 +28,82 @@ namespace physics { namespace box2d { - Contact::Contact(World * world, b2Contact * contact) - : contact(contact), world(world) + Contact::Contact(b2Contact * contact) + : contact(contact) { - world->retain(); } Contact::~Contact() { - world->release(); } - int Contact::getPosition(lua_State * L) + int Contact::getPositions(lua_State * L) { love::luax_assert_argc(L, 1, 1); - lua_pushnumber(L, Physics::scaleUp(point.position.x)); - lua_pushnumber(L, Physics::scaleUp(point.position.y)); - return 2; - } - - int Contact::getVelocity(lua_State * L) - { - love::luax_assert_argc(L, 1, 1); - lua_pushnumber(L, Physics::scaleUp(point.velocity.x)); - lua_pushnumber(L, Physics::scaleUp(point.velocity.y)); - return 2; + 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); - lua_pushnumber(L, Physics::scaleUp(point.normal.x)); - lua_pushnumber(L, Physics::scaleUp(point.normal.y)); + b2WorldManifold manifold; + contact->GetWorldManifold(&manifold); + lua_pushnumber(L, Physics::scaleUp(manifold.normal.x)); + lua_pushnumber(L, Physics::scaleUp(manifold.normal.y)); return 2; } - float Contact::getSeparation() const - { - return Physics::scaleUp(point.separation); - } - float Contact::getFriction() const { - return point.friction; + return contact->GetFriction(); } float Contact::getRestitution() const { - return point.restitution; + 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(); } } // box2d diff --git a/src/modules/physics/box2d/Contact.h b/src/modules/physics/box2d/Contact.h index 150bfdc91..8db2f5233 100644 --- a/src/modules/physics/box2d/Contact.h +++ b/src/modules/physics/box2d/Contact.h @@ -51,10 +51,7 @@ namespace box2d // The Box2D contact. b2Contact* contact; - - // The parent world. Needed for scaling. - World * world; - + public: /** @@ -63,23 +60,16 @@ namespace box2d * data pointed to. * @param point Pointer to the Box2D contact. **/ - Contact(World * world, const b2Contact * contact); + Contact(b2Contact * contact); virtual ~Contact(); /** - * Gets the position of the Contact. + * Gets the position of each point of contact. * @return The position along the x-axis. * @return The position along the y-axis. **/ - int getPosition(lua_State * L); - - /** - * Gets the linear impact velocity. - * @return The velocity along the x-axis. - * @return The velocity along the y-axis. - **/ - int getVelocity(lua_State * L); + int getPositions(lua_State * L); /** * Gets the collision normal. @@ -89,22 +79,55 @@ namespace box2d int getNormal(lua_State * L); /** - * How far apart the shapes are. If they are intersecting - * this value is negative. - **/ - float getSeparation() const; - - /** - * The mixed friction between the two shapes at + * The mixed friction between the two fixtures at * the point of impact. **/ float getFriction() const; /** - * The mixed restitution of the two shapes + * 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(); }; diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index ab3ce8425..9649d9f8a 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -44,7 +44,7 @@ namespace box2d delete ref; } - void World::ContactCallback::add(World * world, const b2Contact* contact) + void World::ContactCallback::add(b2Contact* contact) { /** * We must copy contacts, since we're not allowed to process @@ -53,7 +53,15 @@ namespace box2d **/ if(ref != 0) - contacts.push_back(new Contact(world, contact)); + contacts.push_back(new Contact(contact)); + } + + void World::ContactCallback::add(b2Contact* contact, const b2ContactImpulse* impulse) + { + if(ref != 0) { + contacts.push_back(new Contact(contact)); + impulses.push_back(impulse); + } } void World::ContactCallback::process() @@ -86,13 +94,25 @@ namespace box2d } luax_newtype(L, "Contact", (PHYSICS_CONTACT_T), (void*)contacts[i], false); - lua_call(L, 3, 0); + + int args = 3; + if ((int)impulses.size() > i) { + const b2ContactImpulse * impulse = impulses[i]; + 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); } // Clear contacts. for(int i = 0;i<(int)contacts.size();i++) delete contacts[i]; contacts.clear(); + // Clear impulses. + impulses.clear(); } } @@ -134,22 +154,22 @@ namespace box2d void World::BeginContact(b2Contact* contact) { - begin.add(this, contact); + begin.add(contact); } void World::EndContact(b2Contact* contact) { - end.add(this, contact); + end.add(contact); } - void World::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) + void World::PreSolve(b2Contact* contact) { - presolve.add(this, contact); + presolve.add(contact); } void World::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { - postsolve.add(this, contact); + postsolve.add(contact, impulse); } int World::setCallbacks(lua_State * L) diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 21ae6f754..25ae32b2c 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -67,9 +67,13 @@ namespace box2d public: Reference * ref; std::vector contacts; + std::vector impulses; + b2Manifold* oldManifold; + b2ContactImpulse* impulse; ContactCallback(); ~ContactCallback(); - void add(World * world, const b2Contact* contact); + void add(b2Contact* contact); + void add(b2Contact* contact, const b2ContactImpulse* impulse); void process(); }; @@ -113,7 +117,7 @@ namespace box2d // From b2ContactListener void BeginContact(b2Contact* contact); void EndContact(b2Contact* contact); - void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); + void PreSolve(b2Contact* contact); void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse); /** diff --git a/src/modules/physics/box2d/wrap_Contact.cpp b/src/modules/physics/box2d/wrap_Contact.cpp index 16eefa818..71997d790 100644 --- a/src/modules/physics/box2d/wrap_Contact.cpp +++ b/src/modules/physics/box2d/wrap_Contact.cpp @@ -32,31 +32,18 @@ namespace box2d return luax_checktype(L, idx, "Contact", PHYSICS_CONTACT_T); } - int w_Contact_getPosition(lua_State * L) + int w_Contact_getPositions(lua_State * L) { Contact * t = luax_checkcontact(L, 1); - return t->getPosition(L); + return t->getPositions(L); } - - int w_Contact_getVelocity(lua_State * L) - { - Contact * t = luax_checkcontact(L, 1); - return t->getVelocity(L); - } - + int w_Contact_getNormal(lua_State * L) { Contact * t = luax_checkcontact(L, 1); return t->getNormal(L); } - int w_Contact_getSeparation(lua_State * L) - { - Contact * t = luax_checkcontact(L, 1); - lua_pushnumber(L, t->getSeparation()); - return 1; - } - int w_Contact_getFriction(lua_State * L) { Contact * t = luax_checkcontact(L, 1); @@ -70,16 +57,73 @@ namespace box2d 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 luaopen_contact(lua_State * L) { static const luaL_Reg functions[] = { - { "getPosition", w_Contact_getPosition }, - { "getVelocity", w_Contact_getVelocity }, + { "getPositions", w_Contact_getPositions }, { "getNormal", w_Contact_getNormal }, - { "getSeparation", w_Contact_getSeparation }, { "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 }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Contact.h b/src/modules/physics/box2d/wrap_Contact.h index 2e261a8f3..3c0c906a8 100644 --- a/src/modules/physics/box2d/wrap_Contact.h +++ b/src/modules/physics/box2d/wrap_Contact.h @@ -32,12 +32,17 @@ namespace physics namespace box2d { Contact * luax_checkcontact(lua_State * L, int idx); - int w_Contact_getPosition(lua_State * L); - int w_Contact_getVelocity(lua_State * L); + int w_Contact_getPositions(lua_State * L); int w_Contact_getNormal(lua_State * L); - int w_Contact_getSeparation(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 luaopen_contact(lua_State * L); } // box2d From 367dbc2ecccde8465e2775a40497ef71394403bd Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 22:21:14 -0400 Subject: [PATCH 189/384] Update Body API. --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 6 + src/modules/physics/Body.cpp | 51 ++++++ src/modules/physics/Body.h | 59 +++++++ src/modules/physics/box2d/Body.cpp | 161 ++++++++++++------ src/modules/physics/box2d/Body.h | 91 ++++++---- src/modules/physics/box2d/Fixture.h | 7 - src/modules/physics/box2d/Physics.cpp | 14 +- src/modules/physics/box2d/Physics.h | 17 -- src/modules/physics/box2d/World.cpp | 3 +- src/modules/physics/box2d/World.h | 2 +- src/modules/physics/box2d/wrap_Body.cpp | 154 ++++++++++++----- src/modules/physics/box2d/wrap_Body.h | 32 ++-- src/modules/physics/box2d/wrap_Physics.cpp | 13 +- src/modules/physics/box2d/wrap_Physics.h | 1 - 14 files changed, 416 insertions(+), 195 deletions(-) create mode 100644 src/modules/physics/Body.cpp create mode 100644 src/modules/physics/Body.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 501020983..7e081e935 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -140,6 +140,7 @@ A946D85610425002002BF36C /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B8F10420ACC007D418B /* Timer.cpp */; }; A95684F7125D3555001B276B /* b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A95684F5125D3555001B276B /* b64.cpp */; }; A958F911142D364C007F320F /* wrap_Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A958F910142D3627007F320F /* wrap_Fixture.cpp */; }; + A958F917142D6B3A007F320F /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A958F916142D6B37007F320F /* Body.cpp */; }; A968F0CF1083A9A900A895AA /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0CE1083A9A900A895AA /* Event.cpp */; }; A968F0D11083A9B900A895AA /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D01083A9B900A895AA /* File.cpp */; }; A968F0D31083A9D400A895AA /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D21083A9D400A895AA /* Graphics.cpp */; }; @@ -538,6 +539,8 @@ A95684F6125D3555001B276B /* b64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b64.h; sourceTree = ""; }; A958F910142D3627007F320F /* wrap_Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Fixture.cpp; sourceTree = ""; }; A958F912142D3687007F320F /* wrap_Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Fixture.h; sourceTree = ""; }; + A958F916142D6B37007F320F /* Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Body.cpp; sourceTree = ""; }; + A958F918142D6B60007F320F /* Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Body.h; sourceTree = ""; }; A968F0C61083A07B00A895AA /* EnumMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EnumMap.h; sourceTree = ""; }; A968F0C71083A07C00A895AA /* StringMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringMap.h; sourceTree = ""; }; A968F0CE1083A9A900A895AA /* Event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Event.cpp; sourceTree = ""; }; @@ -1195,6 +1198,8 @@ A93E6AE910420AC7007D418B /* physics */ = { isa = PBXGroup; children = ( + A958F916142D6B37007F320F /* Body.cpp */, + A958F918142D6B60007F320F /* Body.h */, A93E6AEA10420AC7007D418B /* box2d */, A968F0DC1083AA6600A895AA /* Joint.cpp */, A93E6B6C10420ACB007D418B /* Joint.h */, @@ -1828,6 +1833,7 @@ A9D1D20A1422959100A8BC2F /* ChainShape.cpp in Sources */, A9D1D20D14229B6500A8BC2F /* wrap_ChainShape.cpp in Sources */, A958F911142D364C007F320F /* wrap_Fixture.cpp in Sources */, + A958F917142D6B3A007F320F /* Body.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/modules/physics/Body.cpp b/src/modules/physics/Body.cpp new file mode 100644 index 000000000..eef9d6e98 --- /dev/null +++ b/src/modules/physics/Body.cpp @@ -0,0 +1,51 @@ +/** +* 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. +**/ + +#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/src/modules/physics/Body.h b/src/modules/physics/Body.h new file mode 100644 index 000000000..6dc55a83c --- /dev/null +++ b/src/modules/physics/Body.h @@ -0,0 +1,59 @@ +/** +* 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_PHYSICS_BODY_H +#define LOVE_PHYSICS_BODY_H + +// LOVE +#include +#include + +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/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 4d51f12c3..4ab323538 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -22,6 +22,8 @@ #include +#include "Shape.h" +#include "Fixture.h" #include "World.h" #include "Physics.h" @@ -31,14 +33,12 @@ namespace physics { namespace box2d { - Body::Body(World * world, b2Vec2 p, float m, float i) + Body::Body(World * world, b2Vec2 p) : world(world) { world->retain(); b2BodyDef def; def.position = Physics::scaleDown(p); - def.massData.mass = m; - def.massData.I = i; body = world->world->CreateBody(&def); } @@ -106,25 +106,65 @@ namespace box2d { return 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, data.I); + return 4; + } float Body::getAngularDamping() const { - return body->m_angularDamping; + return body->GetAngularDamping(); } float Body::getLinearDamping() const { - return body->m_linearDamping; + 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::applyImpulse(float jx, float jy) + void Body::applyLinearImpulse(float jx, float jy) { - body->ApplyImpulse(b2Vec2(jx, jy), body->GetWorldCenter()); + body->ApplyLinearImpulse(Physics::scaleDown(b2Vec2(jx, jy)), body->GetWorldCenter()); } - void Body::applyImpulse(float jx, float jy, float rx, float ry) + void Body::applyLinearImpulse(float jx, float jy, float rx, float ry) { - body->ApplyImpulse(b2Vec2(jx, jy), Physics::scaleDown(b2Vec2(rx, ry))); + body->ApplyLinearImpulse(Physics::scaleDown(b2Vec2(jx, jy)), Physics::scaleDown(b2Vec2(rx, ry))); + } + + void Body::applyAngularImpulse(float impulse) + { + body->ApplyAngularImpulse(Physics::scaleDown(impulse)); } void Body::applyTorque(float t) @@ -144,12 +184,12 @@ namespace box2d void Body::setX(float x) { - body->SetXForm(Physics::scaleDown(b2Vec2(x, getY())), getAngle()); + body->SetTransform(Physics::scaleDown(b2Vec2(x, getY())), getAngle()); } void Body::setY(float y) { - body->SetXForm(Physics::scaleDown(b2Vec2(getX(), y)), getAngle()); + body->SetTransform(Physics::scaleDown(b2Vec2(getX(), y)), getAngle()); } void Body::setLinearVelocity(float x, float y) @@ -159,7 +199,7 @@ namespace box2d void Body::setAngle(float d) { - body->SetXForm(body->GetPosition(), d); + body->SetTransform(body->GetPosition(), d); } void Body::setAngularVelocity(float r) @@ -169,31 +209,31 @@ namespace box2d void Body::setPosition(float x, float y) { - body->SetXForm(Physics::scaleDown(b2Vec2(x, y)), body->GetAngle()); + body->SetTransform(Physics::scaleDown(b2Vec2(x, y)), body->GetAngle()); } void Body::setAngularDamping(float d) { - body->m_angularDamping = d; + body->SetAngularDamping(d); } void Body::setLinearDamping(float d) { - body->m_linearDamping = d; + body->SetLinearDamping(d); } - void Body::setMassFromShapes() + void Body::resetMassData() { - body->SetMassFromShapes(); + body->ResetMassData(); } - void Body::setMass(float x, float y, float m, float i) + 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 = i; - body->SetMass(&massData); + body->SetMassData(&massData); } void Body::setInertia(float i) @@ -202,7 +242,29 @@ namespace box2d massData.center = body->GetLocalCenter(); massData.mass = body->GetMass(); massData.I = i; - body->SetMass(&massData); + 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) @@ -257,63 +319,60 @@ namespace box2d return body->SetBullet(bullet); } - bool Body::isStatic() const + bool Body::isActive() const { - return body->IsStatic(); + return body->IsActive(); } - bool Body::isDynamic() const + bool Body::isAwake() const { - return body->IsDynamic(); + return body->IsAwake(); } - bool Body::isFrozen() const + void Body::setSleepingAllowed(bool allow) { - return body->IsFrozen(); + body->SetSleepingAllowed(allow); } - bool Body::isSleeping() const + bool Body::isSleepingAllowed() const { - return body->IsSleeping(); + return body->IsSleepingAllowed(); + } + + void Body::setActive(bool active) + { + body->SetActive(active); } - void Body::setAllowSleeping(bool allow) + void Body::setAwake(bool awake) { - body->AllowSleeping(allow); - } - - bool Body::getAllowSleeping() - { - return (body->m_flags & b2Body::e_allowSleepFlag) != 0; - } - - void Body::putToSleep() - { - body->PutToSleep(); - } - - void Body::wakeUp() - { - body->WakeUp(); + body->SetAwake(awake); } void Body::setFixedRotation(bool fixed) { - if(fixed) - body->m_flags |= b2Body::e_fixedRotationFlag; - else - body->m_flags &= ~(b2Body::e_fixedRotationFlag); + body->SetFixedRotation(fixed); } - bool Body::getFixedRotation() const + bool Body::isFixedRotation() const { - return (body->m_flags & b2Body::e_fixedRotationFlag) != 0; + return body->IsFixedRotation(); } World * Body::getWorld() const { return world; } + + Fixture * Body::createFixture(Shape * shape) + { + return new Fixture(this, shape); + } + + void Body::destroyFixture(Fixture * fixture) + { + fixture->release(); + } b2Vec2 Body::getVector(lua_State * L) { diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 83996e17c..ddc5023cf 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -25,7 +25,7 @@ #include #include #include - +#include // Box2D #include @@ -38,6 +38,8 @@ namespace box2d { // Forward declarations. class World; + class Shape; + class Fixture; /** * A Body is an entity which has position and orientation @@ -45,7 +47,7 @@ namespace box2d * by itself, but depend on an arbitrary number of child Shape objects * which together constitute the final geometry for the Body. **/ - class Body : public Object + class Body : public love::physics::Body { // Friends. friend class Joint; @@ -73,7 +75,7 @@ namespace box2d /** * Create a Body at position p. **/ - Body(World * world, b2Vec2 p, float m, float i); + Body(World * world, b2Vec2 p); virtual ~Body(); @@ -134,6 +136,11 @@ namespace box2d * Gets the Body's intertia. **/ float getInertia() const; + + /** + * Gets mass properties. + **/ + int getMassData(lua_State * L); /** * Gets the Body's angular damping. @@ -144,16 +151,31 @@ namespace box2d * 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 applyImpulse(float jx, float jy); + void applyLinearImpulse(float jx, float jy); /** * Apply an impulse (jx, jy) with offset (rx, ry). **/ - void applyImpulse(float jx, float jy, float rx, float ry); + void applyLinearImpulse(float jx, float jy, float rx, float ry); + + /** + * Apply an angular impulse to the body. + **/ + void applyAngularImpulse(float impulse); /** * Apply torque (t). @@ -203,7 +225,7 @@ namespace box2d /** * Sets the mass from the currently attatched shapes. **/ - void setMassFromShapes(); + void resetMassData(); /** * Sets mass properties. @@ -212,7 +234,7 @@ namespace box2d * @param m The mass. * @param i The inertia. **/ - void setMass(float x, float y, float m, float i); + void setMassData(float x, float y, float m, float i); /** * Sets the inertia while keeping the other properties @@ -230,6 +252,16 @@ namespace box2d * 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 @@ -301,51 +333,44 @@ namespace box2d void setBullet(bool bullet); /** - * Checks whether a Body is static or not, i.e. terrain - * or not. + * Checks whether a Body is active or not. An inactive body + * cannot be interacted with. **/ - bool isStatic() const; + bool isActive() const; /** - * The opposite of isStatic. - **/ - bool isDynamic() const; - - /** - * Checks whether a Body is frozen or not. - * A Body will freeze if hits the world bounding box. - **/ - bool isFrozen() const; - - /** - * Checks whether a Body is sleeping or nor. A Body + * Checks whether a Body is awake or not. A Body * will fall to sleep if nothing happens to it for while. **/ - bool isSleeping() const; + bool isAwake() const; /** * Controls whether this Body should be allowed to sleep. **/ - void setAllowSleeping(bool allow); - bool getAllowSleeping(); + void setSleepingAllowed(bool allow); + bool isSleepingAllowed() const; + + /** + * Changes the body's active state. + **/ + void setActive(bool active); /** - * Puts the body to sleep. + * Changes the body's sleep state. **/ - void putToSleep(); - - /** - * Wakes the Body up. - **/ - void wakeUp(); + void setAwake(bool awake); void setFixedRotation(bool fixed); - bool getFixedRotation() const; + bool isFixedRotation() const; /** * Get the World this Body resides in. */ World * getWorld() const; + + Fixture * createFixture(Shape * shape); + + void destroyFixture(Fixture * fixture); private: /** diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index c06d9d8ca..17dc831f3 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -101,13 +101,6 @@ namespace box2d **/ Body * getBody() const; - /** - * Gets the next Fixture attached to the parent Body. - **/ - Fixture * getNext() const; - - - /** * Sets the filter data. An integer array is used even though the * first two elements are unsigned shorts. The elements are: diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 3aee9e050..cdf9fc07e 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -45,26 +45,16 @@ namespace box2d return new World(b2Vec2(gx, gy), sleep); } - Body * Physics::newBody(World * world, float x, float y, float mass, float i) - { - return new Body(world, b2Vec2(x, y), mass, i); - } - Body * Physics::newBody(World * world, float x, float y) { - return new Body(world, b2Vec2(x, y), 1, 1); + return new Body(world, b2Vec2(x, y)); } Body * Physics::newBody(World * world) { - return new Body(world, b2Vec2(0, 0), 1, 1); + return new Body(world, b2Vec2(0, 0)); } - Fixture * Physics::newFixture(Body * body, Shape * shape) - { - return new Fixture(body, shape); - } - CircleShape * Physics::newCircleShape(float radius) { return newCircleShape(0, 0, radius); diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 342eae8de..a51677ae0 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -76,16 +76,6 @@ namespace box2d **/ World * newWorld(float gx, float gy, bool sleep, int meter); - /** - * 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 x The position along the y-axis. - * @param m The mass. - * @param i The rotational inertia. - **/ - Body * newBody(World * world, float x, float y, float m, float i); - /** * Creates a new Body at the specified position. * @param world The world to create the Body in. @@ -99,13 +89,6 @@ namespace box2d * @param world The world to create the Body in. **/ Body * newBody(World * world); - - /** - * Creates a new Fixture. - * @param body The body to attach the Fixture to. - * @param shape The shape to attach to the Fixture. - **/ - Fixture * newFixture(Body * body, Shape * shape); /** * Creates a new CircleShape at (0, 0). diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 9649d9f8a..206206696 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -162,8 +162,9 @@ namespace box2d end.add(contact); } - void World::PreSolve(b2Contact* contact) + void World::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { + B2_NOT_USED(oldManifold); // not sure what to do with this presolve.add(contact); } diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 25ae32b2c..b76eee41c 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -117,7 +117,7 @@ namespace box2d // From b2ContactListener void BeginContact(b2Contact* contact); void EndContact(b2Contact* contact); - void PreSolve(b2Contact* contact); + void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse); /** diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index 2d97f4c74..40fa1b463 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -120,6 +120,13 @@ namespace box2d 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) { @@ -134,8 +141,24 @@ namespace box2d 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_applyImpulse(lua_State * L) + int w_Body_applyLinearImpulse(lua_State * L) { Body * t = luax_checkbody(L, 1); float jx = (float)luaL_checknumber(L, 2); @@ -143,13 +166,13 @@ namespace box2d if(lua_gettop(L) == 3) { - t->applyImpulse(jx, jy); + t->applyLinearImpulse(jx, jy); } else if(lua_gettop(L) == 5) { float rx = (float)luaL_checknumber(L, 4); float ry = (float)luaL_checknumber(L, 5); - t->applyImpulse(jx, jy, rx, ry); + t->applyLinearImpulse(jx, jy, rx, ry); } else { @@ -158,6 +181,14 @@ namespace box2d return 0; } + + int w_Body_applyAngularImpulse(lua_State * L) + { + Body * t = luax_checkbody(L, 1); + float i = (float)luaL_checknumber(L, 2); + t->applyAngularImpulse(i); + return 0; + } int w_Body_applyTorque(lua_State * L) { @@ -242,21 +273,21 @@ namespace box2d return 0; } - int w_Body_setMassFromShapes(lua_State * L) + int w_Body_resetMassData(lua_State * L) { Body * t = luax_checkbody(L, 1); - t->setMassFromShapes(); + t->resetMassData(); return 0; } - int w_Body_setMass(lua_State * L) + 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); - t->setMass(x, y, m, i); + t->setMassData(x, y, m, i); return 0; } @@ -283,6 +314,24 @@ namespace box2d 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); + t->setType(type); + return 0; + } int w_Body_getWorldPoint(lua_State * L) { @@ -383,60 +432,48 @@ namespace box2d return 0; } - int w_Body_isStatic(lua_State * L) + int w_Body_isActive(lua_State * L) { Body * t = luax_checkbody(L, 1); - luax_pushboolean(L, t->isStatic()); + luax_pushboolean(L, t->isActive()); return 1; } - int w_Body_isDynamic(lua_State * L) + int w_Body_isAwake(lua_State * L) { Body * t = luax_checkbody(L, 1); - luax_pushboolean(L, t->isDynamic()); + luax_pushboolean(L, t->isAwake()); return 1; } - int w_Body_isFrozen(lua_State * L) - { - Body * t = luax_checkbody(L, 1); - luax_pushboolean(L, t->isFrozen()); - return 1; - } - - int w_Body_isSleeping(lua_State * L) - { - Body * t = luax_checkbody(L, 1); - luax_pushboolean(L, t->isSleeping()); - return 1; - } - - int w_Body_setAllowSleeping(lua_State * L) + int w_Body_setSleepingAllowed(lua_State * L) { Body * t = luax_checkbody(L, 1); bool b = luax_toboolean(L, 2); - t->setAllowSleeping(b); + t->setSleepingAllowed(b); return 0; } - int w_Body_getAllowSleeping(lua_State * L) + int w_Body_isSleepingAllowed(lua_State * L) { Body * t = luax_checkbody(L, 1); - lua_pushboolean(L, t->getAllowSleeping()); + lua_pushboolean(L, t->isSleepingAllowed()); return 1; } - int w_Body_putToSleep(lua_State * L) + int w_Body_setActive(lua_State * L) { Body * t = luax_checkbody(L, 1); - t->putToSleep(); + bool b = luax_toboolean(L, 2); + t->setActive(b); return 0; } - int w_Body_wakeUp(lua_State * L) + int w_Body_setAwake(lua_State * L) { Body * t = luax_checkbody(L, 1); - t->wakeUp(); + bool b = luax_toboolean(L, 2); + t->setAwake(b); return 0; } @@ -448,13 +485,30 @@ namespace box2d return 0; } - int w_Body_getFixedRotation(lua_State * L) + int w_Body_isFixedRotation(lua_State * L) { Body * t = luax_checkbody(L, 1); - bool b = t->getFixedRotation(); + bool b = t->isFixedRotation(); luax_pushboolean(L, b); return 1; } + + int w_Body_createFixture(lua_State * L) + { + Body * t = luax_checkbody(L, 1); + Shape * s = luax_checktype(L, 2, "Shape", PHYSICS_SHAPE_T); + Fixture * f = t->createFixture(s); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); + return 1; + } + + int w_Body_destroyFixture(lua_State * L) + { + Body * t = luax_checkbody(L, 1); + Fixture * f = luax_checktype(L, 2, "Fixture", PHYSICS_FIXTURE_T); + t->destroyFixture(f); + return 0; + } int w_Body_destroy(lua_State * L) { @@ -478,9 +532,13 @@ namespace box2d { "getAngularVelocity", w_Body_getAngularVelocity }, { "getMass", w_Body_getMass }, { "getInertia", w_Body_getInertia }, + { "getMassData", w_Body_getMassData }, { "getAngularDamping", w_Body_getAngularDamping }, { "getLinearDamping", w_Body_getLinearDamping }, - { "applyImpulse", w_Body_applyImpulse }, + { "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 }, @@ -489,11 +547,13 @@ namespace box2d { "setAngle", w_Body_setAngle }, { "setAngularVelocity", w_Body_setAngularVelocity }, { "setPosition", w_Body_setPosition }, - { "setMassFromShapes", w_Body_setMassFromShapes }, - { "setMass", w_Body_setMass }, + { "resetMassData", w_Body_resetMassData }, + { "setMassData", w_Body_setMassData }, { "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 }, { "getLocalPoint", w_Body_getLocalPoint }, @@ -502,16 +562,16 @@ namespace box2d { "getLinearVelocityFromLocalPoint", w_Body_getLinearVelocityFromLocalPoint }, { "isBullet", w_Body_isBullet }, { "setBullet", w_Body_setBullet }, - { "isStatic", w_Body_isStatic }, - { "isDynamic", w_Body_isDynamic }, - { "isFrozen", w_Body_isFrozen }, - { "isSleeping", w_Body_isSleeping }, - { "setAllowSleeping", w_Body_setAllowSleeping }, - { "getAllowSleeping", w_Body_getAllowSleeping }, - { "putToSleep", w_Body_putToSleep }, - { "wakeUp", w_Body_wakeUp }, + { "isActive", w_Body_isActive }, + { "isAwake", w_Body_isAwake }, + { "setSleepingAllowed", w_Body_setSleepingAllowed }, + { "isSleepingAllowde", w_Body_isSleepingAllowed }, + { "setActive", w_Body_setActive }, + { "setAwake", w_Body_setAwake }, { "setFixedRotation", w_Body_setFixedRotation }, - { "getFixedRotation", w_Body_getFixedRotation }, + { "isFixedRotation", w_Body_isFixedRotation }, + { "createFixture", w_Body_createFixture }, + { "destroyFixture", w_Body_destroyFixture }, { "destroy", w_Body_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Body.h b/src/modules/physics/box2d/wrap_Body.h index 9be3fc1b1..b4f58d2cd 100644 --- a/src/modules/physics/box2d/wrap_Body.h +++ b/src/modules/physics/box2d/wrap_Body.h @@ -43,22 +43,28 @@ namespace box2d 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_applyImpulse(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_setVelocity(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_setMassFromShapes(lua_State * L); - int w_Body_setMass(lua_State * L); + int w_Body_resetMassData(lua_State * L); + int w_Body_setMassData(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_getLocalPoint(lua_State * L); @@ -67,16 +73,16 @@ namespace box2d int w_Body_getLinearVelocityFromLocalPoint(lua_State * L); int w_Body_isBullet(lua_State * L); int w_Body_setBullet(lua_State * L); - int w_Body_isStatic(lua_State * L); - int w_Body_isDynamic(lua_State * L); - int w_Body_isFrozen(lua_State * L); - int w_Body_isSleeping(lua_State * L); - int w_Body_setAllowSleeping(lua_State * L); - int w_Body_getAllowSleeping(lua_State * L); - int w_Body_putToSleep(lua_State * L); - int w_Body_wakeUp(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_getFixedRotation(lua_State * L); + int w_Body_isFixedRotation(lua_State * L); + int w_Body_createFixture(lua_State * L); + int w_Body_destroyFixture(lua_State * L); int w_Body_destroy(lua_State * L); int luaopen_body(lua_State * L); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 928706dde..343907016 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -47,21 +47,10 @@ namespace box2d 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); - float m = (float)luaL_optnumber(L, 4, 0.0); - float i = (float)luaL_optnumber(L, 5, 0.0); - Body * body = instance->newBody(world, x, y, m, i); + Body * body = instance->newBody(world, x, y); luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); return 1; } - - int w_newFixture(lua_State * L) - { - Body * body = luax_checkbody(L, 1); - Shape * shape = luax_checkshape(L, 2); - Fixture * fixture = instance->newFixture(body, shape); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)fixture); - return 1; - } int w_newCircleShape(lua_State * L) { diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 09cf0b4cf..29d7e2e58 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -52,7 +52,6 @@ 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); From 6e7d83d7eae60d155761bf9c7ab44c1f34e86b1a Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 22:32:39 -0400 Subject: [PATCH 190/384] Update ChainShape API --HG-- branch : box2d-update --- src/modules/physics/box2d/ChainShape.cpp | 12 +++++++++--- src/modules/physics/box2d/ChainShape.h | 5 +++++ src/modules/physics/box2d/wrap_ChainShape.cpp | 8 ++++++++ src/modules/physics/box2d/wrap_ChainShape.h | 1 + 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/modules/physics/box2d/ChainShape.cpp b/src/modules/physics/box2d/ChainShape.cpp index 1e74d5177..693719a67 100644 --- a/src/modules/physics/box2d/ChainShape.cpp +++ b/src/modules/physics/box2d/ChainShape.cpp @@ -71,23 +71,29 @@ namespace box2d return new EdgeShape(&e); } + int ChainShape::getChildCount() const + { + b2ChainShape * c = (b2ChainShape *)shape; + return c->GetChildCount(); + } + int ChainShape::getVertexCount() const { b2ChainShape * c = (b2ChainShape *)shape; - return c->GetVertexCount(); + return c->m_count; } b2Vec2 ChainShape::getVertex(int index) const { b2ChainShape * c = (b2ChainShape *)shape; - const b2Vec2 & v = c->GetVertex(index); + const b2Vec2 & v = c->m_vertices[index]; return Physics::scaleUp(v); } const b2Vec2 * ChainShape::getVertices() const { b2ChainShape * c = (b2ChainShape *)shape; - return c->GetVertices(); + return c->m_vertices; } } // box2d diff --git a/src/modules/physics/box2d/ChainShape.h b/src/modules/physics/box2d/ChainShape.h index c96f4e228..ccabc2e08 100644 --- a/src/modules/physics/box2d/ChainShape.h +++ b/src/modules/physics/box2d/ChainShape.h @@ -66,6 +66,11 @@ namespace box2d **/ void setPrevVertex(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. diff --git a/src/modules/physics/box2d/wrap_ChainShape.cpp b/src/modules/physics/box2d/wrap_ChainShape.cpp index 8db43e3cc..ef5195cfe 100644 --- a/src/modules/physics/box2d/wrap_ChainShape.cpp +++ b/src/modules/physics/box2d/wrap_ChainShape.cpp @@ -50,6 +50,13 @@ namespace box2d 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); @@ -96,6 +103,7 @@ namespace box2d static const luaL_Reg functions[] = { { "setNextVertex", w_ChainShape_setNextVertex }, { "setPrevVertex", w_ChainShape_setPrevVertex }, + { "getChildCount", w_ChainShape_getChildCount }, { "getChildEdge", w_ChainShape_getChildEdge }, { "getVertexCount", w_ChainShape_getVertexCount }, { "getVertex", w_ChainShape_getVertex }, diff --git a/src/modules/physics/box2d/wrap_ChainShape.h b/src/modules/physics/box2d/wrap_ChainShape.h index 88989d063..ae81e4ba8 100644 --- a/src/modules/physics/box2d/wrap_ChainShape.h +++ b/src/modules/physics/box2d/wrap_ChainShape.h @@ -36,6 +36,7 @@ namespace box2d int w_ChainShape_setNextVertex(lua_State * L); int w_ChainShape_setPrevVertex(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_getVertex(lua_State * L); From de170c02c835072f98cc7347f64f74b143280c56 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 22:32:49 -0400 Subject: [PATCH 191/384] Update Joint APIs --HG-- branch : box2d-update --- src/modules/physics/box2d/PulleyJoint.cpp | 16 ++++++++-------- src/modules/physics/box2d/PulleyJoint.h | 12 ++++++------ src/modules/physics/box2d/RevoluteJoint.cpp | 4 ++-- src/modules/physics/box2d/RevoluteJoint.h | 3 ++- src/modules/physics/box2d/wrap_Joint.cpp | 3 ++- .../physics/box2d/wrap_PrismaticJoint.cpp | 3 ++- src/modules/physics/box2d/wrap_PulleyJoint.cpp | 12 ++++++------ src/modules/physics/box2d/wrap_PulleyJoint.h | 4 ++-- src/modules/physics/box2d/wrap_RevoluteJoint.cpp | 3 ++- 9 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/modules/physics/box2d/PulleyJoint.cpp b/src/modules/physics/box2d/PulleyJoint.cpp index 84e449eaf..a4ce4d08b 100644 --- a/src/modules/physics/box2d/PulleyJoint.cpp +++ b/src/modules/physics/box2d/PulleyJoint.cpp @@ -31,12 +31,12 @@ namespace physics { namespace box2d { - PulleyJoint::PulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected) - : Joint(body1, body2), joint(NULL) + 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(body1->body, body2->body, Physics::scaleDown(groundAnchor1), Physics::scaleDown(groundAnchor2), \ - Physics::scaleDown(anchor1), Physics::scaleDown(anchor2), ratio); + 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); @@ -57,14 +57,14 @@ namespace box2d return 4; } - float PulleyJoint::getLength1() const + float PulleyJoint::getLengthA() const { - return Physics::scaleUp(joint->GetLength1()); + return Physics::scaleUp(joint->GetLengthA()); } - float PulleyJoint::getLength2() const + float PulleyJoint::getLengthB() const { - return Physics::scaleUp(joint->GetLength2()); + return Physics::scaleUp(joint->GetLengthB()); } float PulleyJoint::getRatio() const diff --git a/src/modules/physics/box2d/PulleyJoint.h b/src/modules/physics/box2d/PulleyJoint.h index ba1eb201f..fcf5e7349 100644 --- a/src/modules/physics/box2d/PulleyJoint.h +++ b/src/modules/physics/box2d/PulleyJoint.h @@ -44,9 +44,9 @@ namespace box2d public: /** - * Creates a PulleyJoint connecting body1 to body2. + * Creates a PulleyJoint connecting bodyA to bodyB. **/ - PulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected); + PulleyJoint(Body * bodyA, Body * bodyB, b2Vec2 groundAnchorA, b2Vec2 groundAnchorB, b2Vec2 anchorA, b2Vec2 anchorB, float ratio, bool collideConnected); virtual ~PulleyJoint(); @@ -57,14 +57,14 @@ namespace box2d int getGroundAnchors(lua_State * L); /** - * Gets the current length of the segment attached to body1. + * Gets the current length of the segment attached to bodyA. **/ - float getLength1() const; + float getLengthA() const; /** - * Gets the current length of the segment attached to body2. + * Gets the current length of the segment attached to bodyB. **/ - float getLength2() const; + float getLengthB() const; /** * Gets the pulley ratio. diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index 1a6251c8d..a80ffe303 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -83,9 +83,9 @@ namespace box2d return joint->GetMotorSpeed(); } - float RevoluteJoint::getMotorTorque() const + float RevoluteJoint::getMotorTorque(float inv_dt) const { - return joint->GetMotorTorque(); + return joint->GetMotorTorque(inv_dt); } void RevoluteJoint::enableLimit(bool limit) diff --git a/src/modules/physics/box2d/RevoluteJoint.h b/src/modules/physics/box2d/RevoluteJoint.h index 4f5a57064..c5b255e23 100644 --- a/src/modules/physics/box2d/RevoluteJoint.h +++ b/src/modules/physics/box2d/RevoluteJoint.h @@ -87,8 +87,9 @@ namespace box2d /** * Get the current motor torque, usually in N-m. + * @param inv_dt The inverse timestep. **/ - float getMotorTorque() const; + float getMotorTorque(float inv_dt) const; /** * Enable/disable the joint limit. diff --git a/src/modules/physics/box2d/wrap_Joint.cpp b/src/modules/physics/box2d/wrap_Joint.cpp index f71885202..3054e58d2 100644 --- a/src/modules/physics/box2d/wrap_Joint.cpp +++ b/src/modules/physics/box2d/wrap_Joint.cpp @@ -59,7 +59,8 @@ namespace box2d int w_Joint_getReactionTorque(lua_State * L) { Joint * t = luax_checkjoint(L, 1); - lua_pushnumber(L, t->getReactionTorque()); + float inv_dt = (float)luaL_checknumber(L, 2); + lua_pushnumber(L, t->getReactionTorque(inv_dt)); return 1; } diff --git a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp index bffd37a56..a09344a06 100644 --- a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp +++ b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp @@ -86,7 +86,8 @@ namespace box2d int w_PrismaticJoint_getMotorForce(lua_State * L) { PrismaticJoint * t = luax_checkprismaticjoint(L, 1); - lua_pushnumber(L, t->getMotorForce()); + float inv_dt = (float)luaL_checknumber(L, 2); + lua_pushnumber(L, t->getMotorForce(inv_dt)); return 1; } diff --git a/src/modules/physics/box2d/wrap_PulleyJoint.cpp b/src/modules/physics/box2d/wrap_PulleyJoint.cpp index d6a4984fb..111d74822 100644 --- a/src/modules/physics/box2d/wrap_PulleyJoint.cpp +++ b/src/modules/physics/box2d/wrap_PulleyJoint.cpp @@ -38,17 +38,17 @@ namespace box2d return t->getGroundAnchors(L); } - int w_PulleyJoint_getLength1(lua_State * L) + int w_PulleyJoint_getLengthA(lua_State * L) { PulleyJoint * t = luax_checkpulleyjoint(L, 1); - lua_pushnumber(L, t->getLength1()); + lua_pushnumber(L, t->getLengthA()); return 1; } - int w_PulleyJoint_getLength2(lua_State * L) + int w_PulleyJoint_getLengthB(lua_State * L) { PulleyJoint * t = luax_checkpulleyjoint(L, 1); - lua_pushnumber(L, t->getLength2()); + lua_pushnumber(L, t->getLengthB()); return 1; } @@ -61,8 +61,8 @@ namespace box2d static const luaL_Reg functions[] = { { "getGroundAnchors", w_PulleyJoint_getGroundAnchors }, - { "getLength1", w_PulleyJoint_getLength1 }, - { "getLength2", w_PulleyJoint_getLength2 }, + { "getLengthA", w_PulleyJoint_getLengthA }, + { "getLengthB", w_PulleyJoint_getLengthB }, { "getRatio", w_PulleyJoint_getRatio }, // From Joint. { "getType", w_Joint_getType }, diff --git a/src/modules/physics/box2d/wrap_PulleyJoint.h b/src/modules/physics/box2d/wrap_PulleyJoint.h index 6001a5f85..0f68ba7f1 100644 --- a/src/modules/physics/box2d/wrap_PulleyJoint.h +++ b/src/modules/physics/box2d/wrap_PulleyJoint.h @@ -34,8 +34,8 @@ namespace box2d { PulleyJoint * luax_checkpulleyjoint(lua_State * L, int idx); int w_PulleyJoint_getGroundAnchors(lua_State * L); - int w_PulleyJoint_getLength1(lua_State * L); - int w_PulleyJoint_getLength2(lua_State * L); + int w_PulleyJoint_getLengthA(lua_State * L); + int w_PulleyJoint_getLengthB(lua_State * L); int w_PulleyJoint_getRatio(lua_State * L); int luaopen_pulleyjoint(lua_State * L); diff --git a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp index d770e03a4..d6517e687 100644 --- a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp +++ b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp @@ -86,7 +86,8 @@ namespace box2d int w_RevoluteJoint_getMotorTorque(lua_State * L) { RevoluteJoint * t = luax_checkrevolutejoint(L, 1); - lua_pushnumber(L, t->getMotorTorque()); + float inv_dt = (float)luaL_checknumber(L, 2); + lua_pushnumber(L, t->getMotorTorque(inv_dt)); return 1; } From de90c5e0d51467f5ec4e0fdf4ae2d0c24cdb2dee Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 22:54:29 -0400 Subject: [PATCH 192/384] Fix Physics linker error --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index cdf9fc07e..51b3c0443 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -33,6 +33,8 @@ namespace physics { namespace box2d { + + int Physics::meter = Physics::DEFAULT_METER; const char * Physics::getName() const { @@ -219,8 +221,6 @@ namespace box2d return new RopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); } - - void Physics::setMeter(int meter) { Physics::meter = meter; From 0ee4bbc0bd270bb556cc53bdf5246bdb22f05bc2 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 23:05:08 -0400 Subject: [PATCH 193/384] Make Xcode less stupid and use the right files for b2RopeJoint and b2WheelJoint. This is the first time this branch has successfully compiled since it started. Holy shit. --HG-- branch : box2d-update --- platform/macosx/love.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 7e081e935..7c15c274f 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -551,10 +551,10 @@ A968F0D81083A9FC00A895AA /* Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; A968F0DB1083AA6600A895AA /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = ""; }; A968F0DC1083AA6600A895AA /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; - A96F415C14127E310067FE9A /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2RopeJoint.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2RopeJoint.cpp; sourceTree = ""; }; - A96F415D14127E320067FE9A /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2RopeJoint.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2RopeJoint.h; sourceTree = ""; }; - A96F415E14127E320067FE9A /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2WheelJoint.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2WheelJoint.cpp; sourceTree = ""; }; - A96F415F14127E320067FE9A /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2WheelJoint.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Joints/b2WheelJoint.h; sourceTree = ""; }; + A96F415C14127E310067FE9A /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = ""; }; + A96F415D14127E320067FE9A /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = ""; }; + A96F415E14127E320067FE9A /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = ""; }; + A96F415F14127E320067FE9A /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = ""; }; A96F416314127E720067FE9A /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = ""; }; A96F416414127E720067FE9A /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = ""; }; A96F416614127E9C0067FE9A /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2Draw.cpp; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Draw.cpp; sourceTree = ""; }; From dc5cfc928c66d49108510e6dad4ec500eb94a3a2 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 23 Sep 2011 23:40:04 -0400 Subject: [PATCH 194/384] Make Xcode even more less stupid. --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 7c15c274f..58ee87fcf 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -557,24 +557,24 @@ A96F415F14127E320067FE9A /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = ""; }; A96F416314127E720067FE9A /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = ""; }; A96F416414127E720067FE9A /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = ""; }; - A96F416614127E9C0067FE9A /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2Draw.cpp; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Draw.cpp; sourceTree = ""; }; - A96F416714127E9C0067FE9A /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2Draw.h; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Draw.h; sourceTree = ""; }; - A96F416814127E9C0067FE9A /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2GrowableStack.h; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2GrowableStack.h; sourceTree = ""; }; - A96F416914127E9C0067FE9A /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2Timer.cpp; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Timer.cpp; sourceTree = ""; }; - A96F416A14127E9C0067FE9A /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2Timer.h; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Common/b2Timer.h; sourceTree = ""; }; - A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2CollideEdge.cpp; path = ../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/b2CollideEdge.cpp; sourceTree = ""; }; - A96F416F14127EC00067FE9A /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2ChainShape.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2ChainShape.cpp; sourceTree = ""; }; - A96F417014127EC00067FE9A /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2ChainShape.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2ChainShape.h; sourceTree = ""; }; - A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2ChainAndCircleContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp; sourceTree = ""; }; - A96F417314127EE70067FE9A /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2ChainAndCircleContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h; sourceTree = ""; }; - A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2ChainAndPolygonContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp; sourceTree = ""; }; - A96F417514127EE70067FE9A /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2ChainAndPolygonContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h; sourceTree = ""; }; - A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2EdgeAndCircleContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp; sourceTree = ""; }; - A96F417914127EFD0067FE9A /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2EdgeAndCircleContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h; sourceTree = ""; }; - A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2EdgeAndPolygonContact.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; - A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2EdgeAndPolygonContact.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h; sourceTree = ""; }; - A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = b2EdgeShape.cpp; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2EdgeShape.cpp; sourceTree = ""; }; - A96F417F14127FC20067FE9A /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b2EdgeShape.h; path = ../../../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Collision/Shapes/b2EdgeShape.h; sourceTree = ""; }; + A96F416614127E9C0067FE9A /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = ""; }; + A96F416714127E9C0067FE9A /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = ""; }; + A96F416814127E9C0067FE9A /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = ""; }; + A96F416914127E9C0067FE9A /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = ""; }; + A96F416A14127E9C0067FE9A /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = ""; }; + A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = ""; }; + A96F416F14127EC00067FE9A /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainShape.cpp; sourceTree = ""; }; + A96F417014127EC00067FE9A /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainShape.h; sourceTree = ""; }; + A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndCircleContact.cpp; sourceTree = ""; }; + A96F417314127EE70067FE9A /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndCircleContact.h; sourceTree = ""; }; + A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndPolygonContact.cpp; sourceTree = ""; }; + A96F417514127EE70067FE9A /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndPolygonContact.h; sourceTree = ""; }; + A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = ""; }; + A96F417914127EFD0067FE9A /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = ""; }; + A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; + A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; path = b2EdgeAndPolygonContact.h; sourceTree = ""; }; + A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = ""; }; + A96F417F14127FC20067FE9A /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; path = b2EdgeShape.h; sourceTree = ""; }; A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = ""; }; A96F41821412AFC60067FE9A /* wrap_WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = ""; }; A96F41841412AFEB0067FE9A /* WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = ""; }; @@ -1406,8 +1406,7 @@ A96F416314127E720067FE9A /* b2Rope.cpp */, A96F416414127E720067FE9A /* b2Rope.h */, ); - name = Rope; - path = ../../../../../../Downloads/Box2D_v2.2.0/Box2D/Box2D/Rope; + path = Rope; sourceTree = ""; }; A986DEAF113249A700810279 /* thread */ = { From a446ddacc4ba7309b2d78814c0978e9fec3daf50 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 00:41:42 -0400 Subject: [PATCH 195/384] Fix Shape memory management --HG-- branch : box2d-update --- src/modules/physics/box2d/ChainShape.cpp | 2 ++ src/modules/physics/box2d/CircleShape.cpp | 1 + src/modules/physics/box2d/EdgeShape.cpp | 2 ++ src/modules/physics/box2d/Physics.cpp | 36 +++++++++++----------- src/modules/physics/box2d/PolygonShape.cpp | 2 ++ 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/modules/physics/box2d/ChainShape.cpp b/src/modules/physics/box2d/ChainShape.cpp index 693719a67..2a0af58b5 100644 --- a/src/modules/physics/box2d/ChainShape.cpp +++ b/src/modules/physics/box2d/ChainShape.cpp @@ -39,6 +39,8 @@ namespace box2d ChainShape::~ChainShape() { + delete shape; + shape = NULL; } void ChainShape::setNextVertex(float x, float y) diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index d8b619799..614f04621 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -37,6 +37,7 @@ namespace box2d CircleShape::~CircleShape() { + delete shape; shape = NULL; } diff --git a/src/modules/physics/box2d/EdgeShape.cpp b/src/modules/physics/box2d/EdgeShape.cpp index 196ea9940..3d0c6a8d5 100644 --- a/src/modules/physics/box2d/EdgeShape.cpp +++ b/src/modules/physics/box2d/EdgeShape.cpp @@ -37,6 +37,8 @@ namespace box2d EdgeShape::~EdgeShape() { + delete shape; + shape = NULL; } } // box2d diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 51b3c0443..cd3c8ba94 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -64,10 +64,10 @@ namespace box2d CircleShape * Physics::newCircleShape(float x, float y, float radius) { - b2CircleShape s; - s.m_p = b2Vec2(x, y); - s.m_radius = radius; - return new CircleShape(&s); + b2CircleShape *s = new b2CircleShape(); + s->m_p = b2Vec2(x, y); + s->m_radius = radius; + return new CircleShape(s); } PolygonShape * Physics::newRectangleShape(float w, float h) @@ -82,16 +82,16 @@ namespace box2d PolygonShape * Physics::newRectangleShape(float x, float y, float w, float h, float angle) { - b2PolygonShape s; - s.SetAsBox(w/2.0f, h/2.0f, b2Vec2(x, y), angle); - return new PolygonShape(&s); + b2PolygonShape* s = new b2PolygonShape(); + s->SetAsBox(w/2.0f, h/2.0f, b2Vec2(x, y), angle); + return new PolygonShape(s); } EdgeShape * Physics::newEdgeShape(float x1, float y1, float x2, float y2) { - b2EdgeShape s; - s.Set(b2Vec2(x1, y1), b2Vec2(x2, y2)); - return new EdgeShape(&s); + b2EdgeShape* s = new b2EdgeShape(); + s->Set(b2Vec2(x1, y1), b2Vec2(x2, y2)); + return new EdgeShape(s); } int Physics::newPolygonShape(lua_State * L) @@ -101,9 +101,9 @@ namespace box2d // 3 vertices love::luax_assert_argc(L, 2 * 3); - b2PolygonShape s; + b2PolygonShape* s = new b2PolygonShape(); - std::vector points(s.m_vertexCount); + std::vector points(s->m_vertexCount); std::vector convex_hull; for(int i = 0;iSet(vecs, count); - PolygonShape * p = new PolygonShape(&s); + PolygonShape * p = new PolygonShape(s); delete[] vecs; luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)p); @@ -144,7 +144,7 @@ namespace box2d int argc = lua_gettop(L)-1; // first argument is looping int vcount = (int)argc/2; - b2ChainShape s; + b2ChainShape* s = new b2ChainShape(); bool loop = luax_toboolean(L, 1); @@ -159,11 +159,11 @@ namespace box2d } if (loop) - s.CreateLoop(vecs, vcount); + s->CreateLoop(vecs, vcount); else - s.CreateChain(vecs, vcount); + s->CreateChain(vecs, vcount); - ChainShape * c = new ChainShape(&s); + ChainShape * c = new ChainShape(s); delete[] vecs; luax_newtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, (void*)c); diff --git a/src/modules/physics/box2d/PolygonShape.cpp b/src/modules/physics/box2d/PolygonShape.cpp index ec3ba787e..84feefbe1 100644 --- a/src/modules/physics/box2d/PolygonShape.cpp +++ b/src/modules/physics/box2d/PolygonShape.cpp @@ -37,6 +37,8 @@ namespace box2d PolygonShape::~PolygonShape() { + delete shape; + shape = NULL; } int PolygonShape::getPoints(lua_State * L) From 2c761fc7017f730b45f755a3c21800afb7b21047 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 00:47:54 -0400 Subject: [PATCH 196/384] Actually load Fixture Lua functions --HG-- branch : box2d-update --- src/modules/physics/box2d/wrap_Physics.cpp | 1 + src/modules/physics/box2d/wrap_Physics.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 343907016..976db1980 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -300,6 +300,7 @@ namespace box2d luaopen_world, luaopen_contact, luaopen_body, + luaopen_fixture, luaopen_shape, luaopen_circleshape, luaopen_polygonshape, diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 29d7e2e58..47fde7933 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -27,6 +27,7 @@ #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" From 542ae2f7367dc1ab73ba1ecb967b7bb0a978fa74 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 01:16:34 -0400 Subject: [PATCH 197/384] Actually create groundBody when creating a World with gravity (i.e. all the time) --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 206206696..956c13a7a 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -133,6 +133,8 @@ namespace box2d world = new b2World(Physics::scaleDown(gravity)); world->SetAllowSleeping(sleep); world->SetContactListener(this); + b2BodyDef def; + groundBody = world->CreateBody(&def); } World::~World() From 5f4b4c8838c83ddaeaec42d455228800a71924b7 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 01:55:15 -0400 Subject: [PATCH 198/384] Forgot scaling when creating shapes and in PolygonShape::getPoints() --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.cpp | 8 +++++--- src/modules/physics/box2d/PolygonShape.cpp | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index cd3c8ba94..8f3d8aac5 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -65,7 +65,7 @@ namespace box2d CircleShape * Physics::newCircleShape(float x, float y, float radius) { b2CircleShape *s = new b2CircleShape(); - s->m_p = b2Vec2(x, y); + s->m_p = Physics::scaleDown(b2Vec2(x, y)); s->m_radius = radius; return new CircleShape(s); } @@ -83,14 +83,14 @@ namespace box2d PolygonShape * Physics::newRectangleShape(float x, float y, float w, float h, float angle) { b2PolygonShape* s = new b2PolygonShape(); - s->SetAsBox(w/2.0f, h/2.0f, b2Vec2(x, y), angle); + 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(b2Vec2(x1, y1), b2Vec2(x2, y2)); + s->Set(Physics::scaleDown(b2Vec2(x1, y1)), Physics::scaleDown(b2Vec2(x2, y2))); return new EdgeShape(s); } @@ -127,6 +127,7 @@ namespace box2d for (int i = 0; i < count; i++) { vecs[i].Set(convex_hull[i].x, convex_hull[i].y); + vecs[i] = Physics::scaleDown(vecs[i]); } s->Set(vecs, count); @@ -155,6 +156,7 @@ namespace box2d float x = (float)lua_tonumber(L, -2); float y = (float)lua_tonumber(L, -1); vecs[i].Set(x, y); + vecs[i] = Physics::scaleDown(vecs[i]); lua_pop(L, 2); } diff --git a/src/modules/physics/box2d/PolygonShape.cpp b/src/modules/physics/box2d/PolygonShape.cpp index 84feefbe1..e9d04d701 100644 --- a/src/modules/physics/box2d/PolygonShape.cpp +++ b/src/modules/physics/box2d/PolygonShape.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" namespace love { @@ -48,7 +49,7 @@ namespace box2d int count = p->GetVertexCount(); for(int i = 0;iGetVertex(i); + b2Vec2 v = Physics::scaleUp(p->GetVertex(i)); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); } From 8592b98525e67059f426acb31c7dac2170775f57 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 02:15:46 -0400 Subject: [PATCH 199/384] Add type to Body constructor (defaults to "static") --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 3 ++- src/modules/physics/box2d/Body.h | 2 +- src/modules/physics/box2d/Physics.cpp | 8 ++++---- src/modules/physics/box2d/Physics.h | 6 ++++-- src/modules/physics/box2d/wrap_Physics.cpp | 5 ++++- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 4ab323538..bae447523 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -33,13 +33,14 @@ namespace physics { namespace box2d { - Body::Body(World * world, b2Vec2 p) + 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); + this->setType(type); } Body::~Body() diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index ddc5023cf..3898956c1 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -75,7 +75,7 @@ namespace box2d /** * Create a Body at position p. **/ - Body(World * world, b2Vec2 p); + Body(World * world, b2Vec2 p, Type type); virtual ~Body(); diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 8f3d8aac5..3c4d83e00 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -47,14 +47,14 @@ namespace box2d return new World(b2Vec2(gx, gy), sleep); } - Body * Physics::newBody(World * world, float x, float y) + Body * Physics::newBody(World * world, float x, float y, Body::Type type) { - return new Body(world, b2Vec2(x, y)); + return new Body(world, b2Vec2(x, y), type); } - Body * Physics::newBody(World * world) + Body * Physics::newBody(World * world, Body::Type type) { - return new Body(world, b2Vec2(0, 0)); + return new Body(world, b2Vec2(0, 0), type); } CircleShape * Physics::newCircleShape(float radius) diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index a51677ae0..9fa58876b 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -81,14 +81,16 @@ namespace box2d * @param world The world to create the Body in. * @param x The position along the x-axis. * @param x The position along the y-axis. + * @param type The type of body to create. **/ - Body * newBody(World * world, float x, float y); + 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 * newBody(World * world, Body::Type type); /** * Creates a new CircleShape at (0, 0). diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 976db1980..e5557b0d8 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -47,7 +47,10 @@ namespace box2d 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 * body = instance->newBody(world, x, y); + const char * type = luaL_optstring(L, 4, "static"); + Body::Type bodyType; + Body::getConstant(type, bodyType); + Body * body = instance->newBody(world, x, y, bodyType); luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); return 1; } From 0d4569d28b915311c7b931cbae0371729ac47a26 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 02:34:27 -0400 Subject: [PATCH 200/384] Add mandatory density argument to Body:createFixture --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 4 ++-- src/modules/physics/box2d/Body.h | 2 +- src/modules/physics/box2d/Fixture.cpp | 3 ++- src/modules/physics/box2d/Fixture.h | 2 +- src/modules/physics/box2d/wrap_Body.cpp | 3 ++- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index bae447523..c689099d8 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -365,9 +365,9 @@ namespace box2d return world; } - Fixture * Body::createFixture(Shape * shape) + Fixture * Body::createFixture(Shape * shape, float density) { - return new Fixture(this, shape); + return new Fixture(this, shape, density); } void Body::destroyFixture(Fixture * fixture) diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 3898956c1..581d42d36 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -368,7 +368,7 @@ namespace box2d */ World * getWorld() const; - Fixture * createFixture(Shape * shape); + Fixture * createFixture(Shape * shape, float density); void destroyFixture(Fixture * fixture); private: diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index 47d2461a3..38b927559 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -34,7 +34,7 @@ namespace physics { namespace box2d { - Fixture::Fixture(Body * body, Shape * shape) + Fixture::Fixture(Body * body, Shape * shape, float density) : body(body), shape(shape), fixture(NULL) { body->retain(); @@ -44,6 +44,7 @@ namespace box2d b2FixtureDef def; def.shape = shape->shape; def.userData = (void *)data; + def.density = density; fixture = body->body->CreateFixture(&def); } diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index 17dc831f3..23c312676 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -69,7 +69,7 @@ namespace box2d /** * Creates a Fixture. **/ - Fixture(Body * body, Shape * shape); + Fixture(Body * body, Shape * shape, float density); virtual ~Fixture(); diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index 40fa1b463..71e0fb3cc 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -497,7 +497,8 @@ namespace box2d { Body * t = luax_checkbody(L, 1); Shape * s = luax_checktype(L, 2, "Shape", PHYSICS_SHAPE_T); - Fixture * f = t->createFixture(s); + float d = (float)luaL_checknumber(L, 3); + Fixture * f = t->createFixture(s, d); luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); return 1; } From 08f894a98e286fc2b237e758a7097124854dffdc Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 03:10:19 -0400 Subject: [PATCH 201/384] Box2D implemented its own convex hull algorithm, Graham just messes things up --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 18 +-- src/modules/physics/box2d/Physics.cpp | 28 +--- .../box2d/graham/GrahamScanConvexHull.cpp | 123 ---------------- .../box2d/graham/GrahamScanConvexHull.h | 137 ------------------ 4 files changed, 6 insertions(+), 300 deletions(-) delete mode 100644 src/modules/physics/box2d/graham/GrahamScanConvexHull.cpp delete mode 100644 src/modules/physics/box2d/graham/GrahamScanConvexHull.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 58ee87fcf..0c982c59d 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -115,7 +115,6 @@ A946D7F910424E57002BF36C /* wrap_World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6A10420ACA007D418B /* wrap_World.cpp */; }; A946D7FA10424E57002BF36C /* wrap_RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6610420ACA007D418B /* wrap_RevoluteJoint.cpp */; }; A946D7FB10424E57002BF36C /* wrap_PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6210420ACA007D418B /* wrap_PrismaticJoint.cpp */; }; - A946D7FC10424E57002BF36C /* GrahamScanConvexHull.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AF610420AC7007D418B /* GrahamScanConvexHull.cpp */; }; A946D7FE10424E57002BF36C /* wrap_MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5C10420ACA007D418B /* wrap_MouseJoint.cpp */; }; A946D7FF10424E57002BF36C /* wrap_Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5E10420ACA007D418B /* wrap_Physics.cpp */; }; A946D80210424E57002BF36C /* PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B0210420AC8007D418B /* PrismaticJoint.cpp */; }; @@ -442,8 +441,6 @@ A93E6AF210420AC7007D418B /* DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DistanceJoint.h; sourceTree = ""; }; A93E6AF310420AC7007D418B /* GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GearJoint.cpp; sourceTree = ""; }; A93E6AF410420AC7007D418B /* GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GearJoint.h; sourceTree = ""; }; - A93E6AF610420AC7007D418B /* GrahamScanConvexHull.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GrahamScanConvexHull.cpp; sourceTree = ""; }; - A93E6AF710420AC8007D418B /* GrahamScanConvexHull.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrahamScanConvexHull.h; sourceTree = ""; }; A93E6AFA10420AC8007D418B /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; A93E6AFB10420AC8007D418B /* Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joint.h; sourceTree = ""; }; A93E6AFC10420AC8007D418B /* MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseJoint.cpp; sourceTree = ""; }; @@ -572,9 +569,9 @@ A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = ""; }; A96F417914127EFD0067FE9A /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = ""; }; A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; - A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; path = b2EdgeAndPolygonContact.h; sourceTree = ""; }; + A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = ""; }; A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = ""; }; - A96F417F14127FC20067FE9A /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; path = b2EdgeShape.h; sourceTree = ""; }; + A96F417F14127FC20067FE9A /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = ""; }; A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = ""; }; A96F41821412AFC60067FE9A /* wrap_WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = ""; }; A96F41841412AFEB0067FE9A /* WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = ""; }; @@ -1231,7 +1228,6 @@ A9B6432B13BF837800DC3C7E /* FrictionJoint.h */, A93E6AF310420AC7007D418B /* GearJoint.cpp */, A93E6AF410420AC7007D418B /* GearJoint.h */, - A93E6AF510420AC7007D418B /* graham */, A93E6AFA10420AC8007D418B /* Joint.cpp */, A93E6AFB10420AC8007D418B /* Joint.h */, A93E6AFC10420AC8007D418B /* MouseJoint.cpp */, @@ -1302,15 +1298,6 @@ path = box2d; sourceTree = ""; }; - A93E6AF510420AC7007D418B /* graham */ = { - isa = PBXGroup; - children = ( - A93E6AF610420AC7007D418B /* GrahamScanConvexHull.cpp */, - A93E6AF710420AC8007D418B /* GrahamScanConvexHull.h */, - ); - path = graham; - sourceTree = ""; - }; A93E6B7410420ACB007D418B /* sound */ = { isa = PBXGroup; children = ( @@ -1730,7 +1717,6 @@ A946D7F910424E57002BF36C /* wrap_World.cpp in Sources */, A946D7FA10424E57002BF36C /* wrap_RevoluteJoint.cpp in Sources */, A946D7FB10424E57002BF36C /* wrap_PrismaticJoint.cpp in Sources */, - A946D7FC10424E57002BF36C /* GrahamScanConvexHull.cpp in Sources */, A946D7FE10424E57002BF36C /* wrap_MouseJoint.cpp in Sources */, A946D7FF10424E57002BF36C /* wrap_Physics.cpp in Sources */, A946D80210424E57002BF36C /* PrismaticJoint.cpp in Sources */, diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 3c4d83e00..e6dcabae0 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -20,9 +20,6 @@ #include "Physics.h" -// Convex Hull Scan -#include "graham/GrahamScanConvexHull.h" - // LOVE #include #include "wrap_Body.h" @@ -102,35 +99,18 @@ namespace box2d love::luax_assert_argc(L, 2 * 3); b2PolygonShape* s = new b2PolygonShape(); - - std::vector points(s->m_vertexCount); - std::vector convex_hull; + + b2Vec2 * vecs = new b2Vec2[vcount]; for(int i = 0;iSet(vecs, count); + s->Set(vecs, vcount); PolygonShape * p = new PolygonShape(s); delete[] vecs; diff --git a/src/modules/physics/box2d/graham/GrahamScanConvexHull.cpp b/src/modules/physics/box2d/graham/GrahamScanConvexHull.cpp deleted file mode 100644 index e22b21d1a..000000000 --- a/src/modules/physics/box2d/graham/GrahamScanConvexHull.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include "GrahamScanConvexHull.h" - -#include -#include - -bool GrahamScanConvexHull::operator()(const std::vector < point2d >& pnt, std::vector< point2d >& final_hull) -{ - final_hull.clear(); - - if (pnt.size() <= 3) - { - std::copy(pnt.begin(), pnt.end(), std::back_inserter(final_hull)); - return true; - } - - unsigned int j = 0; - gs_point2d tmp_pnt; - - for(unsigned int i = 0; i < pnt.size(); i++) - { - point.push_back(gs_point2d(pnt[i].x,pnt[i].y,0.0)); - - if (point[i].y < point[j].y) - j = i; - else if (point[i].y == point[j].y) - if (point[i].x < point[j].x) - j = i; - } - - tmp_pnt = point[0]; - point[0] = point[j]; - point[j] = tmp_pnt; - - anchor = point[0]; - - for (unsigned int i = 1; i < point.size(); i++) - { - point[i].angle = cartesian_angle(point[i].x - anchor.x, point[i].y - anchor.y); - } - - sort(++point.begin(),point.end(),GSPoint2DCompare(&anchor)); - - graham_scan(final_hull); - - return true; -} - - -void GrahamScanConvexHull::graham_scan(std::vector< point2d >& final_hull) -{ - const std::size_t HEAD = 0; - const std::size_t PRE_HEAD = 1; - - std::deque pnt_queue; - - pnt_queue.push_front(point[0]); - pnt_queue.push_front(point[1]); - - unsigned int i = 2; - - while(i < point.size()) - { - if (pnt_queue.size() > 1) - { - if (orientation(pnt_queue[PRE_HEAD],pnt_queue[HEAD],point[i]) == counter_clock_wise) - pnt_queue.push_front(point[i++]); - else - pnt_queue.pop_front(); - } - else - pnt_queue.push_front(point[i++]); - } - - for(std::deque::iterator it = pnt_queue.begin(); it != pnt_queue.end(); it++) - { - final_hull.push_back(point2d((*it).x, (*it).y)); - } -} - - -inline double GrahamScanConvexHull::cartesian_angle(double x, double y) -{ - if ((x > 0.0) && (y > 0.0)) return (atan( y / x) * _180DivPI); - else if ((x < 0.0) && (y > 0.0)) return (atan(-x / y) * _180DivPI) + 90.0; - else if ((x < 0.0) && (y < 0.0)) return (atan( y / x) * _180DivPI) + 180.0; - else if ((x > 0.0) && (y < 0.0)) return (atan(-x / y) * _180DivPI) + 270.0; - else if ((x == 0.0) && (y > 0.0)) return 90.0; - else if ((x < 0.0) && (y == 0.0)) return 180.0; - else if ((x == 0.0) && (y < 0.0)) return 270.0; - else - return 0.0; -} - - -inline int GrahamScanConvexHull::orientation(const gs_point2d& p1, const gs_point2d& p2, const gs_point2d& p3) -{ - return orientation(p1.x,p1.y,p2.x,p2.y,p3.x,p3.y); -} - - -inline int GrahamScanConvexHull::orientation(const double x1, const double y1, - const double x2, const double y2, - const double px, const double py) -{ - double orin = (x2 - x1) * (py - y1) - (px - x1) * (y2 - y1); - - if (is_equal(orin,0.0)) - return 0; /* Orientaion is neutral aka collinear */ - else if (orin < 0.0) - return -1; /* Orientaion is to the right-hand side */ - else - return +1; /* Orientaion is to the left-hand side */ - -} - - -inline bool GrahamScanConvexHull::is_equal(const double v1, const double& v2, const double epsilon) -{ - double diff = v1 - v2; - return (-epsilon <= diff) && (diff <= epsilon); -} - - diff --git a/src/modules/physics/box2d/graham/GrahamScanConvexHull.h b/src/modules/physics/box2d/graham/GrahamScanConvexHull.h deleted file mode 100644 index 76167e2e0..000000000 --- a/src/modules/physics/box2d/graham/GrahamScanConvexHull.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - ************************************************************************** - * Class: Graham Scan Convex Hull * - * By Arash Partow - 2001 * - * URL: http://www.partow.net * - * * - * Copyright Notice: * - * Free use of this library is permitted under the guidelines and * - * in accordance with the most current version of the Common Public * - * License. * - * http://www.opensource.org/licenses/cpl.php * - * * - ************************************************************************** -*/ - - -#ifndef INCLUDE_GRAHAMSCANCONVEXHULL_H -#define INCLUDE_GRAHAMSCANCONVEXHULL_H - -#include -#include -#include -#include -#include - -#include - - -struct point2d -{ - point2d(double _x = 0.0 , double _y = 0.0) : x(_x), y(_y){} - double x; - double y; -}; - -class ConvexHull -{ - public: - - virtual ~ConvexHull(){}; - virtual bool operator()(const std::vector& pnt, std::vector& final_hull) = 0; - -}; - - - - - -struct gs_point2d -{ -public: - gs_point2d(double _x = 0.0, double _y = 0.0, double _angle = 0.0) : x(_x), y(_y), angle(_angle){} - double x; - double y; - double angle; -}; - -const double _180DivPI = 57.295779513082320876798154814105000; -const int counter_clock_wise = +1; -const int clock_wise = -1; - - -class GSPoint2DCompare -{ -public: - - GSPoint2DCompare(gs_point2d* _anchor):anchor(_anchor){}; - - bool operator()(const gs_point2d& p1, const gs_point2d& p2) - { - if (p1.angle < p2.angle) return true; - else if (p1.angle > p2.angle) return false; - else if (is_equal(p1,p2)) return false; - else if (lay_distance(anchor->x, anchor->y, p1.x, p1.y) < lay_distance(anchor->x, anchor->y, p2.x, p2.y)) - return true; - else - return false; - } - -private: - - inline bool is_equal(const gs_point2d p1, gs_point2d p2) - { - return is_equal(p1.x,p2.x) && is_equal(p1.y,p2.y); - } - - inline bool is_equal(const double v1, const double& v2, const double epsilon = 1.0e-12) - { - double diff = v1 - v2; - return (-epsilon <= diff) && (diff <= epsilon); - } - - inline double lay_distance(const double& x1, const double& y1, const double& x2, const double& y2) - { - double dx = (x1 - x2); - double dy = (y1 - y2); - return (dx * dx + dy * dy); - } - - gs_point2d* anchor; - -}; - - -class GrahamScanConvexHull : public ConvexHull -{ -public: - - GrahamScanConvexHull(){}; - ~GrahamScanConvexHull(){}; - - virtual bool operator()(const std::vector < point2d >& pnt, std::vector< point2d >& final_hull); - -private: - - void graham_scan(std::vector< point2d >& final_hull); - - inline double cartesian_angle(double x, double y); - - inline int orientation(const gs_point2d& p1, - const gs_point2d& p2, - const gs_point2d& p3); - - inline int orientation(const double x1, const double y1, - const double x2, const double y2, - const double px, const double py); - - inline bool is_equal(const double v1, const double& v2, const double epsilon = 1.0e-12); - - std::vector point; - gs_point2d anchor; - -}; - - - -#endif From a0c0fd8387a0927a563ea373455f58798484782a Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 03:39:21 -0400 Subject: [PATCH 202/384] Add Body:getWorldPoints, basically for use with PolygonShape:getPoints to facilitate easier drawing --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 19 +++++++++++++++++++ src/modules/physics/box2d/Body.h | 6 ++++++ src/modules/physics/box2d/wrap_Body.cpp | 8 ++++++++ src/modules/physics/box2d/wrap_Body.h | 1 + 4 files changed, 34 insertions(+) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index c689099d8..110b95642 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -281,6 +281,25 @@ namespace box2d 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)))); + 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) { diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 581d42d36..416dc926a 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -282,6 +282,12 @@ namespace box2d * @returns 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 diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index 71e0fb3cc..bc7883394 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -360,6 +360,13 @@ namespace box2d 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) { @@ -557,6 +564,7 @@ namespace box2d { "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 }, diff --git a/src/modules/physics/box2d/wrap_Body.h b/src/modules/physics/box2d/wrap_Body.h index b4f58d2cd..bbee3e6b6 100644 --- a/src/modules/physics/box2d/wrap_Body.h +++ b/src/modules/physics/box2d/wrap_Body.h @@ -67,6 +67,7 @@ namespace box2d 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); From b36ff409aa7a77c0131d2d49416459b44ec01408 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 09:27:39 -0400 Subject: [PATCH 203/384] Make Fixture creation API more lovely --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 10 --- src/modules/physics/box2d/Body.h | 4 - src/modules/physics/box2d/Physics.cpp | 5 ++ src/modules/physics/box2d/Physics.h | 86 ++++++++++++---------- src/modules/physics/box2d/wrap_Body.cpp | 20 ----- src/modules/physics/box2d/wrap_Body.h | 2 - src/modules/physics/box2d/wrap_Physics.cpp | 11 +++ src/modules/physics/box2d/wrap_Physics.h | 1 + 8 files changed, 64 insertions(+), 75 deletions(-) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 110b95642..a471a1738 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -383,16 +383,6 @@ namespace box2d { return world; } - - Fixture * Body::createFixture(Shape * shape, float density) - { - return new Fixture(this, shape, density); - } - - void Body::destroyFixture(Fixture * fixture) - { - fixture->release(); - } b2Vec2 Body::getVector(lua_State * L) { diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 416dc926a..d14a00e2f 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -373,10 +373,6 @@ namespace box2d * Get the World this Body resides in. */ World * getWorld() const; - - Fixture * createFixture(Shape * shape, float density); - - void destroyFixture(Fixture * fixture); private: /** diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index e6dcabae0..9c76a7ff0 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -203,6 +203,11 @@ namespace box2d return new RopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); } + Fixture * Physics::newFixture(Body * body, Shape * shape, float density) + { + return new Fixture(body, shape, density); + } + void Physics::setMeter(int meter) { Physics::meter = meter; diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 9fa58876b..b26f61e42 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -250,74 +250,82 @@ namespace box2d RopeJoint * newRopeJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected); /** - * Sets the number of pixels in one meter. - * @param pixels The number of pixels in one meter. (1m ~= 3.3ft). - **/ + * 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); + + /** + * Sets the number of pixels in one meter. + * @param pixels The number of pixels in one meter. (1m ~= 3.3ft). + **/ static void setMeter(int meter); /** - * Gets the number of pixels in one meter. - * @param pixels The number of pixels in one meter. (1m ~= 3.3ft). - **/ + * Gets the number of pixels in one meter. + * @param pixels 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. - **/ + * 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. - **/ + * 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. - **/ + * 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. - **/ + * 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. - **/ + * 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. - **/ + * 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 v The unscaled input AABB. - * @return The scaled AABB. - **/ + * Scales a b2AABB down according to the current meter in pixels. + * @param v 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 v The unscaled input AABB. - * @return The scaled AABB. - **/ + * Scales a b2AABB up according to the current meter in pixels. + * @param v The unscaled input AABB. + * @return The scaled AABB. + **/ static b2AABB scaleUp(const b2AABB & aabb); - }; // Physics } // box2d diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index bc7883394..110dfacd3 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -499,24 +499,6 @@ namespace box2d luax_pushboolean(L, b); return 1; } - - int w_Body_createFixture(lua_State * L) - { - Body * t = luax_checkbody(L, 1); - Shape * s = luax_checktype(L, 2, "Shape", PHYSICS_SHAPE_T); - float d = (float)luaL_checknumber(L, 3); - Fixture * f = t->createFixture(s, d); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); - return 1; - } - - int w_Body_destroyFixture(lua_State * L) - { - Body * t = luax_checkbody(L, 1); - Fixture * f = luax_checktype(L, 2, "Fixture", PHYSICS_FIXTURE_T); - t->destroyFixture(f); - return 0; - } int w_Body_destroy(lua_State * L) { @@ -579,8 +561,6 @@ namespace box2d { "setAwake", w_Body_setAwake }, { "setFixedRotation", w_Body_setFixedRotation }, { "isFixedRotation", w_Body_isFixedRotation }, - { "createFixture", w_Body_createFixture }, - { "destroyFixture", w_Body_destroyFixture }, { "destroy", w_Body_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Body.h b/src/modules/physics/box2d/wrap_Body.h index bbee3e6b6..e7a8fe6e2 100644 --- a/src/modules/physics/box2d/wrap_Body.h +++ b/src/modules/physics/box2d/wrap_Body.h @@ -82,8 +82,6 @@ namespace box2d int w_Body_setAwake(lua_State * L); int w_Body_setFixedRotation(lua_State * L); int w_Body_isFixedRotation(lua_State * L); - int w_Body_createFixture(lua_State * L); - int w_Body_destroyFixture(lua_State * L); int w_Body_destroy(lua_State * L); int luaopen_body(lua_State * L); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index e5557b0d8..e84839187 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -54,6 +54,16 @@ namespace box2d luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)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_checknumber(L, 3); + Fixture * fixture = instance->newFixture(body, shape, density); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)fixture); + return 1; + } int w_newCircleShape(lua_State * L) { @@ -279,6 +289,7 @@ namespace box2d static const luaL_Reg functions[] = { { "newWorld", w_newWorld }, { "newBody", w_newBody }, + { "newFixture", w_newFixture }, { "newCircleShape", w_newCircleShape }, { "newRectangleShape", w_newRectangleShape }, { "newPolygonShape", w_newPolygonShape }, diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 47fde7933..8de805600 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -53,6 +53,7 @@ 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); From 2e1b941bd61b8b5f23ebfdf339348255087b667a Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 11:51:06 -0400 Subject: [PATCH 204/384] Add Memoizer class --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 6 +++ src/common/Memoizer.cpp | 43 +++++++++++++++++ src/common/Memoizer.h | 46 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 src/common/Memoizer.cpp create mode 100644 src/common/Memoizer.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 0c982c59d..543bcfdca 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -216,6 +216,7 @@ A9D1D20D14229B6500A8BC2F /* wrap_ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D1D20C14229B5800A8BC2F /* wrap_ChainShape.cpp */; }; A9D307EA106635C3004FEDF8 /* physfs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; + A9D5C47D142E32EE0044ECF7 /* Memoizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C47C142E32ED0044ECF7 /* Memoizer.cpp */; }; A9DEC1C11046EFA70049C70C /* Love.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1BF1046EFA60049C70C /* Love.icns */; }; A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1C01046EFA70049C70C /* LoveDocument.icns */; }; A9F16927109E7BAD00FC83D1 /* libmodplug.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F16926109E7BAD00FC83D1 /* libmodplug.framework */; }; @@ -685,6 +686,8 @@ A9D1D20C14229B5800A8BC2F /* wrap_ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ChainShape.cpp; sourceTree = ""; }; A9D1D20E14229B7300A8BC2F /* wrap_ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ChainShape.h; sourceTree = ""; }; A9D307E9106635C3004FEDF8 /* physfs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = physfs.framework; path = /Library/Frameworks/physfs.framework; sourceTree = ""; }; + A9D5C47B142E31350044ECF7 /* Memoizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Memoizer.h; sourceTree = ""; }; + A9D5C47C142E32ED0044ECF7 /* Memoizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Memoizer.cpp; sourceTree = ""; }; A9DEC1BF1046EFA60049C70C /* Love.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Love.icns; path = icons/Love.icns; sourceTree = ""; }; A9DEC1C01046EFA70049C70C /* LoveDocument.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = LoveDocument.icns; path = icons/LoveDocument.icns; sourceTree = ""; }; A9F16926109E7BAD00FC83D1 /* libmodplug.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libmodplug.framework; path = /Library/Frameworks/libmodplug.framework; sourceTree = ""; }; @@ -810,6 +813,8 @@ A93E69E210420ABF007D418B /* math.h */, A93E69E310420ABF007D418B /* Matrix.cpp */, A93E69E410420ABF007D418B /* Matrix.h */, + A9D5C47C142E32ED0044ECF7 /* Memoizer.cpp */, + A9D5C47B142E31350044ECF7 /* Memoizer.h */, A93E69E510420ABF007D418B /* MemoryData.cpp */, A93E69E610420ABF007D418B /* MemoryData.h */, A93E69E710420ABF007D418B /* Module.h */, @@ -1819,6 +1824,7 @@ A9D1D20D14229B6500A8BC2F /* wrap_ChainShape.cpp in Sources */, A958F911142D364C007F320F /* wrap_Fixture.cpp in Sources */, A958F917142D6B3A007F320F /* Body.cpp in Sources */, + A9D5C47D142E32EE0044ECF7 /* Memoizer.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/common/Memoizer.cpp b/src/common/Memoizer.cpp new file mode 100644 index 000000000..792c2c13f --- /dev/null +++ b/src/common/Memoizer.cpp @@ -0,0 +1,43 @@ +/** +* 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. +**/ +#include "Memoizer.h" + +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/src/common/Memoizer.h b/src/common/Memoizer.h new file mode 100644 index 000000000..36abe61de --- /dev/null +++ b/src/common/Memoizer.h @@ -0,0 +1,46 @@ +/** +* 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_MEMOIZER_H +#define LOVE_MEMOIZER_H + +#include + +namespace love +{ + class Memoizer + { + private: + + static std::map objectMap; + + public: + + static void add(void * key, void * val); + + static void remove(void * key); + + static void * find(void * key); + + }; // Memoizer + +} // love + +#endif // LOVE_MEMOIZER_H From d35dbaa28bc633eea9ec08b1467e29be75b32e9d Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 11:58:24 -0400 Subject: [PATCH 205/384] Add __eq metamethod to all objects (checks to see if the Proxy data they represent are equal) --HG-- branch : box2d-update --- src/common/runtime.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index 67614966a..cb2482922 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -74,6 +74,14 @@ namespace love 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) { @@ -197,6 +205,10 @@ namespace love // 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); From c70506359709cf90959b95dd2b9afe88dab34ad2 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 12:20:59 -0400 Subject: [PATCH 206/384] First attempt at implementing Memoization for certain Box2D objects --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 11 +++++++++++ src/modules/physics/box2d/Body.h | 5 +++++ src/modules/physics/box2d/ChainShape.cpp | 4 ++++ src/modules/physics/box2d/CircleShape.cpp | 4 ++++ src/modules/physics/box2d/EdgeShape.cpp | 4 ++++ src/modules/physics/box2d/Fixture.cpp | 16 ++++++++++++++++ src/modules/physics/box2d/Fixture.h | 5 +++++ src/modules/physics/box2d/PolygonShape.cpp | 4 ++++ src/modules/physics/box2d/Shape.cpp | 11 +++++++++++ src/modules/physics/box2d/Shape.h | 1 + src/modules/physics/box2d/World.cpp | 4 ++++ 11 files changed, 69 insertions(+) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index a471a1738..a5cba16ca 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -21,6 +21,7 @@ #include "Body.h" #include +#include #include "Shape.h" #include "Fixture.h" @@ -41,10 +42,20 @@ namespace box2d def.position = Physics::scaleDown(p); body = world->world->CreateBody(&def); this->setType(type); + Memoizer::add(body, this); + } + + Body::Body(b2Body * b) + : body(b) + { + world = (World *)Memoizer::find(b->GetWorld()); + world->retain(); + Memoizer::add(body, this); } Body::~Body() { + Memoizer::remove(body); world->world->DestroyBody(body); world->release(); body = 0; diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index d14a00e2f..07c181365 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -76,6 +76,11 @@ namespace box2d * 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(); diff --git a/src/modules/physics/box2d/ChainShape.cpp b/src/modules/physics/box2d/ChainShape.cpp index 2a0af58b5..f127be479 100644 --- a/src/modules/physics/box2d/ChainShape.cpp +++ b/src/modules/physics/box2d/ChainShape.cpp @@ -25,6 +25,8 @@ #include "World.h" #include "Physics.h" +#include + namespace love { namespace physics @@ -35,10 +37,12 @@ namespace box2d : loop(loop) { shape = c; + Memoizer::add(shape, this); } ChainShape::~ChainShape() { + Memoizer::remove(shape); delete shape; shape = NULL; } diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index 614f04621..752f2f94d 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -24,6 +24,8 @@ #include "Body.h" #include "World.h" +#include + namespace love { namespace physics @@ -33,10 +35,12 @@ namespace box2d CircleShape::CircleShape(b2CircleShape * c) { shape = c; + Memoizer::add(shape, this); } CircleShape::~CircleShape() { + Memoizer::remove(shape); delete shape; shape = NULL; } diff --git a/src/modules/physics/box2d/EdgeShape.cpp b/src/modules/physics/box2d/EdgeShape.cpp index 3d0c6a8d5..1e90db188 100644 --- a/src/modules/physics/box2d/EdgeShape.cpp +++ b/src/modules/physics/box2d/EdgeShape.cpp @@ -24,6 +24,8 @@ #include "Body.h" #include "World.h" +#include + namespace love { namespace physics @@ -33,10 +35,12 @@ namespace box2d EdgeShape::EdgeShape(b2EdgeShape * e) { shape = e; + Memoizer::add(shape, this); } EdgeShape::~EdgeShape() { + Memoizer::remove(shape); delete shape; shape = NULL; } diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index 38b927559..f8968fe80 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -25,6 +25,8 @@ #include "World.h" #include "Physics.h" +#include + // STD #include @@ -46,6 +48,20 @@ namespace box2d def.userData = (void *)data; def.density = density; fixture = body->body->CreateFixture(&def); + 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()); + body->retain(); + shape = (Shape *)Memoizer::find(f->GetShape()); + if (!shape) shape = new Shape(f->GetShape()); + shape->retain(); + Memoizer::add(fixture, this); } Fixture::~Fixture() diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index 23c312676..856628858 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -70,6 +70,11 @@ namespace box2d * Creates a Fixture. **/ Fixture(Body * body, Shape * shape, float density); + + /** + * Creates a Fixture. + **/ + Fixture(b2Fixture * f); virtual ~Fixture(); diff --git a/src/modules/physics/box2d/PolygonShape.cpp b/src/modules/physics/box2d/PolygonShape.cpp index e9d04d701..62c1a80d2 100644 --- a/src/modules/physics/box2d/PolygonShape.cpp +++ b/src/modules/physics/box2d/PolygonShape.cpp @@ -25,6 +25,8 @@ #include "World.h" #include "Physics.h" +#include + namespace love { namespace physics @@ -34,10 +36,12 @@ namespace box2d PolygonShape::PolygonShape(b2PolygonShape * p) { shape = p; + Memoizer::add(shape, this); } PolygonShape::~PolygonShape() { + Memoizer::remove(shape); delete shape; shape = NULL; } diff --git a/src/modules/physics/box2d/Shape.cpp b/src/modules/physics/box2d/Shape.cpp index 6b6b99e4e..0de9c7c44 100644 --- a/src/modules/physics/box2d/Shape.cpp +++ b/src/modules/physics/box2d/Shape.cpp @@ -25,6 +25,8 @@ #include "World.h" #include "Physics.h" +#include + // STD #include @@ -38,9 +40,18 @@ namespace box2d : shape(NULL) { } + Shape::Shape(b2Shape * shape) + : shape(shape) + { + Memoizer::add(shape, this); + } Shape::~Shape() { + if (shape) { + Memoizer::remove(shape); + delete shape; + } shape = 0; } diff --git a/src/modules/physics/box2d/Shape.h b/src/modules/physics/box2d/Shape.h index 78334a6f7..beb94c37c 100644 --- a/src/modules/physics/box2d/Shape.h +++ b/src/modules/physics/box2d/Shape.h @@ -57,6 +57,7 @@ namespace box2d * Creates a Shape. **/ Shape(); + Shape(b2Shape * shape); virtual ~Shape(); diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 956c13a7a..d7423e9f9 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -24,6 +24,7 @@ #include "Shape.h" #include "Contact.h" #include "Physics.h" +#include #include namespace love @@ -125,6 +126,7 @@ namespace box2d world->SetContactListener(this); b2BodyDef def; groundBody = world->CreateBody(&def); + Memoizer::add(world, this); } World::World(b2Vec2 gravity, bool sleep) @@ -135,11 +137,13 @@ namespace box2d world->SetContactListener(this); b2BodyDef def; groundBody = world->CreateBody(&def); + Memoizer::add(world, this); } World::~World() { world->DestroyBody(groundBody); + Memoizer::remove(world); delete world; } From e962891ba20116162cb112efe6548549e55c09e1 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 12:32:28 -0400 Subject: [PATCH 207/384] Add Fixture:getNext() --HG-- branch : box2d-update --- src/modules/physics/box2d/Fixture.cpp | 9 +++++++++ src/modules/physics/box2d/Fixture.h | 5 +++++ src/modules/physics/box2d/wrap_Fixture.cpp | 11 +++++++++++ src/modules/physics/box2d/wrap_Fixture.h | 1 + 4 files changed, 26 insertions(+) diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index f8968fe80..ea7838db4 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -133,6 +133,15 @@ namespace box2d { return shape; } + + Fixture * Fixture::getNext() const + { + b2Fixture * f = fixture->GetNext(); + if (!f) return NULL; + Fixture * fix = (Fixture *)Memoizer::find(f); + if (!fix) fix = new Fixture(f); + return fix; + } void Fixture::setFilterData(int * v) { diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index 856628858..574d17b24 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -106,6 +106,11 @@ namespace box2d **/ Body * getBody() const; + /** + * Gets the next Fixture attached to the parent Body. + **/ + Fixture * getNext() const; + /** * Sets the filter data. An integer array is used even though the * first two elements are unsigned shorts. The elements are: diff --git a/src/modules/physics/box2d/wrap_Fixture.cpp b/src/modules/physics/box2d/wrap_Fixture.cpp index bc758f4db..c420f38e6 100644 --- a/src/modules/physics/box2d/wrap_Fixture.cpp +++ b/src/modules/physics/box2d/wrap_Fixture.cpp @@ -122,6 +122,16 @@ namespace box2d luax_newtype(L, "Shape", PHYSICS_SHAPE_T, (void*)shape); return 1; } + + int w_Fixture_getNext(lua_State * L) + { + Fixture * t = luax_checkfixture(L, 1); + Fixture * f = t->getNext(); + if (f == 0) return 0; + f->retain(); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); + return 1; + } int w_Fixture_testPoint(lua_State * L) { @@ -254,6 +264,7 @@ namespace box2d { "getDensity", w_Fixture_getDensity }, { "getBody", w_Fixture_getBody }, { "getShape", w_Fixture_getShape }, + { "getNext", w_Fixture_getNext }, { "isSensor", w_Fixture_isSensor }, { "testPoint", w_Fixture_testPoint }, { "rayCast", w_Fixture_rayCast }, diff --git a/src/modules/physics/box2d/wrap_Fixture.h b/src/modules/physics/box2d/wrap_Fixture.h index d41f6b25a..675ab7342 100644 --- a/src/modules/physics/box2d/wrap_Fixture.h +++ b/src/modules/physics/box2d/wrap_Fixture.h @@ -43,6 +43,7 @@ namespace box2d int w_Fixture_isSensor(lua_State * L); int w_Fixture_getBody(lua_State * L); int w_Fixture_getShape(lua_State * L); + int w_Fixture_getNext(lua_State * L); int w_Fixture_testPoint(lua_State * L); int w_Fixture_rayCast(lua_State * L); int w_Fixture_setFilterData(lua_State * L); From 06820210eb22490f9ea1923b2a1b50aba5e0ec7f Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 13:21:50 -0400 Subject: [PATCH 208/384] better Fixture Shape management --HG-- branch : box2d-update --- src/modules/physics/box2d/Fixture.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index ea7838db4..01f704597 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -37,10 +37,9 @@ namespace physics namespace box2d { Fixture::Fixture(Body * body, Shape * shape, float density) - : body(body), shape(shape), fixture(NULL) + : body(body), fixture(NULL) { body->retain(); - shape->retain(); data = new fixtureudata(); data->ref = 0; b2FixtureDef def; @@ -48,6 +47,7 @@ namespace box2d def.userData = (void *)data; def.density = density; fixture = body->body->CreateFixture(&def); + shape = new Shape(fixture->GetShape()); Memoizer::add(fixture, this); } @@ -60,7 +60,7 @@ namespace box2d body->retain(); shape = (Shape *)Memoizer::find(f->GetShape()); if (!shape) shape = new Shape(f->GetShape()); - shape->retain(); + else shape->retain(); Memoizer::add(fixture, this); } @@ -77,6 +77,7 @@ namespace box2d fixture = 0; body->release(); + shape->release(); } Shape::Type Fixture::getType() const From 1b14dcaeb863b1af118a393efad24c320c534689 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 13:22:05 -0400 Subject: [PATCH 209/384] cleaning up *Shape constructors --HG-- branch : box2d-update --- src/modules/physics/box2d/ChainShape.cpp | 4 +--- src/modules/physics/box2d/CircleShape.cpp | 3 +-- src/modules/physics/box2d/EdgeShape.cpp | 3 +-- src/modules/physics/box2d/PolygonShape.cpp | 3 +-- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/modules/physics/box2d/ChainShape.cpp b/src/modules/physics/box2d/ChainShape.cpp index f127be479..2f3a3a1ec 100644 --- a/src/modules/physics/box2d/ChainShape.cpp +++ b/src/modules/physics/box2d/ChainShape.cpp @@ -34,10 +34,8 @@ namespace physics namespace box2d { ChainShape::ChainShape(b2ChainShape * c, bool loop) - : loop(loop) + : Shape(c), loop(loop) { - shape = c; - Memoizer::add(shape, this); } ChainShape::~ChainShape() diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index 752f2f94d..a9123a3b9 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -33,9 +33,8 @@ namespace physics namespace box2d { CircleShape::CircleShape(b2CircleShape * c) + : Shape(c) { - shape = c; - Memoizer::add(shape, this); } CircleShape::~CircleShape() diff --git a/src/modules/physics/box2d/EdgeShape.cpp b/src/modules/physics/box2d/EdgeShape.cpp index 1e90db188..1416419b1 100644 --- a/src/modules/physics/box2d/EdgeShape.cpp +++ b/src/modules/physics/box2d/EdgeShape.cpp @@ -33,9 +33,8 @@ namespace physics namespace box2d { EdgeShape::EdgeShape(b2EdgeShape * e) + : Shape(e) { - shape = e; - Memoizer::add(shape, this); } EdgeShape::~EdgeShape() diff --git a/src/modules/physics/box2d/PolygonShape.cpp b/src/modules/physics/box2d/PolygonShape.cpp index 62c1a80d2..c77e0106b 100644 --- a/src/modules/physics/box2d/PolygonShape.cpp +++ b/src/modules/physics/box2d/PolygonShape.cpp @@ -34,9 +34,8 @@ namespace physics namespace box2d { PolygonShape::PolygonShape(b2PolygonShape * p) + : Shape(p) { - shape = p; - Memoizer::add(shape, this); } PolygonShape::~PolygonShape() From 7e039dd1efca02868bfc95f786cb3d3d6f856d17 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 13:45:24 -0400 Subject: [PATCH 210/384] Add ContactFilter callback to World --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 49 ++++++++++++++++++++++++ src/modules/physics/box2d/World.h | 26 ++++++++++++- src/modules/physics/box2d/wrap_World.cpp | 16 ++++++++ src/modules/physics/box2d/wrap_World.h | 2 + 4 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index d7423e9f9..dc368517f 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -117,6 +117,31 @@ namespace box2d } } + + World::ContactFilter::ContactFilter() + : ref(0) + { + } + + World::ContactFilter::~ContactFilter() + { + if(ref != 0) + delete ref; + } + + bool World::ContactFilter::process(Fixture * a, Fixture * b) + { + if (ref != 0) + { + lua_State * L = ref->getL(); + ref->push(); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)a); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)b); + lua_call(L, 2, 1); + return luax_toboolean(L, -1); + } + return true; + } World::World() : world(NULL) @@ -178,6 +203,16 @@ namespace box2d { postsolve.add(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!"); + Fixture * b = (Fixture *)Memoizer::find(fixtureB); + if (!b) throw love::Exception("A fixture has escaped Memoizer!"); + return filter.process(a, b); + } int World::setCallbacks(lua_State * L) { @@ -211,6 +246,20 @@ namespace box2d postsolve.ref ? postsolve.ref->push() : lua_pushnil(L); return lua_gettop(L); } + + 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 lua_gettop(L); + } void World::setGravity(float x, float y) { diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index b76eee41c..1798372af 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -40,6 +40,7 @@ namespace box2d { class Contact; + class Fixture; /** * The World is the "God" container class, @@ -52,7 +53,7 @@ namespace box2d * The world also controls global parameters, like * gravity. **/ - class World : public Object, public b2ContactListener + class World : public Object, public b2ContactListener, public b2ContactFilter { // Friends. friend class Joint; @@ -76,6 +77,15 @@ namespace box2d void add(b2Contact* contact, const b2ContactImpulse* impulse); void process(); }; + + class ContactFilter + { + public: + Reference * ref; + ContactFilter(); + ~ContactFilter(); + bool process(Fixture * a, Fixture * b); + }; private: @@ -87,6 +97,7 @@ namespace box2d // Contact callbacks. ContactCallback begin, end, presolve, postsolve; + ContactFilter filter; public: @@ -119,6 +130,9 @@ namespace box2d 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); /** * Receives up to four Lua functions as arguments. Each function is @@ -132,6 +146,16 @@ namespace box2d * 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. diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index 4e8f14dc9..febfcfcb4 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -53,6 +53,20 @@ namespace box2d 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) { @@ -103,6 +117,8 @@ namespace box2d { "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 }, { "setAllowSleeping", w_World_setAllowSleeping }, diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index 7f99a7449..372928c22 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -35,6 +35,8 @@ namespace box2d 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_setAllowSleeping(lua_State * L); From c233ab3d50f9761cac61cfcfd4602bc1efef0085 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 13:45:40 -0400 Subject: [PATCH 211/384] isSleepingAllowde -> isSleepingAllowed --HG-- branch : box2d-update --- src/modules/physics/box2d/wrap_Body.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index 110dfacd3..909f5e429 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -556,7 +556,7 @@ namespace box2d { "isActive", w_Body_isActive }, { "isAwake", w_Body_isAwake }, { "setSleepingAllowed", w_Body_setSleepingAllowed }, - { "isSleepingAllowde", w_Body_isSleepingAllowed }, + { "isSleepingAllowed", w_Body_isSleepingAllowed }, { "setActive", w_Body_setActive }, { "setAwake", w_Body_setAwake }, { "setFixedRotation", w_Body_setFixedRotation }, From 055238659b42e8b6b29d71aea2b46de2dba24ce8 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 13:51:11 -0400 Subject: [PATCH 212/384] Change Contact callbacks to pass the actual Fixtures instead of just the userdata --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index dc368517f..110a1b80a 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -76,22 +76,22 @@ namespace box2d // Push the function. ref->push(); - // Push first userdata. + // Push first fixture. { - fixtureudata * d = (fixtureudata *)(contacts[i]->contact->GetFixtureA()->GetUserData()); - if(d->ref != 0) - d->ref->push(); + Fixture * a = (Fixture *)Memoizer::find(contacts[i]->contact->GetFixtureA()); + if(a != 0) + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)a); else - lua_pushnil(L); + throw love::Exception("A fixture has escaped Memoizer!"); } // Push second userdata. { - fixtureudata * d = (fixtureudata *)(contacts[i]->contact->GetFixtureB()->GetUserData()); - if(d->ref != 0) - d->ref->push(); + Fixture * b = (Fixture *)Memoizer::find(contacts[i]->contact->GetFixtureB()); + if(b != 0) + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)b); else - lua_pushnil(L); + throw love::Exception("A fixture has escaped Memoizer!"); } luax_newtype(L, "Contact", (PHYSICS_CONTACT_T), (void*)contacts[i], false); From 8ae43be1feac2014a06975e2a15df22a518d9055 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 14:54:06 -0400 Subject: [PATCH 213/384] Fix Fixture memory management issues --HG-- branch : box2d-update --- src/modules/physics/box2d/Fixture.cpp | 14 ++++++-------- src/modules/physics/box2d/Fixture.h | 1 - 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index 01f704597..b07b98092 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -47,7 +47,6 @@ namespace box2d def.userData = (void *)data; def.density = density; fixture = body->body->CreateFixture(&def); - shape = new Shape(fixture->GetShape()); Memoizer::add(fixture, this); } @@ -57,10 +56,7 @@ namespace box2d data = (fixtureudata *)f->GetUserData(); body = (Body *)Memoizer::find(f->GetBody()); if (!body) body = new Body(f->GetBody()); - body->retain(); - shape = (Shape *)Memoizer::find(f->GetShape()); - if (!shape) shape = new Shape(f->GetShape()); - else shape->retain(); + else body->retain(); Memoizer::add(fixture, this); } @@ -77,12 +73,11 @@ namespace box2d fixture = 0; body->release(); - shape->release(); } Shape::Type Fixture::getType() const { - return shape->getType(); + return Shape(fixture->GetShape()).getType(); } void Fixture::setFriction(float friction) @@ -132,7 +127,10 @@ namespace box2d Shape * Fixture::getShape() const { - return shape; + if (!fixture->GetShape()) return NULL; + Shape * s = (Shape *)Memoizer::find(fixture->GetShape()); + if (!s) s = new Shape(fixture->GetShape()); + return s; } Fixture * Fixture::getNext() const diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index 574d17b24..69734d770 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -60,7 +60,6 @@ namespace box2d protected: Body * body; - Shape * shape; b2Fixture * fixture; fixtureudata * data; From e984bc084d2defb56a553e5f207f01540c878e3a Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 15:34:28 -0400 Subject: [PATCH 214/384] Move Box2D from modules/physics/box2d to libraries --HG-- branch : box2d-update --- .../macosx/love.xcodeproj/project.pbxproj | 620 +++++++++--------- .../physics/box2d => libraries}/Box2D/Box2D.h | 0 .../Box2D/Collision/Shapes/b2ChainShape.cpp | 0 .../Box2D/Collision/Shapes/b2ChainShape.h | 0 .../Box2D/Collision/Shapes/b2CircleShape.cpp | 0 .../Box2D/Collision/Shapes/b2CircleShape.h | 0 .../Box2D/Collision/Shapes/b2EdgeShape.cpp | 0 .../Box2D/Collision/Shapes/b2EdgeShape.h | 0 .../Box2D/Collision/Shapes/b2PolygonShape.cpp | 0 .../Box2D/Collision/Shapes/b2PolygonShape.h | 0 .../Box2D/Collision/Shapes/b2Shape.h | 0 .../Box2D/Collision/b2BroadPhase.cpp | 0 .../Box2D/Collision/b2BroadPhase.h | 0 .../Box2D/Collision/b2CollideCircle.cpp | 0 .../Box2D/Collision/b2CollideEdge.cpp | 0 .../Box2D/Collision/b2CollidePolygon.cpp | 0 .../Box2D/Collision/b2Collision.cpp | 0 .../Box2D/Collision/b2Collision.h | 0 .../Box2D/Collision/b2Distance.cpp | 0 .../Box2D/Collision/b2Distance.h | 0 .../Box2D/Collision/b2DynamicTree.cpp | 0 .../Box2D/Collision/b2DynamicTree.h | 0 .../Box2D/Collision/b2TimeOfImpact.cpp | 0 .../Box2D/Collision/b2TimeOfImpact.h | 0 .../Box2D/Common/b2BlockAllocator.cpp | 0 .../Box2D/Common/b2BlockAllocator.h | 0 .../Box2D/Common/b2Draw.cpp | 0 .../box2d => libraries}/Box2D/Common/b2Draw.h | 0 .../Box2D/Common/b2GrowableStack.h | 0 .../Box2D/Common/b2Math.cpp | 0 .../box2d => libraries}/Box2D/Common/b2Math.h | 0 .../Box2D/Common/b2Settings.cpp | 0 .../Box2D/Common/b2Settings.h | 0 .../Box2D/Common/b2StackAllocator.cpp | 0 .../Box2D/Common/b2StackAllocator.h | 0 .../Box2D/Common/b2Timer.cpp | 0 .../Box2D/Common/b2Timer.h | 0 .../Contacts/b2ChainAndCircleContact.cpp | 0 .../Contacts/b2ChainAndCircleContact.h | 0 .../Contacts/b2ChainAndPolygonContact.cpp | 0 .../Contacts/b2ChainAndPolygonContact.h | 0 .../Dynamics/Contacts/b2CircleContact.cpp | 0 .../Box2D/Dynamics/Contacts/b2CircleContact.h | 0 .../Box2D/Dynamics/Contacts/b2Contact.cpp | 0 .../Box2D/Dynamics/Contacts/b2Contact.h | 0 .../Dynamics/Contacts/b2ContactSolver.cpp | 0 .../Box2D/Dynamics/Contacts/b2ContactSolver.h | 0 .../Contacts/b2EdgeAndCircleContact.cpp | 0 .../Contacts/b2EdgeAndCircleContact.h | 0 .../Contacts/b2EdgeAndPolygonContact.cpp | 0 .../Contacts/b2EdgeAndPolygonContact.h | 0 .../Contacts/b2PolygonAndCircleContact.cpp | 0 .../Contacts/b2PolygonAndCircleContact.h | 0 .../Dynamics/Contacts/b2PolygonContact.cpp | 0 .../Dynamics/Contacts/b2PolygonContact.h | 0 .../Box2D/Dynamics/Joints/b2DistanceJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2DistanceJoint.h | 0 .../Box2D/Dynamics/Joints/b2FrictionJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2FrictionJoint.h | 0 .../Box2D/Dynamics/Joints/b2GearJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2GearJoint.h | 0 .../Box2D/Dynamics/Joints/b2Joint.cpp | 0 .../Box2D/Dynamics/Joints/b2Joint.h | 0 .../Box2D/Dynamics/Joints/b2MouseJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2MouseJoint.h | 0 .../Dynamics/Joints/b2PrismaticJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2PrismaticJoint.h | 0 .../Box2D/Dynamics/Joints/b2PulleyJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2PulleyJoint.h | 0 .../Box2D/Dynamics/Joints/b2RevoluteJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2RevoluteJoint.h | 0 .../Box2D/Dynamics/Joints/b2RopeJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2RopeJoint.h | 0 .../Box2D/Dynamics/Joints/b2WeldJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2WeldJoint.h | 0 .../Box2D/Dynamics/Joints/b2WheelJoint.cpp | 0 .../Box2D/Dynamics/Joints/b2WheelJoint.h | 0 .../Box2D/Dynamics/b2Body.cpp | 0 .../Box2D/Dynamics/b2Body.h | 0 .../Box2D/Dynamics/b2ContactManager.cpp | 0 .../Box2D/Dynamics/b2ContactManager.h | 0 .../Box2D/Dynamics/b2Fixture.cpp | 0 .../Box2D/Dynamics/b2Fixture.h | 0 .../Box2D/Dynamics/b2Island.cpp | 0 .../Box2D/Dynamics/b2Island.h | 0 .../Box2D/Dynamics/b2TimeStep.h | 0 .../Box2D/Dynamics/b2World.cpp | 0 .../Box2D/Dynamics/b2World.h | 0 .../Box2D/Dynamics/b2WorldCallbacks.cpp | 0 .../Box2D/Dynamics/b2WorldCallbacks.h | 0 .../box2d => libraries}/Box2D/Rope/b2Rope.cpp | 0 .../box2d => libraries}/Box2D/Rope/b2Rope.h | 0 92 files changed, 306 insertions(+), 314 deletions(-) rename src/{modules/physics/box2d => libraries}/Box2D/Box2D.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2ChainShape.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2ChainShape.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2CircleShape.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2CircleShape.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2EdgeShape.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2EdgeShape.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2PolygonShape.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2PolygonShape.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/Shapes/b2Shape.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2BroadPhase.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2BroadPhase.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2CollideCircle.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2CollideEdge.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2CollidePolygon.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2Collision.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2Collision.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2Distance.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2Distance.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2DynamicTree.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2DynamicTree.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2TimeOfImpact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Collision/b2TimeOfImpact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2BlockAllocator.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2BlockAllocator.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Draw.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Draw.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2GrowableStack.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Math.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Math.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Settings.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Settings.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2StackAllocator.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2StackAllocator.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Timer.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Common/b2Timer.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2CircleContact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2CircleContact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2Contact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2Contact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2ContactSolver.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2ContactSolver.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2PolygonContact.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Contacts/b2PolygonContact.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2DistanceJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2DistanceJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2FrictionJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2FrictionJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2GearJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2GearJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2Joint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2Joint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2MouseJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2MouseJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2PrismaticJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2PulleyJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2PulleyJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2RevoluteJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2RopeJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2RopeJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2WeldJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2WeldJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2WheelJoint.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/Joints/b2WheelJoint.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2Body.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2Body.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2ContactManager.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2ContactManager.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2Fixture.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2Fixture.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2Island.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2Island.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2TimeStep.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2World.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2World.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2WorldCallbacks.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Dynamics/b2WorldCallbacks.h (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Rope/b2Rope.cpp (100%) rename src/{modules/physics/box2d => libraries}/Box2D/Rope/b2Rope.h (100%) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 543bcfdca..f01fe2b23 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -148,18 +148,6 @@ A968F0D91083A9FC00A895AA /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0D81083A9FC00A895AA /* Mouse.cpp */; }; A968F0DD1083AA6600A895AA /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DB1083AA6600A895AA /* Shape.cpp */; }; A968F0DE1083AA6600A895AA /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A968F0DC1083AA6600A895AA /* Joint.cpp */; }; - A96F416014127E340067FE9A /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F415C14127E310067FE9A /* b2RopeJoint.cpp */; }; - A96F416114127E340067FE9A /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F415E14127E320067FE9A /* b2WheelJoint.cpp */; }; - A96F416514127E720067FE9A /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416314127E720067FE9A /* b2Rope.cpp */; }; - A96F416B14127E9C0067FE9A /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416614127E9C0067FE9A /* b2Draw.cpp */; }; - A96F416C14127E9C0067FE9A /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416914127E9C0067FE9A /* b2Timer.cpp */; }; - A96F416E14127EB20067FE9A /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */; }; - A96F417114127EC00067FE9A /* b2ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F416F14127EC00067FE9A /* b2ChainShape.cpp */; }; - A96F417614127EE70067FE9A /* b2ChainAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */; }; - A96F417714127EE70067FE9A /* b2ChainAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */; }; - A96F417C14127EFD0067FE9A /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */; }; - A96F417D14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */; }; - A96F418014127FC20067FE9A /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */; }; A96F41831412AFE20067FE9A /* wrap_WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */; }; A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41841412AFEB0067FE9A /* WeldJoint.cpp */; }; A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */; }; @@ -168,39 +156,6 @@ A96F41A71412C92B0067FE9A /* wrap_EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */; }; A986DEB5113249A800810279 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB1113249A800810279 /* Thread.cpp */; }; A986DEB6113249A800810279 /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986DEB3113249A800810279 /* wrap_Thread.cpp */; }; - A986EC64132CE6DB00F048C8 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */; }; - A986EC65132CE6DB00F048C8 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCA132CE6D800F048C8 /* b2CollideCircle.cpp */; }; - A986EC66132CE6DB00F048C8 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCB132CE6D800F048C8 /* b2CollidePolygon.cpp */; }; - A986EC67132CE6DB00F048C8 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCC132CE6D800F048C8 /* b2Collision.cpp */; }; - A986EC68132CE6DB00F048C8 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBCE132CE6D800F048C8 /* b2Distance.cpp */; }; - A986EC69132CE6DB00F048C8 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD0132CE6D800F048C8 /* b2DynamicTree.cpp */; }; - A986EC6A132CE6DB00F048C8 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD2132CE6D800F048C8 /* b2TimeOfImpact.cpp */; }; - A986EC6B132CE6DB00F048C8 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD5132CE6D800F048C8 /* b2CircleShape.cpp */; }; - A986EC6C132CE6DB00F048C8 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBD7132CE6D800F048C8 /* b2PolygonShape.cpp */; }; - A986EC6D132CE6DB00F048C8 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBDB132CE6D800F048C8 /* b2BlockAllocator.cpp */; }; - A986EC6E132CE6DB00F048C8 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBDD132CE6D800F048C8 /* b2Math.cpp */; }; - A986EC6F132CE6DB00F048C8 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBDF132CE6D800F048C8 /* b2Settings.cpp */; }; - A986EC70132CE6DB00F048C8 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE1132CE6D800F048C8 /* b2StackAllocator.cpp */; }; - A986EC71132CE6DB00F048C8 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE4132CE6D800F048C8 /* b2Body.cpp */; }; - A986EC72132CE6DB00F048C8 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE6132CE6D800F048C8 /* b2ContactManager.cpp */; }; - A986EC73132CE6DB00F048C8 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBE8132CE6D800F048C8 /* b2Fixture.cpp */; }; - A986EC74132CE6DB00F048C8 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBEA132CE6D800F048C8 /* b2Island.cpp */; }; - A986EC75132CE6DB00F048C8 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBED132CE6D800F048C8 /* b2World.cpp */; }; - A986EC76132CE6DB00F048C8 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBEF132CE6D800F048C8 /* b2WorldCallbacks.cpp */; }; - A986EC77132CE6DB00F048C8 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF2132CE6D800F048C8 /* b2CircleContact.cpp */; }; - A986EC78132CE6DB00F048C8 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF4132CE6D800F048C8 /* b2Contact.cpp */; }; - A986EC79132CE6DB00F048C8 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */; }; - A986EC7A132CE6DB00F048C8 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */; }; - A986EC7B132CE6DB00F048C8 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */; }; - A986EC7D132CE6DB00F048C8 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */; }; - A986EC7E132CE6DB00F048C8 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */; }; - A986EC7F132CE6DB00F048C8 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC03132CE6D800F048C8 /* b2GearJoint.cpp */; }; - A986EC80132CE6DB00F048C8 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC05132CE6D800F048C8 /* b2Joint.cpp */; }; - A986EC82132CE6DB00F048C8 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */; }; - A986EC83132CE6DB00F048C8 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */; }; - A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */; }; - A986EC85132CE6DB00F048C8 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */; }; - A986EC86132CE6DB00F048C8 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */; }; A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986ECAD132CEB9300F048C8 /* Fixture.cpp */; }; A98D914410507C97008E03F2 /* EncodedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98D914310507C97008E03F2 /* EncodedImageData.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; @@ -217,6 +172,52 @@ A9D307EA106635C3004FEDF8 /* physfs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9D5C47D142E32EE0044ECF7 /* Memoizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C47C142E32ED0044ECF7 /* Memoizer.cpp */; }; + A9D5C4E8142E5F7F0044ECF7 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C487142E5F7F0044ECF7 /* b2BroadPhase.cpp */; }; + A9D5C4E9142E5F7F0044ECF7 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C489142E5F7F0044ECF7 /* b2CollideCircle.cpp */; }; + A9D5C4EA142E5F7F0044ECF7 /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C48A142E5F7F0044ECF7 /* b2CollideEdge.cpp */; }; + A9D5C4EB142E5F7F0044ECF7 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C48B142E5F7F0044ECF7 /* b2CollidePolygon.cpp */; }; + A9D5C4EC142E5F7F0044ECF7 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C48C142E5F7F0044ECF7 /* b2Collision.cpp */; }; + A9D5C4ED142E5F7F0044ECF7 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C48E142E5F7F0044ECF7 /* b2Distance.cpp */; }; + A9D5C4EE142E5F7F0044ECF7 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C490142E5F7F0044ECF7 /* b2DynamicTree.cpp */; }; + A9D5C4EF142E5F7F0044ECF7 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C492142E5F7F0044ECF7 /* b2TimeOfImpact.cpp */; }; + A9D5C4F0142E5F7F0044ECF7 /* b2ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C495142E5F7F0044ECF7 /* b2ChainShape.cpp */; }; + A9D5C4F1142E5F7F0044ECF7 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C497142E5F7F0044ECF7 /* b2CircleShape.cpp */; }; + A9D5C4F2142E5F7F0044ECF7 /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C499142E5F7F0044ECF7 /* b2EdgeShape.cpp */; }; + A9D5C4F3142E5F7F0044ECF7 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C49B142E5F7F0044ECF7 /* b2PolygonShape.cpp */; }; + A9D5C4F4142E5F7F0044ECF7 /* b2PolygonShape.cpp.orig in Resources */ = {isa = PBXBuildFile; fileRef = A9D5C49C142E5F7F0044ECF7 /* b2PolygonShape.cpp.orig */; }; + A9D5C4F5142E5F7F0044ECF7 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A0142E5F7F0044ECF7 /* b2BlockAllocator.cpp */; }; + A9D5C4F6142E5F7F0044ECF7 /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A2142E5F7F0044ECF7 /* b2Draw.cpp */; }; + A9D5C4F7142E5F7F0044ECF7 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A5142E5F7F0044ECF7 /* b2Math.cpp */; }; + A9D5C4F8142E5F7F0044ECF7 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A7142E5F7F0044ECF7 /* b2Settings.cpp */; }; + A9D5C4F9142E5F7F0044ECF7 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A9142E5F7F0044ECF7 /* b2StackAllocator.cpp */; }; + A9D5C4FA142E5F7F0044ECF7 /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4AB142E5F7F0044ECF7 /* b2Timer.cpp */; }; + A9D5C4FB142E5F7F0044ECF7 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4AE142E5F7F0044ECF7 /* b2Body.cpp */; }; + A9D5C4FC142E5F7F0044ECF7 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4B0142E5F7F0044ECF7 /* b2ContactManager.cpp */; }; + A9D5C4FD142E5F7F0044ECF7 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4B2142E5F7F0044ECF7 /* b2Fixture.cpp */; }; + A9D5C4FE142E5F7F0044ECF7 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4B4142E5F7F0044ECF7 /* b2Island.cpp */; }; + A9D5C4FF142E5F7F0044ECF7 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4B7142E5F7F0044ECF7 /* b2World.cpp */; }; + A9D5C500142E5F7F0044ECF7 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4B9142E5F7F0044ECF7 /* b2WorldCallbacks.cpp */; }; + A9D5C501142E5F7F0044ECF7 /* b2ChainAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4BC142E5F7F0044ECF7 /* b2ChainAndCircleContact.cpp */; }; + A9D5C502142E5F7F0044ECF7 /* b2ChainAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4BE142E5F7F0044ECF7 /* b2ChainAndPolygonContact.cpp */; }; + A9D5C503142E5F7F0044ECF7 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4C0142E5F7F0044ECF7 /* b2CircleContact.cpp */; }; + A9D5C504142E5F7F0044ECF7 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4C2142E5F7F0044ECF7 /* b2Contact.cpp */; }; + A9D5C505142E5F7F0044ECF7 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4C4142E5F7F0044ECF7 /* b2ContactSolver.cpp */; }; + A9D5C506142E5F7F0044ECF7 /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4C6142E5F7F0044ECF7 /* b2EdgeAndCircleContact.cpp */; }; + A9D5C507142E5F7F0044ECF7 /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4C8142E5F7F0044ECF7 /* b2EdgeAndPolygonContact.cpp */; }; + A9D5C508142E5F7F0044ECF7 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4CA142E5F7F0044ECF7 /* b2PolygonAndCircleContact.cpp */; }; + A9D5C509142E5F7F0044ECF7 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4CC142E5F7F0044ECF7 /* b2PolygonContact.cpp */; }; + A9D5C50A142E5F7F0044ECF7 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4CF142E5F7F0044ECF7 /* b2DistanceJoint.cpp */; }; + A9D5C50B142E5F7F0044ECF7 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4D1142E5F7F0044ECF7 /* b2FrictionJoint.cpp */; }; + A9D5C50C142E5F7F0044ECF7 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4D3142E5F7F0044ECF7 /* b2GearJoint.cpp */; }; + A9D5C50D142E5F7F0044ECF7 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4D5142E5F7F0044ECF7 /* b2Joint.cpp */; }; + A9D5C50E142E5F7F0044ECF7 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4D7142E5F7F0044ECF7 /* b2MouseJoint.cpp */; }; + A9D5C50F142E5F7F0044ECF7 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4D9142E5F7F0044ECF7 /* b2PrismaticJoint.cpp */; }; + A9D5C510142E5F7F0044ECF7 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4DB142E5F7F0044ECF7 /* b2PulleyJoint.cpp */; }; + A9D5C511142E5F7F0044ECF7 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4DD142E5F7F0044ECF7 /* b2RevoluteJoint.cpp */; }; + A9D5C512142E5F7F0044ECF7 /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4DF142E5F7F0044ECF7 /* b2RopeJoint.cpp */; }; + A9D5C513142E5F7F0044ECF7 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4E1142E5F7F0044ECF7 /* b2WeldJoint.cpp */; }; + A9D5C514142E5F7F0044ECF7 /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4E3142E5F7F0044ECF7 /* b2WheelJoint.cpp */; }; + A9D5C515142E5F7F0044ECF7 /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4E6142E5F7F0044ECF7 /* b2Rope.cpp */; }; A9DEC1C11046EFA70049C70C /* Love.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1BF1046EFA60049C70C /* Love.icns */; }; A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1C01046EFA70049C70C /* LoveDocument.icns */; }; A9F16927109E7BAD00FC83D1 /* libmodplug.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F16926109E7BAD00FC83D1 /* libmodplug.framework */; }; @@ -549,30 +550,6 @@ A968F0D81083A9FC00A895AA /* Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; A968F0DB1083AA6600A895AA /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = ""; }; A968F0DC1083AA6600A895AA /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; - A96F415C14127E310067FE9A /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = ""; }; - A96F415D14127E320067FE9A /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = ""; }; - A96F415E14127E320067FE9A /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = ""; }; - A96F415F14127E320067FE9A /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = ""; }; - A96F416314127E720067FE9A /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = ""; }; - A96F416414127E720067FE9A /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = ""; }; - A96F416614127E9C0067FE9A /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = ""; }; - A96F416714127E9C0067FE9A /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = ""; }; - A96F416814127E9C0067FE9A /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = ""; }; - A96F416914127E9C0067FE9A /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = ""; }; - A96F416A14127E9C0067FE9A /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = ""; }; - A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = ""; }; - A96F416F14127EC00067FE9A /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainShape.cpp; sourceTree = ""; }; - A96F417014127EC00067FE9A /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainShape.h; sourceTree = ""; }; - A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndCircleContact.cpp; sourceTree = ""; }; - A96F417314127EE70067FE9A /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndCircleContact.h; sourceTree = ""; }; - A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndPolygonContact.cpp; sourceTree = ""; }; - A96F417514127EE70067FE9A /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndPolygonContact.h; sourceTree = ""; }; - A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = ""; }; - A96F417914127EFD0067FE9A /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = ""; }; - A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; - A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = ""; }; - A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = ""; }; - A96F417F14127FC20067FE9A /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = ""; }; A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = ""; }; A96F41821412AFC60067FE9A /* wrap_WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = ""; }; A96F41841412AFEB0067FE9A /* WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = ""; }; @@ -590,73 +567,6 @@ A986DEB2113249A800810279 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; A986DEB3113249A800810279 /* wrap_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Thread.cpp; sourceTree = ""; }; A986DEB4113249A800810279 /* wrap_Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Thread.h; sourceTree = ""; }; - A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; - A986EBC9132CE6D800F048C8 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; - A986EBCA132CE6D800F048C8 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; - A986EBCB132CE6D800F048C8 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; - A986EBCC132CE6D800F048C8 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; - A986EBCD132CE6D800F048C8 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; - A986EBCE132CE6D800F048C8 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; - A986EBCF132CE6D800F048C8 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; - A986EBD0132CE6D800F048C8 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; - A986EBD1132CE6D800F048C8 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; - A986EBD2132CE6D800F048C8 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; - A986EBD3132CE6D800F048C8 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; - A986EBD5132CE6D800F048C8 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; - A986EBD6132CE6D800F048C8 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; - A986EBD7132CE6D800F048C8 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; - A986EBD8132CE6D800F048C8 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; - A986EBD9132CE6D800F048C8 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; - A986EBDB132CE6D800F048C8 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; - A986EBDC132CE6D800F048C8 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; - A986EBDD132CE6D800F048C8 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; - A986EBDE132CE6D800F048C8 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; - A986EBDF132CE6D800F048C8 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; - A986EBE0132CE6D800F048C8 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; - A986EBE1132CE6D800F048C8 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; - A986EBE2132CE6D800F048C8 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; - A986EBE4132CE6D800F048C8 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; - A986EBE5132CE6D800F048C8 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; - A986EBE6132CE6D800F048C8 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; - A986EBE7132CE6D800F048C8 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; - A986EBE8132CE6D800F048C8 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; - A986EBE9132CE6D800F048C8 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; - A986EBEA132CE6D800F048C8 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; - A986EBEB132CE6D800F048C8 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; - A986EBEC132CE6D800F048C8 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; - A986EBED132CE6D800F048C8 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; - A986EBEE132CE6D800F048C8 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; - A986EBEF132CE6D800F048C8 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; - A986EBF0132CE6D800F048C8 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; - A986EBF2132CE6D800F048C8 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; - A986EBF3132CE6D800F048C8 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; - A986EBF4132CE6D800F048C8 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; - A986EBF5132CE6D800F048C8 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; - A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; - A986EBF7132CE6D800F048C8 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; - A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; - A986EBF9132CE6D800F048C8 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; - A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; - A986EBFB132CE6D800F048C8 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; - A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; - A986EC00132CE6D800F048C8 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; - A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; - A986EC02132CE6D800F048C8 /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = ""; }; - A986EC03132CE6D800F048C8 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; - A986EC04132CE6D800F048C8 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; - A986EC05132CE6D800F048C8 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; - A986EC06132CE6D800F048C8 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; - A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; - A986EC0A132CE6D800F048C8 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; - A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; - A986EC0C132CE6D800F048C8 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; - A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; - A986EC0E132CE6D800F048C8 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; - A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; - A986EC10132CE6D800F048C8 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; - A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; - A986EC12132CE6D800F048C8 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; - A986ECAC132CE82F00F048C8 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; A986ECAD132CEB9300F048C8 /* Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Fixture.cpp; sourceTree = ""; }; A986ECAE132CEB9B00F048C8 /* Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fixture.h; sourceTree = ""; }; A98D913E10507BF9008E03F2 /* EncodedImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EncodedImageData.h; sourceTree = ""; }; @@ -688,6 +598,98 @@ A9D307E9106635C3004FEDF8 /* physfs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = physfs.framework; path = /Library/Frameworks/physfs.framework; sourceTree = ""; }; A9D5C47B142E31350044ECF7 /* Memoizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Memoizer.h; sourceTree = ""; }; A9D5C47C142E32ED0044ECF7 /* Memoizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Memoizer.cpp; sourceTree = ""; }; + A9D5C485142E5F7F0044ECF7 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; + A9D5C487142E5F7F0044ECF7 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; + A9D5C488142E5F7F0044ECF7 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; + A9D5C489142E5F7F0044ECF7 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; + A9D5C48A142E5F7F0044ECF7 /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = ""; }; + A9D5C48B142E5F7F0044ECF7 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; + A9D5C48C142E5F7F0044ECF7 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; + A9D5C48D142E5F7F0044ECF7 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; + A9D5C48E142E5F7F0044ECF7 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; + A9D5C48F142E5F7F0044ECF7 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; + A9D5C490142E5F7F0044ECF7 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; + A9D5C491142E5F7F0044ECF7 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; + A9D5C492142E5F7F0044ECF7 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; + A9D5C493142E5F7F0044ECF7 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; + A9D5C495142E5F7F0044ECF7 /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainShape.cpp; sourceTree = ""; }; + A9D5C496142E5F7F0044ECF7 /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainShape.h; sourceTree = ""; }; + A9D5C497142E5F7F0044ECF7 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; + A9D5C498142E5F7F0044ECF7 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; + A9D5C499142E5F7F0044ECF7 /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = ""; }; + A9D5C49A142E5F7F0044ECF7 /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = ""; }; + A9D5C49B142E5F7F0044ECF7 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; + A9D5C49C142E5F7F0044ECF7 /* b2PolygonShape.cpp.orig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = b2PolygonShape.cpp.orig; sourceTree = ""; }; + A9D5C49D142E5F7F0044ECF7 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; + A9D5C49E142E5F7F0044ECF7 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; + A9D5C4A0142E5F7F0044ECF7 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; + A9D5C4A1142E5F7F0044ECF7 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; + A9D5C4A2142E5F7F0044ECF7 /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = ""; }; + A9D5C4A3142E5F7F0044ECF7 /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = ""; }; + A9D5C4A4142E5F7F0044ECF7 /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = ""; }; + A9D5C4A5142E5F7F0044ECF7 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; + A9D5C4A6142E5F7F0044ECF7 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; + A9D5C4A7142E5F7F0044ECF7 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; + A9D5C4A8142E5F7F0044ECF7 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; + A9D5C4A9142E5F7F0044ECF7 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; + A9D5C4AA142E5F7F0044ECF7 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; + A9D5C4AB142E5F7F0044ECF7 /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = ""; }; + A9D5C4AC142E5F7F0044ECF7 /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = ""; }; + A9D5C4AE142E5F7F0044ECF7 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; + A9D5C4AF142E5F7F0044ECF7 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; + A9D5C4B0142E5F7F0044ECF7 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; + A9D5C4B1142E5F7F0044ECF7 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; + A9D5C4B2142E5F7F0044ECF7 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; + A9D5C4B3142E5F7F0044ECF7 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; + A9D5C4B4142E5F7F0044ECF7 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; + A9D5C4B5142E5F7F0044ECF7 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; + A9D5C4B6142E5F7F0044ECF7 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; + A9D5C4B7142E5F7F0044ECF7 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; + A9D5C4B8142E5F7F0044ECF7 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; + A9D5C4B9142E5F7F0044ECF7 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; + A9D5C4BA142E5F7F0044ECF7 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; + A9D5C4BC142E5F7F0044ECF7 /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndCircleContact.cpp; sourceTree = ""; }; + A9D5C4BD142E5F7F0044ECF7 /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndCircleContact.h; sourceTree = ""; }; + A9D5C4BE142E5F7F0044ECF7 /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndPolygonContact.cpp; sourceTree = ""; }; + A9D5C4BF142E5F7F0044ECF7 /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndPolygonContact.h; sourceTree = ""; }; + A9D5C4C0142E5F7F0044ECF7 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; + A9D5C4C1142E5F7F0044ECF7 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; + A9D5C4C2142E5F7F0044ECF7 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; + A9D5C4C3142E5F7F0044ECF7 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; + A9D5C4C4142E5F7F0044ECF7 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; + A9D5C4C5142E5F7F0044ECF7 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; + A9D5C4C6142E5F7F0044ECF7 /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = ""; }; + A9D5C4C7142E5F7F0044ECF7 /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = ""; }; + A9D5C4C8142E5F7F0044ECF7 /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; + A9D5C4C9142E5F7F0044ECF7 /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = ""; }; + A9D5C4CA142E5F7F0044ECF7 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; + A9D5C4CB142E5F7F0044ECF7 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; + A9D5C4CC142E5F7F0044ECF7 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; + A9D5C4CD142E5F7F0044ECF7 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; + A9D5C4CF142E5F7F0044ECF7 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; + A9D5C4D0142E5F7F0044ECF7 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; + A9D5C4D1142E5F7F0044ECF7 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; + A9D5C4D2142E5F7F0044ECF7 /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = ""; }; + A9D5C4D3142E5F7F0044ECF7 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; + A9D5C4D4142E5F7F0044ECF7 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; + A9D5C4D5142E5F7F0044ECF7 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; + A9D5C4D6142E5F7F0044ECF7 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; + A9D5C4D7142E5F7F0044ECF7 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; + A9D5C4D8142E5F7F0044ECF7 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; + A9D5C4D9142E5F7F0044ECF7 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; + A9D5C4DA142E5F7F0044ECF7 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; + A9D5C4DB142E5F7F0044ECF7 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; + A9D5C4DC142E5F7F0044ECF7 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; + A9D5C4DD142E5F7F0044ECF7 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; + A9D5C4DE142E5F7F0044ECF7 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; + A9D5C4DF142E5F7F0044ECF7 /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = ""; }; + A9D5C4E0142E5F7F0044ECF7 /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = ""; }; + A9D5C4E1142E5F7F0044ECF7 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; + A9D5C4E2142E5F7F0044ECF7 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; + A9D5C4E3142E5F7F0044ECF7 /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = ""; }; + A9D5C4E4142E5F7F0044ECF7 /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = ""; }; + A9D5C4E6142E5F7F0044ECF7 /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = ""; }; + A9D5C4E7142E5F7F0044ECF7 /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = ""; }; A9DEC1BF1046EFA60049C70C /* Love.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Love.icns; path = icons/Love.icns; sourceTree = ""; }; A9DEC1C01046EFA70049C70C /* LoveDocument.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = LoveDocument.icns; path = icons/LoveDocument.icns; sourceTree = ""; }; A9F16926109E7BAD00FC83D1 /* libmodplug.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libmodplug.framework; path = /Library/Frameworks/libmodplug.framework; sourceTree = ""; }; @@ -840,6 +842,7 @@ A93E69F410420ABF007D418B /* libraries */ = { isa = PBXGroup; children = ( + A9D5C484142E5F7F0044ECF7 /* Box2D */, A93E6A0210420ABF007D418B /* luasocket */, A944D58A13244E5D0039937C /* utf8 */, ); @@ -1216,7 +1219,6 @@ children = ( A93E6AEB10420AC7007D418B /* Body.cpp */, A93E6AEC10420AC7007D418B /* Body.h */, - A986EBC3132CE6D800F048C8 /* Box2D */, A9D1D2091422959100A8BC2F /* ChainShape.cpp */, A9D1D20B142295A800A8BC2F /* ChainShape.h */, A93E6AED10420AC7007D418B /* CircleShape.cpp */, @@ -1392,15 +1394,6 @@ path = utf8; sourceTree = ""; }; - A96F416214127E720067FE9A /* Rope */ = { - isa = PBXGroup; - children = ( - A96F416314127E720067FE9A /* b2Rope.cpp */, - A96F416414127E720067FE9A /* b2Rope.h */, - ); - path = Rope; - sourceTree = ""; - }; A986DEAF113249A700810279 /* thread */ = { isa = PBXGroup; children = ( @@ -1421,151 +1414,161 @@ path = sdl; sourceTree = ""; }; - A986EBC3132CE6D800F048C8 /* Box2D */ = { + A9D5C484142E5F7F0044ECF7 /* Box2D */ = { isa = PBXGroup; children = ( - A986ECAC132CE82F00F048C8 /* Box2D.h */, - A986EBC7132CE6D800F048C8 /* Collision */, - A986EBDA132CE6D800F048C8 /* Common */, - A986EBE3132CE6D800F048C8 /* Dynamics */, - A96F416214127E720067FE9A /* Rope */, + A9D5C485142E5F7F0044ECF7 /* Box2D.h */, + A9D5C486142E5F7F0044ECF7 /* Collision */, + A9D5C49F142E5F7F0044ECF7 /* Common */, + A9D5C4AD142E5F7F0044ECF7 /* Dynamics */, + A9D5C4E5142E5F7F0044ECF7 /* Rope */, ); path = Box2D; sourceTree = ""; }; - A986EBC7132CE6D800F048C8 /* Collision */ = { + A9D5C486142E5F7F0044ECF7 /* Collision */ = { isa = PBXGroup; children = ( - A986EBC8132CE6D800F048C8 /* b2BroadPhase.cpp */, - A986EBC9132CE6D800F048C8 /* b2BroadPhase.h */, - A986EBCA132CE6D800F048C8 /* b2CollideCircle.cpp */, - A96F416D14127EB20067FE9A /* b2CollideEdge.cpp */, - A986EBCB132CE6D800F048C8 /* b2CollidePolygon.cpp */, - A986EBCC132CE6D800F048C8 /* b2Collision.cpp */, - A986EBCD132CE6D800F048C8 /* b2Collision.h */, - A986EBCE132CE6D800F048C8 /* b2Distance.cpp */, - A986EBCF132CE6D800F048C8 /* b2Distance.h */, - A986EBD0132CE6D800F048C8 /* b2DynamicTree.cpp */, - A986EBD1132CE6D800F048C8 /* b2DynamicTree.h */, - A986EBD2132CE6D800F048C8 /* b2TimeOfImpact.cpp */, - A986EBD3132CE6D800F048C8 /* b2TimeOfImpact.h */, - A986EBD4132CE6D800F048C8 /* Shapes */, + A9D5C487142E5F7F0044ECF7 /* b2BroadPhase.cpp */, + A9D5C488142E5F7F0044ECF7 /* b2BroadPhase.h */, + A9D5C489142E5F7F0044ECF7 /* b2CollideCircle.cpp */, + A9D5C48A142E5F7F0044ECF7 /* b2CollideEdge.cpp */, + A9D5C48B142E5F7F0044ECF7 /* b2CollidePolygon.cpp */, + A9D5C48C142E5F7F0044ECF7 /* b2Collision.cpp */, + A9D5C48D142E5F7F0044ECF7 /* b2Collision.h */, + A9D5C48E142E5F7F0044ECF7 /* b2Distance.cpp */, + A9D5C48F142E5F7F0044ECF7 /* b2Distance.h */, + A9D5C490142E5F7F0044ECF7 /* b2DynamicTree.cpp */, + A9D5C491142E5F7F0044ECF7 /* b2DynamicTree.h */, + A9D5C492142E5F7F0044ECF7 /* b2TimeOfImpact.cpp */, + A9D5C493142E5F7F0044ECF7 /* b2TimeOfImpact.h */, + A9D5C494142E5F7F0044ECF7 /* Shapes */, ); path = Collision; sourceTree = ""; }; - A986EBD4132CE6D800F048C8 /* Shapes */ = { + A9D5C494142E5F7F0044ECF7 /* Shapes */ = { isa = PBXGroup; children = ( - A96F416F14127EC00067FE9A /* b2ChainShape.cpp */, - A96F417014127EC00067FE9A /* b2ChainShape.h */, - A986EBD5132CE6D800F048C8 /* b2CircleShape.cpp */, - A986EBD6132CE6D800F048C8 /* b2CircleShape.h */, - A96F417E14127FC20067FE9A /* b2EdgeShape.cpp */, - A96F417F14127FC20067FE9A /* b2EdgeShape.h */, - A986EBD7132CE6D800F048C8 /* b2PolygonShape.cpp */, - A986EBD8132CE6D800F048C8 /* b2PolygonShape.h */, - A986EBD9132CE6D800F048C8 /* b2Shape.h */, + A9D5C495142E5F7F0044ECF7 /* b2ChainShape.cpp */, + A9D5C496142E5F7F0044ECF7 /* b2ChainShape.h */, + A9D5C497142E5F7F0044ECF7 /* b2CircleShape.cpp */, + A9D5C498142E5F7F0044ECF7 /* b2CircleShape.h */, + A9D5C499142E5F7F0044ECF7 /* b2EdgeShape.cpp */, + A9D5C49A142E5F7F0044ECF7 /* b2EdgeShape.h */, + A9D5C49B142E5F7F0044ECF7 /* b2PolygonShape.cpp */, + A9D5C49C142E5F7F0044ECF7 /* b2PolygonShape.cpp.orig */, + A9D5C49D142E5F7F0044ECF7 /* b2PolygonShape.h */, + A9D5C49E142E5F7F0044ECF7 /* b2Shape.h */, ); path = Shapes; sourceTree = ""; }; - A986EBDA132CE6D800F048C8 /* Common */ = { + A9D5C49F142E5F7F0044ECF7 /* Common */ = { isa = PBXGroup; children = ( - A986EBDB132CE6D800F048C8 /* b2BlockAllocator.cpp */, - A986EBDC132CE6D800F048C8 /* b2BlockAllocator.h */, - A96F416614127E9C0067FE9A /* b2Draw.cpp */, - A96F416714127E9C0067FE9A /* b2Draw.h */, - A96F416814127E9C0067FE9A /* b2GrowableStack.h */, - A986EBDD132CE6D800F048C8 /* b2Math.cpp */, - A986EBDE132CE6D800F048C8 /* b2Math.h */, - A986EBDF132CE6D800F048C8 /* b2Settings.cpp */, - A986EBE0132CE6D800F048C8 /* b2Settings.h */, - A986EBE1132CE6D800F048C8 /* b2StackAllocator.cpp */, - A986EBE2132CE6D800F048C8 /* b2StackAllocator.h */, - A96F416914127E9C0067FE9A /* b2Timer.cpp */, - A96F416A14127E9C0067FE9A /* b2Timer.h */, + A9D5C4A0142E5F7F0044ECF7 /* b2BlockAllocator.cpp */, + A9D5C4A1142E5F7F0044ECF7 /* b2BlockAllocator.h */, + A9D5C4A2142E5F7F0044ECF7 /* b2Draw.cpp */, + A9D5C4A3142E5F7F0044ECF7 /* b2Draw.h */, + A9D5C4A4142E5F7F0044ECF7 /* b2GrowableStack.h */, + A9D5C4A5142E5F7F0044ECF7 /* b2Math.cpp */, + A9D5C4A6142E5F7F0044ECF7 /* b2Math.h */, + A9D5C4A7142E5F7F0044ECF7 /* b2Settings.cpp */, + A9D5C4A8142E5F7F0044ECF7 /* b2Settings.h */, + A9D5C4A9142E5F7F0044ECF7 /* b2StackAllocator.cpp */, + A9D5C4AA142E5F7F0044ECF7 /* b2StackAllocator.h */, + A9D5C4AB142E5F7F0044ECF7 /* b2Timer.cpp */, + A9D5C4AC142E5F7F0044ECF7 /* b2Timer.h */, ); path = Common; sourceTree = ""; }; - A986EBE3132CE6D800F048C8 /* Dynamics */ = { + A9D5C4AD142E5F7F0044ECF7 /* Dynamics */ = { isa = PBXGroup; children = ( - A986EBE4132CE6D800F048C8 /* b2Body.cpp */, - A986EBE5132CE6D800F048C8 /* b2Body.h */, - A986EBE6132CE6D800F048C8 /* b2ContactManager.cpp */, - A986EBE7132CE6D800F048C8 /* b2ContactManager.h */, - A986EBE8132CE6D800F048C8 /* b2Fixture.cpp */, - A986EBE9132CE6D800F048C8 /* b2Fixture.h */, - A986EBEA132CE6D800F048C8 /* b2Island.cpp */, - A986EBEB132CE6D800F048C8 /* b2Island.h */, - A986EBEC132CE6D800F048C8 /* b2TimeStep.h */, - A986EBED132CE6D800F048C8 /* b2World.cpp */, - A986EBEE132CE6D800F048C8 /* b2World.h */, - A986EBEF132CE6D800F048C8 /* b2WorldCallbacks.cpp */, - A986EBF0132CE6D800F048C8 /* b2WorldCallbacks.h */, - A986EBF1132CE6D800F048C8 /* Contacts */, - A986EBFE132CE6D800F048C8 /* Joints */, + A9D5C4AE142E5F7F0044ECF7 /* b2Body.cpp */, + A9D5C4AF142E5F7F0044ECF7 /* b2Body.h */, + A9D5C4B0142E5F7F0044ECF7 /* b2ContactManager.cpp */, + A9D5C4B1142E5F7F0044ECF7 /* b2ContactManager.h */, + A9D5C4B2142E5F7F0044ECF7 /* b2Fixture.cpp */, + A9D5C4B3142E5F7F0044ECF7 /* b2Fixture.h */, + A9D5C4B4142E5F7F0044ECF7 /* b2Island.cpp */, + A9D5C4B5142E5F7F0044ECF7 /* b2Island.h */, + A9D5C4B6142E5F7F0044ECF7 /* b2TimeStep.h */, + A9D5C4B7142E5F7F0044ECF7 /* b2World.cpp */, + A9D5C4B8142E5F7F0044ECF7 /* b2World.h */, + A9D5C4B9142E5F7F0044ECF7 /* b2WorldCallbacks.cpp */, + A9D5C4BA142E5F7F0044ECF7 /* b2WorldCallbacks.h */, + A9D5C4BB142E5F7F0044ECF7 /* Contacts */, + A9D5C4CE142E5F7F0044ECF7 /* Joints */, ); path = Dynamics; sourceTree = ""; }; - A986EBF1132CE6D800F048C8 /* Contacts */ = { + A9D5C4BB142E5F7F0044ECF7 /* Contacts */ = { isa = PBXGroup; children = ( - A96F417214127EE70067FE9A /* b2ChainAndCircleContact.cpp */, - A96F417314127EE70067FE9A /* b2ChainAndCircleContact.h */, - A96F417414127EE70067FE9A /* b2ChainAndPolygonContact.cpp */, - A96F417514127EE70067FE9A /* b2ChainAndPolygonContact.h */, - A986EBF2132CE6D800F048C8 /* b2CircleContact.cpp */, - A986EBF3132CE6D800F048C8 /* b2CircleContact.h */, - A986EBF4132CE6D800F048C8 /* b2Contact.cpp */, - A986EBF5132CE6D800F048C8 /* b2Contact.h */, - A986EBF6132CE6D800F048C8 /* b2ContactSolver.cpp */, - A986EBF7132CE6D800F048C8 /* b2ContactSolver.h */, - A96F417814127EFD0067FE9A /* b2EdgeAndCircleContact.cpp */, - A96F417914127EFD0067FE9A /* b2EdgeAndCircleContact.h */, - A96F417A14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp */, - A96F417B14127EFD0067FE9A /* b2EdgeAndPolygonContact.h */, - A986EBF8132CE6D800F048C8 /* b2PolygonAndCircleContact.cpp */, - A986EBF9132CE6D800F048C8 /* b2PolygonAndCircleContact.h */, - A986EBFA132CE6D800F048C8 /* b2PolygonContact.cpp */, - A986EBFB132CE6D800F048C8 /* b2PolygonContact.h */, + A9D5C4BC142E5F7F0044ECF7 /* b2ChainAndCircleContact.cpp */, + A9D5C4BD142E5F7F0044ECF7 /* b2ChainAndCircleContact.h */, + A9D5C4BE142E5F7F0044ECF7 /* b2ChainAndPolygonContact.cpp */, + A9D5C4BF142E5F7F0044ECF7 /* b2ChainAndPolygonContact.h */, + A9D5C4C0142E5F7F0044ECF7 /* b2CircleContact.cpp */, + A9D5C4C1142E5F7F0044ECF7 /* b2CircleContact.h */, + A9D5C4C2142E5F7F0044ECF7 /* b2Contact.cpp */, + A9D5C4C3142E5F7F0044ECF7 /* b2Contact.h */, + A9D5C4C4142E5F7F0044ECF7 /* b2ContactSolver.cpp */, + A9D5C4C5142E5F7F0044ECF7 /* b2ContactSolver.h */, + A9D5C4C6142E5F7F0044ECF7 /* b2EdgeAndCircleContact.cpp */, + A9D5C4C7142E5F7F0044ECF7 /* b2EdgeAndCircleContact.h */, + A9D5C4C8142E5F7F0044ECF7 /* b2EdgeAndPolygonContact.cpp */, + A9D5C4C9142E5F7F0044ECF7 /* b2EdgeAndPolygonContact.h */, + A9D5C4CA142E5F7F0044ECF7 /* b2PolygonAndCircleContact.cpp */, + A9D5C4CB142E5F7F0044ECF7 /* b2PolygonAndCircleContact.h */, + A9D5C4CC142E5F7F0044ECF7 /* b2PolygonContact.cpp */, + A9D5C4CD142E5F7F0044ECF7 /* b2PolygonContact.h */, ); path = Contacts; sourceTree = ""; }; - A986EBFE132CE6D800F048C8 /* Joints */ = { + A9D5C4CE142E5F7F0044ECF7 /* Joints */ = { isa = PBXGroup; children = ( - A986EBFF132CE6D800F048C8 /* b2DistanceJoint.cpp */, - A986EC00132CE6D800F048C8 /* b2DistanceJoint.h */, - A986EC01132CE6D800F048C8 /* b2FrictionJoint.cpp */, - A986EC02132CE6D800F048C8 /* b2FrictionJoint.h */, - A986EC03132CE6D800F048C8 /* b2GearJoint.cpp */, - A986EC04132CE6D800F048C8 /* b2GearJoint.h */, - A986EC05132CE6D800F048C8 /* b2Joint.cpp */, - A986EC06132CE6D800F048C8 /* b2Joint.h */, - A986EC09132CE6D800F048C8 /* b2MouseJoint.cpp */, - A986EC0A132CE6D800F048C8 /* b2MouseJoint.h */, - A986EC0B132CE6D800F048C8 /* b2PrismaticJoint.cpp */, - A986EC0C132CE6D800F048C8 /* b2PrismaticJoint.h */, - A986EC0D132CE6D800F048C8 /* b2PulleyJoint.cpp */, - A986EC0E132CE6D800F048C8 /* b2PulleyJoint.h */, - A986EC0F132CE6D800F048C8 /* b2RevoluteJoint.cpp */, - A986EC10132CE6D800F048C8 /* b2RevoluteJoint.h */, - A96F415C14127E310067FE9A /* b2RopeJoint.cpp */, - A96F415D14127E320067FE9A /* b2RopeJoint.h */, - A986EC11132CE6D800F048C8 /* b2WeldJoint.cpp */, - A986EC12132CE6D800F048C8 /* b2WeldJoint.h */, - A96F415E14127E320067FE9A /* b2WheelJoint.cpp */, - A96F415F14127E320067FE9A /* b2WheelJoint.h */, + A9D5C4CF142E5F7F0044ECF7 /* b2DistanceJoint.cpp */, + A9D5C4D0142E5F7F0044ECF7 /* b2DistanceJoint.h */, + A9D5C4D1142E5F7F0044ECF7 /* b2FrictionJoint.cpp */, + A9D5C4D2142E5F7F0044ECF7 /* b2FrictionJoint.h */, + A9D5C4D3142E5F7F0044ECF7 /* b2GearJoint.cpp */, + A9D5C4D4142E5F7F0044ECF7 /* b2GearJoint.h */, + A9D5C4D5142E5F7F0044ECF7 /* b2Joint.cpp */, + A9D5C4D6142E5F7F0044ECF7 /* b2Joint.h */, + A9D5C4D7142E5F7F0044ECF7 /* b2MouseJoint.cpp */, + A9D5C4D8142E5F7F0044ECF7 /* b2MouseJoint.h */, + A9D5C4D9142E5F7F0044ECF7 /* b2PrismaticJoint.cpp */, + A9D5C4DA142E5F7F0044ECF7 /* b2PrismaticJoint.h */, + A9D5C4DB142E5F7F0044ECF7 /* b2PulleyJoint.cpp */, + A9D5C4DC142E5F7F0044ECF7 /* b2PulleyJoint.h */, + A9D5C4DD142E5F7F0044ECF7 /* b2RevoluteJoint.cpp */, + A9D5C4DE142E5F7F0044ECF7 /* b2RevoluteJoint.h */, + A9D5C4DF142E5F7F0044ECF7 /* b2RopeJoint.cpp */, + A9D5C4E0142E5F7F0044ECF7 /* b2RopeJoint.h */, + A9D5C4E1142E5F7F0044ECF7 /* b2WeldJoint.cpp */, + A9D5C4E2142E5F7F0044ECF7 /* b2WeldJoint.h */, + A9D5C4E3142E5F7F0044ECF7 /* b2WheelJoint.cpp */, + A9D5C4E4142E5F7F0044ECF7 /* b2WheelJoint.h */, ); path = Joints; sourceTree = ""; }; + A9D5C4E5142E5F7F0044ECF7 /* Rope */ = { + isa = PBXGroup; + children = ( + A9D5C4E6142E5F7F0044ECF7 /* b2Rope.cpp */, + A9D5C4E7142E5F7F0044ECF7 /* b2Rope.h */, + ); + path = Rope; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1622,6 +1625,7 @@ files = ( A9DEC1C11046EFA70049C70C /* Love.icns in Resources */, A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */, + A9D5C4F4142E5F7F0044ECF7 /* b2PolygonShape.cpp.orig in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1764,54 +1768,9 @@ A9BD60741226C988007DEC63 /* Framebuffer.cpp in Sources */, A9BD60751226C988007DEC63 /* wrap_Framebuffer.cpp in Sources */, A95684F7125D3555001B276B /* b64.cpp in Sources */, - A986EC64132CE6DB00F048C8 /* b2BroadPhase.cpp in Sources */, - A986EC65132CE6DB00F048C8 /* b2CollideCircle.cpp in Sources */, - A986EC66132CE6DB00F048C8 /* b2CollidePolygon.cpp in Sources */, - A986EC67132CE6DB00F048C8 /* b2Collision.cpp in Sources */, - A986EC68132CE6DB00F048C8 /* b2Distance.cpp in Sources */, - A986EC69132CE6DB00F048C8 /* b2DynamicTree.cpp in Sources */, - A986EC6A132CE6DB00F048C8 /* b2TimeOfImpact.cpp in Sources */, - A986EC6B132CE6DB00F048C8 /* b2CircleShape.cpp in Sources */, - A986EC6C132CE6DB00F048C8 /* b2PolygonShape.cpp in Sources */, - A986EC6D132CE6DB00F048C8 /* b2BlockAllocator.cpp in Sources */, - A986EC6E132CE6DB00F048C8 /* b2Math.cpp in Sources */, - A986EC6F132CE6DB00F048C8 /* b2Settings.cpp in Sources */, - A986EC70132CE6DB00F048C8 /* b2StackAllocator.cpp in Sources */, - A986EC71132CE6DB00F048C8 /* b2Body.cpp in Sources */, - A986EC72132CE6DB00F048C8 /* b2ContactManager.cpp in Sources */, - A986EC73132CE6DB00F048C8 /* b2Fixture.cpp in Sources */, - A986EC74132CE6DB00F048C8 /* b2Island.cpp in Sources */, - A986EC75132CE6DB00F048C8 /* b2World.cpp in Sources */, - A986EC76132CE6DB00F048C8 /* b2WorldCallbacks.cpp in Sources */, - A986EC77132CE6DB00F048C8 /* b2CircleContact.cpp in Sources */, - A986EC78132CE6DB00F048C8 /* b2Contact.cpp in Sources */, - A986EC79132CE6DB00F048C8 /* b2ContactSolver.cpp in Sources */, - A986EC7A132CE6DB00F048C8 /* b2PolygonAndCircleContact.cpp in Sources */, - A986EC7B132CE6DB00F048C8 /* b2PolygonContact.cpp in Sources */, - A986EC7D132CE6DB00F048C8 /* b2DistanceJoint.cpp in Sources */, - A986EC7E132CE6DB00F048C8 /* b2FrictionJoint.cpp in Sources */, - A986EC7F132CE6DB00F048C8 /* b2GearJoint.cpp in Sources */, - A986EC80132CE6DB00F048C8 /* b2Joint.cpp in Sources */, - A986EC82132CE6DB00F048C8 /* b2MouseJoint.cpp in Sources */, - A986EC83132CE6DB00F048C8 /* b2PrismaticJoint.cpp in Sources */, - A986EC84132CE6DB00F048C8 /* b2PulleyJoint.cpp in Sources */, - A986EC85132CE6DB00F048C8 /* b2RevoluteJoint.cpp in Sources */, - A986EC86132CE6DB00F048C8 /* b2WeldJoint.cpp in Sources */, A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */, A9B6432C13BF83AB00DC3C7E /* FrictionJoint.cpp in Sources */, A9B6432F13BF87F100DC3C7E /* wrap_FrictionJoint.cpp in Sources */, - A96F416014127E340067FE9A /* b2RopeJoint.cpp in Sources */, - A96F416114127E340067FE9A /* b2WheelJoint.cpp in Sources */, - A96F416514127E720067FE9A /* b2Rope.cpp in Sources */, - A96F416B14127E9C0067FE9A /* b2Draw.cpp in Sources */, - A96F416C14127E9C0067FE9A /* b2Timer.cpp in Sources */, - A96F416E14127EB20067FE9A /* b2CollideEdge.cpp in Sources */, - A96F417114127EC00067FE9A /* b2ChainShape.cpp in Sources */, - A96F417614127EE70067FE9A /* b2ChainAndCircleContact.cpp in Sources */, - A96F417714127EE70067FE9A /* b2ChainAndPolygonContact.cpp in Sources */, - A96F417C14127EFD0067FE9A /* b2EdgeAndCircleContact.cpp in Sources */, - A96F417D14127EFD0067FE9A /* b2EdgeAndPolygonContact.cpp in Sources */, - A96F418014127FC20067FE9A /* b2EdgeShape.cpp in Sources */, A96F41831412AFE20067FE9A /* wrap_WeldJoint.cpp in Sources */, A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */, A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */, @@ -1825,6 +1784,51 @@ A958F911142D364C007F320F /* wrap_Fixture.cpp in Sources */, A958F917142D6B3A007F320F /* Body.cpp in Sources */, A9D5C47D142E32EE0044ECF7 /* Memoizer.cpp in Sources */, + A9D5C4E8142E5F7F0044ECF7 /* b2BroadPhase.cpp in Sources */, + A9D5C4E9142E5F7F0044ECF7 /* b2CollideCircle.cpp in Sources */, + A9D5C4EA142E5F7F0044ECF7 /* b2CollideEdge.cpp in Sources */, + A9D5C4EB142E5F7F0044ECF7 /* b2CollidePolygon.cpp in Sources */, + A9D5C4EC142E5F7F0044ECF7 /* b2Collision.cpp in Sources */, + A9D5C4ED142E5F7F0044ECF7 /* b2Distance.cpp in Sources */, + A9D5C4EE142E5F7F0044ECF7 /* b2DynamicTree.cpp in Sources */, + A9D5C4EF142E5F7F0044ECF7 /* b2TimeOfImpact.cpp in Sources */, + A9D5C4F0142E5F7F0044ECF7 /* b2ChainShape.cpp in Sources */, + A9D5C4F1142E5F7F0044ECF7 /* b2CircleShape.cpp in Sources */, + A9D5C4F2142E5F7F0044ECF7 /* b2EdgeShape.cpp in Sources */, + A9D5C4F3142E5F7F0044ECF7 /* b2PolygonShape.cpp in Sources */, + A9D5C4F5142E5F7F0044ECF7 /* b2BlockAllocator.cpp in Sources */, + A9D5C4F6142E5F7F0044ECF7 /* b2Draw.cpp in Sources */, + A9D5C4F7142E5F7F0044ECF7 /* b2Math.cpp in Sources */, + A9D5C4F8142E5F7F0044ECF7 /* b2Settings.cpp in Sources */, + A9D5C4F9142E5F7F0044ECF7 /* b2StackAllocator.cpp in Sources */, + A9D5C4FA142E5F7F0044ECF7 /* b2Timer.cpp in Sources */, + A9D5C4FB142E5F7F0044ECF7 /* b2Body.cpp in Sources */, + A9D5C4FC142E5F7F0044ECF7 /* b2ContactManager.cpp in Sources */, + A9D5C4FD142E5F7F0044ECF7 /* b2Fixture.cpp in Sources */, + A9D5C4FE142E5F7F0044ECF7 /* b2Island.cpp in Sources */, + A9D5C4FF142E5F7F0044ECF7 /* b2World.cpp in Sources */, + A9D5C500142E5F7F0044ECF7 /* b2WorldCallbacks.cpp in Sources */, + A9D5C501142E5F7F0044ECF7 /* b2ChainAndCircleContact.cpp in Sources */, + A9D5C502142E5F7F0044ECF7 /* b2ChainAndPolygonContact.cpp in Sources */, + A9D5C503142E5F7F0044ECF7 /* b2CircleContact.cpp in Sources */, + A9D5C504142E5F7F0044ECF7 /* b2Contact.cpp in Sources */, + A9D5C505142E5F7F0044ECF7 /* b2ContactSolver.cpp in Sources */, + A9D5C506142E5F7F0044ECF7 /* b2EdgeAndCircleContact.cpp in Sources */, + A9D5C507142E5F7F0044ECF7 /* b2EdgeAndPolygonContact.cpp in Sources */, + A9D5C508142E5F7F0044ECF7 /* b2PolygonAndCircleContact.cpp in Sources */, + A9D5C509142E5F7F0044ECF7 /* b2PolygonContact.cpp in Sources */, + A9D5C50A142E5F7F0044ECF7 /* b2DistanceJoint.cpp in Sources */, + A9D5C50B142E5F7F0044ECF7 /* b2FrictionJoint.cpp in Sources */, + A9D5C50C142E5F7F0044ECF7 /* b2GearJoint.cpp in Sources */, + A9D5C50D142E5F7F0044ECF7 /* b2Joint.cpp in Sources */, + A9D5C50E142E5F7F0044ECF7 /* b2MouseJoint.cpp in Sources */, + A9D5C50F142E5F7F0044ECF7 /* b2PrismaticJoint.cpp in Sources */, + A9D5C510142E5F7F0044ECF7 /* b2PulleyJoint.cpp in Sources */, + A9D5C511142E5F7F0044ECF7 /* b2RevoluteJoint.cpp in Sources */, + A9D5C512142E5F7F0044ECF7 /* b2RopeJoint.cpp in Sources */, + A9D5C513142E5F7F0044ECF7 /* b2WeldJoint.cpp in Sources */, + A9D5C514142E5F7F0044ECF7 /* b2WheelJoint.cpp in Sources */, + A9D5C515142E5F7F0044ECF7 /* b2Rope.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1846,14 +1850,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = love_Prefix.pch; - HEADER_SEARCH_PATHS = ( - /Library/Frameworks/Lua.framework/Headers, - /Library/Frameworks/FreeType.framework/Headers, - /Library/Frameworks/SDL.framework/Headers, - ../../src, - ../../src/modules, - ../../src/modules/physics/box2d, - ); INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -1875,14 +1871,6 @@ GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = love_Prefix.pch; - HEADER_SEARCH_PATHS = ( - /Library/Frameworks/Lua.framework/Headers, - /Library/Frameworks/FreeType.framework/Headers, - /Library/Frameworks/SDL.framework/Headers, - ../../src, - ../../src/modules, - ../../src/modules/physics/box2d, - ); INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -1897,6 +1885,7 @@ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; @@ -1924,11 +1913,12 @@ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( + "\"$(SRCROOT)/../../src\"", + "\"$(SRCROOT)/../../src/libraries\"", + "\"$(SRCROOT)/../../src/modules\"", /Library/Frameworks/Lua.framework/Headers, /Library/Frameworks/FreeType.framework/Headers, /Library/Frameworks/SDL.framework/Headers, - ../../src, - ../../src/modules, ); INFOPLIST_FILE = "love-Info.plist"; LIBRARY_SEARCH_PATHS = ""; @@ -1949,6 +1939,7 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; DEPLOYMENT_POSTPROCESSING = NO; FRAMEWORK_SEARCH_PATHS = ""; @@ -1978,11 +1969,12 @@ GCC_WARN_UNUSED_VALUE = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( + "\"$(SRCROOT)/../../src\"", + "\"$(SRCROOT)/../../src/libraries\"", + "\"$(SRCROOT)/../../src/modules\"", /Library/Frameworks/Lua.framework/Headers, /Library/Frameworks/FreeType.framework/Headers, /Library/Frameworks/SDL.framework/Headers, - ../../src, - ../../src/modules, ); INFOPLIST_FILE = "love-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; diff --git a/src/modules/physics/box2d/Box2D/Box2D.h b/src/libraries/Box2D/Box2D.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Box2D.h rename to src/libraries/Box2D/Box2D.h diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp b/src/libraries/Box2D/Collision/Shapes/b2ChainShape.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp rename to src/libraries/Box2D/Collision/Shapes/b2ChainShape.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h b/src/libraries/Box2D/Collision/Shapes/b2ChainShape.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2ChainShape.h rename to src/libraries/Box2D/Collision/Shapes/b2ChainShape.h diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp b/src/libraries/Box2D/Collision/Shapes/b2CircleShape.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp rename to src/libraries/Box2D/Collision/Shapes/b2CircleShape.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h b/src/libraries/Box2D/Collision/Shapes/b2CircleShape.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2CircleShape.h rename to src/libraries/Box2D/Collision/Shapes/b2CircleShape.h diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.cpp b/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.cpp rename to src/libraries/Box2D/Collision/Shapes/b2EdgeShape.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h b/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2EdgeShape.h rename to src/libraries/Box2D/Collision/Shapes/b2EdgeShape.h diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp b/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp rename to src/libraries/Box2D/Collision/Shapes/b2PolygonShape.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h b/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2PolygonShape.h rename to src/libraries/Box2D/Collision/Shapes/b2PolygonShape.h diff --git a/src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h b/src/libraries/Box2D/Collision/Shapes/b2Shape.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/Shapes/b2Shape.h rename to src/libraries/Box2D/Collision/Shapes/b2Shape.h diff --git a/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp b/src/libraries/Box2D/Collision/b2BroadPhase.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.cpp rename to src/libraries/Box2D/Collision/b2BroadPhase.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h b/src/libraries/Box2D/Collision/b2BroadPhase.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2BroadPhase.h rename to src/libraries/Box2D/Collision/b2BroadPhase.h diff --git a/src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp b/src/libraries/Box2D/Collision/b2CollideCircle.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2CollideCircle.cpp rename to src/libraries/Box2D/Collision/b2CollideCircle.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2CollideEdge.cpp b/src/libraries/Box2D/Collision/b2CollideEdge.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2CollideEdge.cpp rename to src/libraries/Box2D/Collision/b2CollideEdge.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp b/src/libraries/Box2D/Collision/b2CollidePolygon.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2CollidePolygon.cpp rename to src/libraries/Box2D/Collision/b2CollidePolygon.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp b/src/libraries/Box2D/Collision/b2Collision.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2Collision.cpp rename to src/libraries/Box2D/Collision/b2Collision.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Collision.h b/src/libraries/Box2D/Collision/b2Collision.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2Collision.h rename to src/libraries/Box2D/Collision/b2Collision.h diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp b/src/libraries/Box2D/Collision/b2Distance.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2Distance.cpp rename to src/libraries/Box2D/Collision/b2Distance.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2Distance.h b/src/libraries/Box2D/Collision/b2Distance.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2Distance.h rename to src/libraries/Box2D/Collision/b2Distance.h diff --git a/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp b/src/libraries/Box2D/Collision/b2DynamicTree.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.cpp rename to src/libraries/Box2D/Collision/b2DynamicTree.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h b/src/libraries/Box2D/Collision/b2DynamicTree.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2DynamicTree.h rename to src/libraries/Box2D/Collision/b2DynamicTree.h diff --git a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp b/src/libraries/Box2D/Collision/b2TimeOfImpact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.cpp rename to src/libraries/Box2D/Collision/b2TimeOfImpact.cpp diff --git a/src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h b/src/libraries/Box2D/Collision/b2TimeOfImpact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Collision/b2TimeOfImpact.h rename to src/libraries/Box2D/Collision/b2TimeOfImpact.h diff --git a/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp b/src/libraries/Box2D/Common/b2BlockAllocator.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.cpp rename to src/libraries/Box2D/Common/b2BlockAllocator.cpp diff --git a/src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h b/src/libraries/Box2D/Common/b2BlockAllocator.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2BlockAllocator.h rename to src/libraries/Box2D/Common/b2BlockAllocator.h diff --git a/src/modules/physics/box2d/Box2D/Common/b2Draw.cpp b/src/libraries/Box2D/Common/b2Draw.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Draw.cpp rename to src/libraries/Box2D/Common/b2Draw.cpp diff --git a/src/modules/physics/box2d/Box2D/Common/b2Draw.h b/src/libraries/Box2D/Common/b2Draw.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Draw.h rename to src/libraries/Box2D/Common/b2Draw.h diff --git a/src/modules/physics/box2d/Box2D/Common/b2GrowableStack.h b/src/libraries/Box2D/Common/b2GrowableStack.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2GrowableStack.h rename to src/libraries/Box2D/Common/b2GrowableStack.h diff --git a/src/modules/physics/box2d/Box2D/Common/b2Math.cpp b/src/libraries/Box2D/Common/b2Math.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Math.cpp rename to src/libraries/Box2D/Common/b2Math.cpp diff --git a/src/modules/physics/box2d/Box2D/Common/b2Math.h b/src/libraries/Box2D/Common/b2Math.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Math.h rename to src/libraries/Box2D/Common/b2Math.h diff --git a/src/modules/physics/box2d/Box2D/Common/b2Settings.cpp b/src/libraries/Box2D/Common/b2Settings.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Settings.cpp rename to src/libraries/Box2D/Common/b2Settings.cpp diff --git a/src/modules/physics/box2d/Box2D/Common/b2Settings.h b/src/libraries/Box2D/Common/b2Settings.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Settings.h rename to src/libraries/Box2D/Common/b2Settings.h diff --git a/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp b/src/libraries/Box2D/Common/b2StackAllocator.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2StackAllocator.cpp rename to src/libraries/Box2D/Common/b2StackAllocator.cpp diff --git a/src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h b/src/libraries/Box2D/Common/b2StackAllocator.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2StackAllocator.h rename to src/libraries/Box2D/Common/b2StackAllocator.h diff --git a/src/modules/physics/box2d/Box2D/Common/b2Timer.cpp b/src/libraries/Box2D/Common/b2Timer.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Timer.cpp rename to src/libraries/Box2D/Common/b2Timer.cpp diff --git a/src/modules/physics/box2d/Box2D/Common/b2Timer.h b/src/libraries/Box2D/Common/b2Timer.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Common/b2Timer.h rename to src/libraries/Box2D/Common/b2Timer.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h b/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h b/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h b/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2Contact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2Contact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h b/src/libraries/Box2D/Dynamics/Contacts/b2Contact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2Contact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2Contact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h b/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h rename to src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h b/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h b/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h b/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp b/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp rename to src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h b/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h rename to src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2GearJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2GearJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2GearJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2Joint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2Joint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h b/src/libraries/Box2D/Dynamics/Joints/b2Joint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2Joint.h rename to src/libraries/Box2D/Dynamics/Joints/b2Joint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp b/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp rename to src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h b/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h rename to src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp b/src/libraries/Box2D/Dynamics/b2Body.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2Body.cpp rename to src/libraries/Box2D/Dynamics/b2Body.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Body.h b/src/libraries/Box2D/Dynamics/b2Body.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2Body.h rename to src/libraries/Box2D/Dynamics/b2Body.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp b/src/libraries/Box2D/Dynamics/b2ContactManager.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.cpp rename to src/libraries/Box2D/Dynamics/b2ContactManager.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h b/src/libraries/Box2D/Dynamics/b2ContactManager.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2ContactManager.h rename to src/libraries/Box2D/Dynamics/b2ContactManager.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp b/src/libraries/Box2D/Dynamics/b2Fixture.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.cpp rename to src/libraries/Box2D/Dynamics/b2Fixture.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h b/src/libraries/Box2D/Dynamics/b2Fixture.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2Fixture.h rename to src/libraries/Box2D/Dynamics/b2Fixture.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp b/src/libraries/Box2D/Dynamics/b2Island.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2Island.cpp rename to src/libraries/Box2D/Dynamics/b2Island.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2Island.h b/src/libraries/Box2D/Dynamics/b2Island.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2Island.h rename to src/libraries/Box2D/Dynamics/b2Island.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h b/src/libraries/Box2D/Dynamics/b2TimeStep.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2TimeStep.h rename to src/libraries/Box2D/Dynamics/b2TimeStep.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp b/src/libraries/Box2D/Dynamics/b2World.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2World.cpp rename to src/libraries/Box2D/Dynamics/b2World.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2World.h b/src/libraries/Box2D/Dynamics/b2World.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2World.h rename to src/libraries/Box2D/Dynamics/b2World.h diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp b/src/libraries/Box2D/Dynamics/b2WorldCallbacks.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp rename to src/libraries/Box2D/Dynamics/b2WorldCallbacks.cpp diff --git a/src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h b/src/libraries/Box2D/Dynamics/b2WorldCallbacks.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Dynamics/b2WorldCallbacks.h rename to src/libraries/Box2D/Dynamics/b2WorldCallbacks.h diff --git a/src/modules/physics/box2d/Box2D/Rope/b2Rope.cpp b/src/libraries/Box2D/Rope/b2Rope.cpp similarity index 100% rename from src/modules/physics/box2d/Box2D/Rope/b2Rope.cpp rename to src/libraries/Box2D/Rope/b2Rope.cpp diff --git a/src/modules/physics/box2d/Box2D/Rope/b2Rope.h b/src/libraries/Box2D/Rope/b2Rope.h similarity index 100% rename from src/modules/physics/box2d/Box2D/Rope/b2Rope.h rename to src/libraries/Box2D/Rope/b2Rope.h From e2b832015b3db75310ad20b1fb3edf20b9f402b4 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 16:15:09 -0400 Subject: [PATCH 215/384] Add World:queryBoundingBox --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 43 +++++++++++++++++++++++- src/modules/physics/box2d/World.h | 15 +++++++++ src/modules/physics/box2d/wrap_World.cpp | 8 +++++ src/modules/physics/box2d/wrap_World.h | 1 + 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 110a1b80a..7d6671767 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -142,6 +142,32 @@ namespace box2d } 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!"); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); + lua_call(L, 1, 1); + return luax_toboolean(L, -1); + } + return true; + } World::World() : world(NULL) @@ -176,7 +202,6 @@ namespace box2d { world->Step(dt, 8, 6); - begin.process(); end.process(); presolve.process(); @@ -298,6 +323,22 @@ namespace box2d { 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; + } } // box2d } // physics diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 1798372af..f2508a6c5 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -86,6 +86,15 @@ namespace box2d ~ContactFilter(); bool process(Fixture * a, Fixture * b); }; + + class QueryCallback : public b2QueryCallback + { + public: + Reference * ref; + QueryCallback(); + ~QueryCallback(); + virtual bool ReportFixture(b2Fixture * fixture); + }; private: @@ -98,6 +107,7 @@ namespace box2d // Contact callbacks. ContactCallback begin, end, presolve, postsolve; ContactFilter filter; + QueryCallback query; public: @@ -200,6 +210,11 @@ namespace box2d * @return The ground body. **/ b2Body * getGroundBody(); + + /** + * Gets all fixtures that overlap a given bounding box. + **/ + int queryBoundingBox(lua_State * L); }; diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index febfcfcb4..39b846e15 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -112,6 +112,13 @@ namespace box2d lua_pushinteger(L, t->getJointCount()); return 1; } + + int w_World_queryBoundingBox(lua_State * L) + { + World * t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->queryBoundingBox(L); + } static const luaL_Reg functions[] = { { "update", w_World_update }, @@ -125,6 +132,7 @@ namespace box2d { "getAllowSleeping", w_World_getAllowSleeping }, { "getBodyCount", w_World_getBodyCount }, { "getJointCount", w_World_getJointCount }, + { "queryBoundingBox", w_World_queryBoundingBox }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index 372928c22..4c2192842 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -43,6 +43,7 @@ namespace box2d int w_World_getAllowSleeping(lua_State * L); int w_World_getBodyCount(lua_State * L); int w_World_getJointCount(lua_State * L); + int w_World_queryBoundingBox(lua_State * L); int luaopen_world(lua_State * L); } // box2d From f852c9bac2181a8c44a102419b3de9293da53faa Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 16:26:41 -0400 Subject: [PATCH 216/384] Add World:rayCast --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 48 ++++++++++++++++++++++++ src/modules/physics/box2d/World.h | 15 ++++++++ src/modules/physics/box2d/wrap_World.cpp | 8 ++++ src/modules/physics/box2d/wrap_World.h | 1 + 4 files changed, 72 insertions(+) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 7d6671767..9f1cf7f76 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -168,6 +168,39 @@ namespace box2d } 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!"); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); + b2Vec2 scaledPoint = Physics::scaleUp(point); + lua_pushnumber(L, scaledPoint.x); + lua_pushnumber(L, scaledPoint.y); + b2Vec2 scaledNormal = Physics::scaleUp(normal); + lua_pushnumber(L, scaledNormal.x); + lua_pushnumber(L, scaledNormal.y); + lua_pushnumber(L, fraction); + lua_call(L, 6, 1); + return (float32)luaL_checknumber(L, -1); + } + return 0; + } World::World() : world(NULL) @@ -339,6 +372,21 @@ namespace box2d 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; + } } // box2d } // physics diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index f2508a6c5..76d84fd98 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -95,6 +95,15 @@ namespace box2d ~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); + }; private: @@ -108,6 +117,7 @@ namespace box2d ContactCallback begin, end, presolve, postsolve; ContactFilter filter; QueryCallback query; + RayCastCallback raycast; public: @@ -215,6 +225,11 @@ namespace box2d * 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); }; diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index 39b846e15..9fe819f3f 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -119,6 +119,13 @@ namespace box2d 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); + return t->rayCast(L); + } static const luaL_Reg functions[] = { { "update", w_World_update }, @@ -133,6 +140,7 @@ namespace box2d { "getBodyCount", w_World_getBodyCount }, { "getJointCount", w_World_getJointCount }, { "queryBoundingBox", w_World_queryBoundingBox }, + { "rayCast", w_World_rayCast }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index 4c2192842..3fddb8ec6 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -44,6 +44,7 @@ namespace box2d int w_World_getBodyCount(lua_State * L); int w_World_getJointCount(lua_State * L); int w_World_queryBoundingBox(lua_State * L); + int w_World_rayCast(lua_State * L); int luaopen_world(lua_State * L); } // box2d From 6a0c5b485b31a1013e728e120d0e087a3eee1aa0 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 16:46:07 -0400 Subject: [PATCH 217/384] Memoize Contacts, and add List-fetching functions to World (they return arrays) --HG-- branch : box2d-update --- src/modules/physics/box2d/Contact.cpp | 4 ++ src/modules/physics/box2d/World.cpp | 50 ++++++++++++++++++++++++ src/modules/physics/box2d/World.h | 24 ++++++++++++ src/modules/physics/box2d/wrap_World.cpp | 32 +++++++++++++++ src/modules/physics/box2d/wrap_World.h | 4 ++ 5 files changed, 114 insertions(+) diff --git a/src/modules/physics/box2d/Contact.cpp b/src/modules/physics/box2d/Contact.cpp index 7a1b9ffa8..166d66d09 100644 --- a/src/modules/physics/box2d/Contact.cpp +++ b/src/modules/physics/box2d/Contact.cpp @@ -22,6 +22,8 @@ #include "World.h" #include "Physics.h" +#include + namespace love { namespace physics @@ -31,10 +33,12 @@ namespace box2d Contact::Contact(b2Contact * contact) : contact(contact) { + Memoizer::add(contact, this); } Contact::~Contact() { + Memoizer::remove(contact); } int Contact::getPositions(lua_State * L) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 9f1cf7f76..699d1b3d1 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -352,6 +352,56 @@ namespace box2d return world->GetJointCount(); } + int World::getContactCount() + { + return world->GetContactCount(); + } + + int World::getBodyList(lua_State * L) + { + lua_newtable(L); + b2Body * b = world->GetBodyList(); + for (int i = 1; i <= world->GetBodyCount(); i++) { + if (!b) return 1; + Body * body = (Body *)Memoizer::find(b); + if (!body) throw love::Exception("A body has escaped Memoizer!"); + luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); + lua_rawseti(L, -1, i); + b = b->GetNext(); + } + return 1; + } + + int World::getJointList(lua_State * L) + { + lua_newtable(L); + b2Joint * j = world->GetJointList(); + for (int i = 1; i <= world->GetJointCount(); i++) { + if (!j) return 1; + Joint * joint = (Joint *)Memoizer::find(j); + if (!joint) throw love::Exception("A joint has escaped Memoizer!"); + luax_newtype(L, "Joint", PHYSICS_JOINT_T, (void*)joint); + lua_rawseti(L, -1, i); + j = j->GetNext(); + } + return 1; + } + + int World::getContactList(lua_State * L) + { + lua_newtable(L); + b2Contact * c = world->GetContactList(); + for (int i = 1; i <= world->GetContactCount(); i++) { + if (!c) return 1; + Contact * contact = (Contact *)Memoizer::find(c); + if (!contact) throw love::Exception("A contact has escaped Memoizer!"); + luax_newtype(L, "Contact", PHYSICS_CONTACT_T, (void*)contact); + lua_rawseti(L, -1, i); + c = c->GetNext(); + } + return 1; + } + b2Body * World::getGroundBody() { return groundBody; diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 76d84fd98..74987f84f 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -214,6 +214,30 @@ namespace box2d * @return The number of joints. **/ int getJointCount(); + + /** + * Get the current contact count. + * @return The number of contacts. + **/ + int getContactCount(); + + /** + * Get an array of all the Bodies in the World. + * @return An array of Bodies. + **/ + int getBodyList(lua_State * L); + + /** + * Get an array of all the Joints in the World. + * @return An array of Joints. + **/ + int getJointList(lua_State * L); + + /** + * Get an array of all the Contacts in the World. + * @return An array of Contacts. + **/ + int getContactList(lua_State * L); /** * Gets the ground body. diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index 9fe819f3f..2b60404a4 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -113,6 +113,34 @@ namespace box2d 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); @@ -139,6 +167,10 @@ namespace box2d { "getAllowSleeping", w_World_getAllowSleeping }, { "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 }, { 0, 0 } diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index 3fddb8ec6..e2a10a19c 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -43,6 +43,10 @@ namespace box2d int w_World_getAllowSleeping(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 luaopen_world(lua_State * L); From dd3993623bab5b55e99235deebebe95ec80ccdbb Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 16:59:45 -0400 Subject: [PATCH 218/384] Add World:isLocked and const-ify a few worthy methods --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 19 ++++++++++++------- src/modules/physics/box2d/World.h | 21 ++++++++++++++------- src/modules/physics/box2d/wrap_World.cpp | 8 ++++++++ src/modules/physics/box2d/wrap_World.h | 1 + 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 699d1b3d1..303a70b17 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -341,23 +341,28 @@ namespace box2d { return world->GetAllowSleeping(); } + + bool World::isLocked() const + { + return world->IsLocked(); + } - int World::getBodyCount() + int World::getBodyCount() const { return world->GetBodyCount(); } - int World::getJointCount() + int World::getJointCount() const { return world->GetJointCount(); } - int World::getContactCount() + int World::getContactCount() const { return world->GetContactCount(); } - int World::getBodyList(lua_State * L) + int World::getBodyList(lua_State * L) const { lua_newtable(L); b2Body * b = world->GetBodyList(); @@ -372,7 +377,7 @@ namespace box2d return 1; } - int World::getJointList(lua_State * L) + int World::getJointList(lua_State * L) const { lua_newtable(L); b2Joint * j = world->GetJointList(); @@ -387,7 +392,7 @@ namespace box2d return 1; } - int World::getContactList(lua_State * L) + int World::getContactList(lua_State * L) const { lua_newtable(L); b2Contact * c = world->GetContactList(); @@ -402,7 +407,7 @@ namespace box2d return 1; } - b2Body * World::getGroundBody() + b2Body * World::getGroundBody() const { return groundBody; } diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 74987f84f..7bd605f1a 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -202,48 +202,55 @@ namespace box2d * @return True if allowed, false if disallowed. **/ bool getAllowSleeping() 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(); + int getBodyCount() const; /** * Get the current joint count. * @return The number of joints. **/ - int getJointCount(); + int getJointCount() const; /** * Get the current contact count. * @return The number of contacts. **/ - int getContactCount(); + int getContactCount() const; /** * Get an array of all the Bodies in the World. * @return An array of Bodies. **/ - int getBodyList(lua_State * L); + 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); + 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); + int getContactList(lua_State * L) const; /** * Gets the ground body. * @return The ground body. **/ - b2Body * getGroundBody(); + b2Body * getGroundBody() const; /** * Gets all fixtures that overlap a given bounding box. diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index 2b60404a4..430f5ae9c 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -98,6 +98,13 @@ namespace box2d luax_pushboolean(L, t->getAllowSleeping()); 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) { @@ -165,6 +172,7 @@ namespace box2d { "getGravity", w_World_getGravity }, { "setAllowSleeping", w_World_setAllowSleeping }, { "getAllowSleeping", w_World_getAllowSleeping }, + { "isLocked", w_World_isLocked }, { "getBodyCount", w_World_getBodyCount }, { "getJointCount", w_World_getJointCount }, { "getContactCount", w_World_getContactCount }, diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index e2a10a19c..3953bec83 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -41,6 +41,7 @@ namespace box2d int w_World_getGravity(lua_State * L); int w_World_setAllowSleeping(lua_State * L); int w_World_getAllowSleeping(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); From 15d2b7c63d157d6e0be0d1705fe32fc46694f2df Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 24 Sep 2011 23:07:02 +0200 Subject: [PATCH 219/384] Add Box2D include in linux build files --HG-- branch : box2d-update --- platform/unix/gen-makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/unix/gen-makefile b/platform/unix/gen-makefile index e75836f01..4824822ca 100644 --- a/platform/unix/gen-makefile +++ b/platform/unix/gen-makefile @@ -3,7 +3,8 @@ echo Generating src/Makefile.am ... cd src inc_current=. inc_modules="$inc_current/modules" -echo "AM_CPPFLAGS = -I$inc_current -I$inc_modules -I/usr/include/AL -I/usr/include/freetype2 \$(INCLUDE_LUA) -I/usr/include/SDL \$(FILE_OFFSET) +inc_box2d="$inc_current/libraries/Box2D" +echo "AM_CPPFLAGS = -I$inc_current -I$inc_modules -I$inc_box2d -I/usr/include/AL -I/usr/include/freetype2 \$(INCLUDE_LUA) -I/usr/include/SDL \$(FILE_OFFSET) AUTOMAKE_OPTIONS = subdir-objects DEFAULT_INCLUDES = SUBDIRS = From 221d9699f67dfe642755135a7e3c153cbccecca8 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 17:12:45 -0400 Subject: [PATCH 220/384] Add Body:getFilterList --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 15 +++++++++++++++ src/modules/physics/box2d/Body.h | 7 +++++++ src/modules/physics/box2d/wrap_Body.cpp | 8 ++++++++ src/modules/physics/box2d/wrap_Body.h | 1 + 4 files changed, 31 insertions(+) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index a5cba16ca..7f4786676 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -394,6 +394,21 @@ namespace box2d { 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!"); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)fixture); + lua_rawseti(L, -1, i); + } while ((f = f->GetNext())); + return 1; + } b2Vec2 Body::getVector(lua_State * L) { diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 07c181365..f5b457bab 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -378,6 +378,13 @@ namespace box2d * 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; + private: /** diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index 909f5e429..2e0413091 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -499,6 +499,13 @@ namespace box2d luax_pushboolean(L, b); return 1; } + + int w_Body_getFixtureList(lua_State * L) + { + Body * t = luax_checkbody(L, 1); + lua_remove(L, 1); + return t->getFixtureList(L); + } int w_Body_destroy(lua_State * L) { @@ -561,6 +568,7 @@ namespace box2d { "setAwake", w_Body_setAwake }, { "setFixedRotation", w_Body_setFixedRotation }, { "isFixedRotation", w_Body_isFixedRotation }, + { "getFixtureList", w_Body_getFixtureList }, { "destroy", w_Body_destroy }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_Body.h b/src/modules/physics/box2d/wrap_Body.h index e7a8fe6e2..2d5ac84b6 100644 --- a/src/modules/physics/box2d/wrap_Body.h +++ b/src/modules/physics/box2d/wrap_Body.h @@ -82,6 +82,7 @@ namespace box2d 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); int luaopen_body(lua_State * L); From 3bd2316c6c85aa6992fa8a90128fb213c30a6c72 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 17:14:03 -0400 Subject: [PATCH 221/384] Remove Fixture:getNext, it was just for testing --HG-- branch : box2d-update --- src/modules/physics/box2d/Fixture.cpp | 9 --------- src/modules/physics/box2d/Fixture.h | 5 ----- src/modules/physics/box2d/wrap_Fixture.cpp | 11 ----------- src/modules/physics/box2d/wrap_Fixture.h | 1 - 4 files changed, 26 deletions(-) diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index b07b98092..58cb74072 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -132,15 +132,6 @@ namespace box2d if (!s) s = new Shape(fixture->GetShape()); return s; } - - Fixture * Fixture::getNext() const - { - b2Fixture * f = fixture->GetNext(); - if (!f) return NULL; - Fixture * fix = (Fixture *)Memoizer::find(f); - if (!fix) fix = new Fixture(f); - return fix; - } void Fixture::setFilterData(int * v) { diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index 69734d770..a1060667b 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -105,11 +105,6 @@ namespace box2d **/ Body * getBody() const; - /** - * Gets the next Fixture attached to the parent Body. - **/ - Fixture * getNext() const; - /** * Sets the filter data. An integer array is used even though the * first two elements are unsigned shorts. The elements are: diff --git a/src/modules/physics/box2d/wrap_Fixture.cpp b/src/modules/physics/box2d/wrap_Fixture.cpp index c420f38e6..bc758f4db 100644 --- a/src/modules/physics/box2d/wrap_Fixture.cpp +++ b/src/modules/physics/box2d/wrap_Fixture.cpp @@ -122,16 +122,6 @@ namespace box2d luax_newtype(L, "Shape", PHYSICS_SHAPE_T, (void*)shape); return 1; } - - int w_Fixture_getNext(lua_State * L) - { - Fixture * t = luax_checkfixture(L, 1); - Fixture * f = t->getNext(); - if (f == 0) return 0; - f->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); - return 1; - } int w_Fixture_testPoint(lua_State * L) { @@ -264,7 +254,6 @@ namespace box2d { "getDensity", w_Fixture_getDensity }, { "getBody", w_Fixture_getBody }, { "getShape", w_Fixture_getShape }, - { "getNext", w_Fixture_getNext }, { "isSensor", w_Fixture_isSensor }, { "testPoint", w_Fixture_testPoint }, { "rayCast", w_Fixture_rayCast }, diff --git a/src/modules/physics/box2d/wrap_Fixture.h b/src/modules/physics/box2d/wrap_Fixture.h index 675ab7342..d41f6b25a 100644 --- a/src/modules/physics/box2d/wrap_Fixture.h +++ b/src/modules/physics/box2d/wrap_Fixture.h @@ -43,7 +43,6 @@ namespace box2d int w_Fixture_isSensor(lua_State * L); int w_Fixture_getBody(lua_State * L); int w_Fixture_getShape(lua_State * L); - int w_Fixture_getNext(lua_State * L); int w_Fixture_testPoint(lua_State * L); int w_Fixture_rayCast(lua_State * L); int w_Fixture_setFilterData(lua_State * L); From 680dd65c196aaa8268917adb0dc2c2b068ae72c9 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 17:29:42 -0400 Subject: [PATCH 222/384] Add love.physics.getDistance(fixtureA, fixtureB) - gets the distance between and the closest points of two fixtures --HG-- branch : box2d-update --- src/modules/physics/box2d/Fixture.h | 2 ++ src/modules/physics/box2d/Physics.cpp | 25 ++++++++++++++++++++++ src/modules/physics/box2d/Physics.h | 9 ++++++++ src/modules/physics/box2d/wrap_Physics.cpp | 5 +++++ src/modules/physics/box2d/wrap_Physics.h | 1 + 5 files changed, 42 insertions(+) diff --git a/src/modules/physics/box2d/Fixture.h b/src/modules/physics/box2d/Fixture.h index a1060667b..c3fdfb581 100644 --- a/src/modules/physics/box2d/Fixture.h +++ b/src/modules/physics/box2d/Fixture.h @@ -57,6 +57,8 @@ namespace box2d **/ class Fixture : public Object { + friend class Physics; + protected: Body * body; diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 9c76a7ff0..466c07fc3 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -208,6 +208,31 @@ namespace box2d 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); + b2DistanceInput i; + b2DistanceProxy pA; + pA.Set(fixtureA->fixture->GetShape(), 0); + b2DistanceProxy pB; + 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; + b2DistanceOutput o; + b2SimplexCache c; + b2Distance(&o, &c, &i); + lua_pushnumber(L, 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 meter) { Physics::meter = meter; diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index b26f61e42..89ff428a5 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -258,6 +258,15 @@ namespace box2d 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 pixels The number of pixels in one meter. (1m ~= 3.3ft). diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index e84839187..1b11e05ec 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -272,6 +272,11 @@ namespace box2d return 1; } + int w_getDistance(lua_State * L) + { + return instance->getDistance(L); + } + int w_setMeter(lua_State * L) { int arg1 = luaL_checkint(L, 1); diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 8de805600..5a086b01e 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -69,6 +69,7 @@ namespace box2d int w_newWeldJoint(lua_State * L); int w_newWheelJoint(lua_State * L); int w_newRopeJoint(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); From 624e1bf8f5bdd1181d92cf7625963782a90251a8 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 23:52:56 -0400 Subject: [PATCH 223/384] Missed a bunch of retain() calls --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 303a70b17..0e097c781 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -79,8 +79,10 @@ namespace box2d // Push first fixture. { Fixture * a = (Fixture *)Memoizer::find(contacts[i]->contact->GetFixtureA()); - if(a != 0) + if(a != 0) { + a->retain(); luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)a); + } else throw love::Exception("A fixture has escaped Memoizer!"); } @@ -88,8 +90,10 @@ namespace box2d // Push second userdata. { Fixture * b = (Fixture *)Memoizer::find(contacts[i]->contact->GetFixtureB()); - if(b != 0) + if(b != 0) { + b->retain(); luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)b); + } else throw love::Exception("A fixture has escaped Memoizer!"); } @@ -162,6 +166,7 @@ namespace box2d ref->push(); Fixture * f = (Fixture *)Memoizer::find(fixture); if (!f) throw love::Exception("A fixture has escaped Memoizer!"); + f->retain(); luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); lua_call(L, 1, 1); return luax_toboolean(L, -1); @@ -188,6 +193,7 @@ namespace box2d ref->push(); Fixture * f = (Fixture *)Memoizer::find(fixture); if (!f) throw love::Exception("A fixture has escaped Memoizer!"); + f->retain(); luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); b2Vec2 scaledPoint = Physics::scaleUp(point); lua_pushnumber(L, scaledPoint.x); @@ -267,8 +273,10 @@ namespace box2d // 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); } @@ -370,6 +378,7 @@ namespace box2d if (!b) return 1; Body * body = (Body *)Memoizer::find(b); if (!body) throw love::Exception("A body has escaped Memoizer!"); + body->retain(); luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); lua_rawseti(L, -1, i); b = b->GetNext(); @@ -385,6 +394,7 @@ namespace box2d if (!j) return 1; Joint * joint = (Joint *)Memoizer::find(j); if (!joint) throw love::Exception("A joint has escaped Memoizer!"); + joint->retain(); luax_newtype(L, "Joint", PHYSICS_JOINT_T, (void*)joint); lua_rawseti(L, -1, i); j = j->GetNext(); @@ -400,6 +410,7 @@ namespace box2d if (!c) return 1; Contact * contact = (Contact *)Memoizer::find(c); if (!contact) throw love::Exception("A contact has escaped Memoizer!"); + contact->retain(); luax_newtype(L, "Contact", PHYSICS_CONTACT_T, (void*)contact); lua_rawseti(L, -1, i); c = c->GetNext(); From 56ce9a2e170e575595ba4acd9ad2c7379c42b765 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 25 Sep 2011 11:21:05 -0400 Subject: [PATCH 224/384] Expose love.physics.getDistance --HG-- branch : box2d-update --- src/modules/physics/box2d/wrap_Physics.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 1b11e05ec..7fc77dd57 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -310,6 +310,7 @@ namespace box2d { "newWeldJoint", w_newWeldJoint }, { "newWheelJoint", w_newWheelJoint }, { "newRopeJoint", w_newRopeJoint }, + { "getDistance", w_getDistance }, { "getMeter", w_getMeter }, { "setMeter", w_setMeter }, { 0, 0 }, From 5cd2ce05fd408c856d3fcaac2406c179fc73b2df Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 25 Sep 2011 11:30:58 -0400 Subject: [PATCH 225/384] Fix scaling errors with CircleShape's radius --HG-- branch : box2d-update --- src/modules/physics/box2d/CircleShape.cpp | 5 +++-- src/modules/physics/box2d/Physics.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index a9123a3b9..09e03ab69 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" #include @@ -46,12 +47,12 @@ namespace box2d float CircleShape::getRadius() const { - return shape->m_radius; + return Physics::scaleUp(shape->m_radius); } void CircleShape::setRadius(float r) { - shape->m_radius = r; + shape->m_radius = Physics::scaleDown(r); } } // box2d diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 466c07fc3..7bfffec98 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -63,7 +63,7 @@ namespace box2d { b2CircleShape *s = new b2CircleShape(); s->m_p = Physics::scaleDown(b2Vec2(x, y)); - s->m_radius = radius; + s->m_radius = Physics::scaleDown(radius); return new CircleShape(s); } @@ -225,7 +225,7 @@ namespace box2d b2DistanceOutput o; b2SimplexCache c; b2Distance(&o, &c, &i); - lua_pushnumber(L, o.distance); + 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)); From b6f3d2114f83495c7d00833f10adfe20caa8712a Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 25 Sep 2011 11:32:46 -0400 Subject: [PATCH 226/384] Remove legacy meter setting from love.physics.newWorld --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.cpp | 3 +-- src/modules/physics/box2d/Physics.h | 3 +-- src/modules/physics/box2d/wrap_Physics.cpp | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 7bfffec98..e2e6be22e 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -38,9 +38,8 @@ namespace box2d return "love.physics.box2d"; } - World * Physics::newWorld(float gx, float gy, bool sleep, int meter) + World * Physics::newWorld(float gx, float gy, bool sleep) { - Physics::setMeter(meter); return new World(b2Vec2(gx, gy), sleep); } diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 89ff428a5..127e28ec2 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -72,9 +72,8 @@ namespace box2d * @param gx Gravity along x-axis. * @param gy Gravity along y-axis. * @param sleep Whether the World allows sleep. - * @param meter The scale in px/m. **/ - World * newWorld(float gx, float gy, bool sleep, int meter); + World * newWorld(float gx, float gy, bool sleep); /** * Creates a new Body at the specified position. diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 7fc77dd57..89d82424c 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -34,9 +34,8 @@ namespace box2d float gx = (float)luaL_optnumber(L, 1, 0); float gy = (float)luaL_optnumber(L, 2, 0); bool sleep = luax_optboolean(L, 3, true); - int meter = (int)luaL_optnumber(L, 4, Physics::DEFAULT_METER); - World * w = instance->newWorld(gx, gy, sleep, meter); + World * w = instance->newWorld(gx, gy, sleep); luax_newtype(L, "World", PHYSICS_WORLD_T, (void*)w); return 1; From 28c5982d92ad9c00344ddbad9bbd536786086dfe Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 25 Sep 2011 12:18:13 -0400 Subject: [PATCH 227/384] Fix table creation for getList() functions, and ignore the ground body --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 3 ++- src/modules/physics/box2d/World.cpp | 41 +++++++++++++++-------------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 7f4786676..8f64660f1 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -405,7 +405,8 @@ namespace box2d Fixture * fixture = (Fixture *)Memoizer::find(f); if (!fixture) throw love::Exception("A fixture has escaped Memoizer!"); luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)fixture); - lua_rawseti(L, -1, i); + lua_rawseti(L, -2, i); + i++; } while ((f = f->GetNext())); return 1; } diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 0e097c781..c0ef5ebff 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -357,7 +357,7 @@ namespace box2d int World::getBodyCount() const { - return world->GetBodyCount(); + return world->GetBodyCount()-1; // ignore the ground body } int World::getJointCount() const @@ -374,15 +374,16 @@ namespace box2d { lua_newtable(L); b2Body * b = world->GetBodyList(); - for (int i = 1; i <= world->GetBodyCount(); i++) { - if (!b) return 1; + 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_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); - lua_rawseti(L, -1, i); - b = b->GetNext(); - } + lua_rawseti(L, -2, i); + i++; + } while ((b = b->GetNext())); return 1; } @@ -390,15 +391,15 @@ namespace box2d { lua_newtable(L); b2Joint * j = world->GetJointList(); - for (int i = 1; i <= world->GetJointCount(); i++) { - if (!j) return 1; + 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_newtype(L, "Joint", PHYSICS_JOINT_T, (void*)joint); - lua_rawseti(L, -1, i); - j = j->GetNext(); - } + lua_rawseti(L, -2, i); + i++; + } while ((j = j->GetNext())); return 1; } @@ -406,15 +407,15 @@ namespace box2d { lua_newtable(L); b2Contact * c = world->GetContactList(); - for (int i = 1; i <= world->GetContactCount(); i++) { - if (!c) return 1; - Contact * contact = (Contact *)Memoizer::find(c); + int i = 1; + do { + if (!c) break; + Contact * contact = (Contact *)Memoizer::find(c); if (!contact) throw love::Exception("A contact has escaped Memoizer!"); - contact->retain(); luax_newtype(L, "Contact", PHYSICS_CONTACT_T, (void*)contact); - lua_rawseti(L, -1, i); - c = c->GetNext(); - } + lua_rawseti(L, -2, i); + i++; + } while ((c = c->GetNext())); return 1; } From de908f335426af9b74ab9a8f5ac237fc5b8e9b62 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 25 Sep 2011 12:35:57 -0400 Subject: [PATCH 228/384] Missing retain() calls in get*List functions --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 1 + src/modules/physics/box2d/World.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 8f64660f1..44fb96eb5 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -404,6 +404,7 @@ namespace box2d if (!f) break; Fixture * fixture = (Fixture *)Memoizer::find(f); if (!fixture) throw love::Exception("A fixture has escaped Memoizer!"); + fixture->retain(); luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)fixture); lua_rawseti(L, -2, i); i++; diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index c0ef5ebff..4a81fc516 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -380,6 +380,7 @@ namespace box2d if (b == groundBody) continue; Body * body = (Body *)Memoizer::find(b); if (!body) throw love::Exception("A body has escaped Memoizer!"); + body->retain(); luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); lua_rawseti(L, -2, i); i++; @@ -396,6 +397,7 @@ namespace box2d if (!j) break; Joint * joint = (Joint *)Memoizer::find(j); if (!joint) throw love::Exception("A joint has escaped Memoizer!"); + joint->retain(); luax_newtype(L, "Joint", PHYSICS_JOINT_T, (void*)joint); lua_rawseti(L, -2, i); i++; @@ -412,6 +414,7 @@ namespace box2d if (!c) break; Contact * contact = (Contact *)Memoizer::find(c); if (!contact) throw love::Exception("A contact has escaped Memoizer!"); + contact->retain(); luax_newtype(L, "Contact", PHYSICS_CONTACT_T, (void*)contact); lua_rawseti(L, -2, i); i++; From 80fb261b5ace1e2286ac8a374823435f373cfbf1 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 25 Sep 2011 22:29:30 -0400 Subject: [PATCH 229/384] Better ChainShape API consistency --HG-- branch : box2d-update --- src/modules/physics/box2d/ChainShape.cpp | 11 ++++++++--- src/modules/physics/box2d/ChainShape.h | 4 ++-- src/modules/physics/box2d/wrap_ChainShape.cpp | 17 +++++++---------- src/modules/physics/box2d/wrap_ChainShape.h | 4 ++-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/modules/physics/box2d/ChainShape.cpp b/src/modules/physics/box2d/ChainShape.cpp index 2f3a3a1ec..2839118c2 100644 --- a/src/modules/physics/box2d/ChainShape.cpp +++ b/src/modules/physics/box2d/ChainShape.cpp @@ -72,7 +72,12 @@ namespace box2d b2ChainShape * c = (b2ChainShape *)shape; b2EdgeShape e; c->GetChildEdge(&e, index); - return new EdgeShape(&e); + EdgeShape * edge = (EdgeShape *)Memoizer::find(&e); + if (!edge) return new EdgeShape(&e); + else { + edge->retain(); + return edge; + } } int ChainShape::getChildCount() const @@ -87,14 +92,14 @@ namespace box2d return c->m_count; } - b2Vec2 ChainShape::getVertex(int index) const + b2Vec2 ChainShape::getPoint(int index) const { b2ChainShape * c = (b2ChainShape *)shape; const b2Vec2 & v = c->m_vertices[index]; return Physics::scaleUp(v); } - const b2Vec2 * ChainShape::getVertices() const + const b2Vec2 * ChainShape::getPoints() const { b2ChainShape * c = (b2ChainShape *)shape; return c->m_vertices; diff --git a/src/modules/physics/box2d/ChainShape.h b/src/modules/physics/box2d/ChainShape.h index ccabc2e08..6668de47b 100644 --- a/src/modules/physics/box2d/ChainShape.h +++ b/src/modules/physics/box2d/ChainShape.h @@ -89,13 +89,13 @@ namespace box2d * @param index The index of the vertex. * @returns The specified vertex. **/ - b2Vec2 getVertex(int index) const; + b2Vec2 getPoint(int index) const; /** * Returns all of the vertices. * @returns The vertices the shape comprises. **/ - const b2Vec2 * getVertices() const; + const b2Vec2 * getPoints() const; }; diff --git a/src/modules/physics/box2d/wrap_ChainShape.cpp b/src/modules/physics/box2d/wrap_ChainShape.cpp index ef5195cfe..22114ee54 100644 --- a/src/modules/physics/box2d/wrap_ChainShape.cpp +++ b/src/modules/physics/box2d/wrap_ChainShape.cpp @@ -74,30 +74,27 @@ namespace box2d return 1; } - int w_ChainShape_getVertex(lua_State * L) + int w_ChainShape_getPoint(lua_State * L) { ChainShape * c = luax_checkchainshape(L, 1); int index = luaL_checkint(L, 2); - b2Vec2 v = c->getVertex(index); + b2Vec2 v = c->getPoint(index); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); return 2; } - int w_ChainShape_getVertices(lua_State * L) + int w_ChainShape_getPoints(lua_State * L) { ChainShape * c = luax_checkchainshape(L, 1); - const b2Vec2 * verts = c->getVertices(); + const b2Vec2 * verts = c->getPoints(); int count = c->getVertexCount(); - lua_createtable(L, count*2, 0); for (int i = 0; i < count; i++) { b2Vec2 v = Physics::scaleUp(verts[i]); lua_pushnumber(L, v.x); - lua_rawseti(L, -2, i*2+1); lua_pushnumber(L, v.y); - lua_rawseti(L, -2, i*2+2); } - return 1; + return count*2; } static const luaL_Reg functions[] = { @@ -106,8 +103,8 @@ namespace box2d { "getChildCount", w_ChainShape_getChildCount }, { "getChildEdge", w_ChainShape_getChildEdge }, { "getVertexCount", w_ChainShape_getVertexCount }, - { "getVertex", w_ChainShape_getVertex }, - { "getVertices", w_ChainShape_getVertices }, + { "getPoint", w_ChainShape_getPoint }, + { "getPoints", w_ChainShape_getPoints }, // From Shape. { "getType", w_Shape_getType }, { "getRadius", w_Shape_getRadius }, diff --git a/src/modules/physics/box2d/wrap_ChainShape.h b/src/modules/physics/box2d/wrap_ChainShape.h index ae81e4ba8..4e29e0b0b 100644 --- a/src/modules/physics/box2d/wrap_ChainShape.h +++ b/src/modules/physics/box2d/wrap_ChainShape.h @@ -39,8 +39,8 @@ namespace box2d int w_ChainShape_getChildCount(lua_State * L); int w_ChainShape_getChildEdge(lua_State * L); int w_ChainShape_getVertexCount(lua_State * L); - int w_ChainShape_getVertex(lua_State * L); - int w_ChainShape_getVertices(lua_State * L); + int w_ChainShape_getPoint(lua_State * L); + int w_ChainShape_getPoints(lua_State * L); int luaopen_chainshape(lua_State * L); From 5886977baa7d458183d3192c8ec22235225bec17 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 26 Sep 2011 11:20:26 -0400 Subject: [PATCH 230/384] Fix World:getCallbacks/getContactFilter to not return any arguments passed (though you shouldn't be passing any arguments anyway, that's silly) --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 4a81fc516..dfac1a5e1 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -310,7 +310,7 @@ namespace box2d 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 lua_gettop(L); + return 4; } int World::setContactFilter(lua_State * L) @@ -324,7 +324,7 @@ namespace box2d int World::getContactFilter(lua_State * L) { filter.ref ? filter.ref->push() : lua_pushnil(L); - return lua_gettop(L); + return 1; } void World::setGravity(float x, float y) From caf46ad430749adb2ac042d86a9c2b5d755af4e0 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 26 Sep 2011 23:21:53 +0200 Subject: [PATCH 231/384] Prevent infinite loop when destroying sources (issue #250) --- src/modules/audio/openal/Pool.cpp | 2 +- src/modules/audio/openal/Source.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index e20cbd05e..eda5a973f 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -271,9 +271,9 @@ namespace openal if(i != playing.end()) { source->stopAtomic(); - source->release(); available.push(i->second); playing.erase(i++); + source->release(); return true; } diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 399d271da..60bc8f1a2 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -65,7 +65,8 @@ namespace openal Source::~Source() { - pool->stop(this); + if (valid) + pool->stop(this); alDeleteBuffers((type == TYPE_STATIC) ? 1 : MAX_BUFFERS, buffers); if (decoder) decoder->release(); From 413f5026fac1c2f47515854da9ec81d583f937dc Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 26 Sep 2011 19:13:44 -0300 Subject: [PATCH 232/384] Fix invalid pointer issue in PostSolve callback --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index dfac1a5e1..f6c2f8368 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -61,7 +61,15 @@ namespace box2d { if(ref != 0) { contacts.push_back(new Contact(contact)); - impulses.push_back(impulse); + // copy the impulse struct + b2ContactImpulse * i = new b2ContactImpulse(); + i->normalImpulses[0] = impulse->normalImpulses[0]; + i->normalImpulses[1] = impulse->normalImpulses[1]; + i->tangentImpulses[0] = impulse->tangentImpulses[0]; + i->tangentImpulses[1] = impulse->tangentImpulses[1]; + i->count = impulse->count; + + impulses.push_back(i); } } @@ -117,6 +125,8 @@ namespace box2d delete contacts[i]; contacts.clear(); // Clear impulses. + for(int i = 0;i<(int)impulses.size();i++) + delete impulses[i]; impulses.clear(); } From 16fb73e92a2b747eb06f22134065d02f02e539e4 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 26 Sep 2011 20:22:03 -0400 Subject: [PATCH 233/384] Callbacks now actually fire when they're supposed to, instead of post-step (means PreSolve collision filtering works) --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 121 +++++++++------------------- src/modules/physics/box2d/World.h | 8 +- 2 files changed, 39 insertions(+), 90 deletions(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index f6c2f8368..e35b4b5d6 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -44,90 +44,50 @@ namespace box2d if(ref != 0) delete ref; } - - void World::ContactCallback::add(b2Contact* contact) - { - /** - * We must copy contacts, since we're not allowed to process - * them inside this function. Removing bodies in this function - * pretty much guarantees segfault. ^^ - **/ - - if(ref != 0) - contacts.push_back(new Contact(contact)); - } - void World::ContactCallback::add(b2Contact* contact, const b2ContactImpulse* impulse) - { - if(ref != 0) { - contacts.push_back(new Contact(contact)); - // copy the impulse struct - b2ContactImpulse * i = new b2ContactImpulse(); - i->normalImpulses[0] = impulse->normalImpulses[0]; - i->normalImpulses[1] = impulse->normalImpulses[1]; - i->tangentImpulses[0] = impulse->tangentImpulses[0]; - i->tangentImpulses[1] = impulse->tangentImpulses[1]; - i->count = impulse->count; - - impulses.push_back(i); - } - } - - void World::ContactCallback::process() + void World::ContactCallback::process(b2Contact* contact, const b2ContactImpulse* impulse) { // Process contacts. if(ref != 0) { lua_State * L = ref->getL(); - for(int i = 0;i<(int)contacts.size();i++) + ref->push(); + + // Push first fixture. { - // Push the function. - ref->push(); - - // Push first fixture. - { - Fixture * a = (Fixture *)Memoizer::find(contacts[i]->contact->GetFixtureA()); - if(a != 0) { - a->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)a); - } - else - throw love::Exception("A fixture has escaped Memoizer!"); + Fixture * a = (Fixture *)Memoizer::find(contact->GetFixtureA()); + if(a != 0) { + a->retain(); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)a); } - - // Push second userdata. - { - Fixture * b = (Fixture *)Memoizer::find(contacts[i]->contact->GetFixtureB()); - if(b != 0) { - b->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)b); - } - else - throw love::Exception("A fixture has escaped Memoizer!"); - } - - luax_newtype(L, "Contact", (PHYSICS_CONTACT_T), (void*)contacts[i], false); - - int args = 3; - if ((int)impulses.size() > i) { - const b2ContactImpulse * impulse = impulses[i]; - 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); + else + throw love::Exception("A fixture has escaped Memoizer!"); } - // Clear contacts. - for(int i = 0;i<(int)contacts.size();i++) - delete contacts[i]; - contacts.clear(); - // Clear impulses. - for(int i = 0;i<(int)impulses.size();i++) - delete impulses[i]; - impulses.clear(); + // Push second userdata. + { + Fixture * b = (Fixture *)Memoizer::find(contact->GetFixtureB()); + if(b != 0) { + b->retain(); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)b); + } + else + throw love::Exception("A fixture has escaped Memoizer!"); + } + + Contact * c = new Contact(contact); + + luax_newtype(L, "Contact", (PHYSICS_CONTACT_T), (void*)c, false); + + 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); } } @@ -250,32 +210,27 @@ namespace box2d void World::update(float dt) { world->Step(dt, 8, 6); - - begin.process(); - end.process(); - presolve.process(); - postsolve.process(); } void World::BeginContact(b2Contact* contact) { - begin.add(contact); + begin.process(contact); } void World::EndContact(b2Contact* contact) { - end.add(contact); + end.process(contact); } void World::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { B2_NOT_USED(oldManifold); // not sure what to do with this - presolve.add(contact); + presolve.process(contact); } void World::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { - postsolve.add(contact, impulse); + postsolve.process(contact, impulse); } bool World::ShouldCollide(b2Fixture * fixtureA, b2Fixture * fixtureB) diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 7bd605f1a..fc6d3aca8 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -67,15 +67,9 @@ namespace box2d { public: Reference * ref; - std::vector contacts; - std::vector impulses; - b2Manifold* oldManifold; - b2ContactImpulse* impulse; ContactCallback(); ~ContactCallback(); - void add(b2Contact* contact); - void add(b2Contact* contact, const b2ContactImpulse* impulse); - void process(); + void process(b2Contact* contact, const b2ContactImpulse* impulse = NULL); }; class ContactFilter From 356b3c880d9e98e4b01ff74513c23497a48f33c8 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 26 Sep 2011 21:35:44 -0400 Subject: [PATCH 234/384] Fixture:getShape() returns a Shape of the type it actually is --HG-- branch : box2d-update --- src/modules/physics/box2d/CircleShape.h | 2 +- src/modules/physics/box2d/wrap_Fixture.cpp | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/modules/physics/box2d/CircleShape.h b/src/modules/physics/box2d/CircleShape.h index a48becb06..2b75dff8d 100644 --- a/src/modules/physics/box2d/CircleShape.h +++ b/src/modules/physics/box2d/CircleShape.h @@ -59,7 +59,7 @@ namespace box2d float getRadius() const; /** - * Gets the radius for the circle. + * Sets the radius for the circle. **/ void setRadius(float r); }; diff --git a/src/modules/physics/box2d/wrap_Fixture.cpp b/src/modules/physics/box2d/wrap_Fixture.cpp index bc758f4db..61de81111 100644 --- a/src/modules/physics/box2d/wrap_Fixture.cpp +++ b/src/modules/physics/box2d/wrap_Fixture.cpp @@ -119,7 +119,23 @@ namespace box2d if(shape == 0) return 0; shape->retain(); - luax_newtype(L, "Shape", PHYSICS_SHAPE_T, (void*)shape); + switch (shape->getType()) { + case Shape::SHAPE_EDGE: + luax_newtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, (void*)shape); + break; + case Shape::SHAPE_CHAIN: + luax_newtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, (void*)shape); + break; + case Shape::SHAPE_CIRCLE: + luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); + break; + case Shape::SHAPE_POLYGON: + luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); + break; + default: + luax_newtype(L, "Shape", PHYSICS_SHAPE_T, (void*)shape); + break; + } return 1; } From 5244463109b99d41dd5bf00a75b67ec3ec48ae1b Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 27 Sep 2011 15:48:29 -0400 Subject: [PATCH 235/384] Add second body anchor point as a parameter to love.physics.newPrismaticJoint, and fix some scaling issues with PrismaticJoint --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.cpp | 4 ++-- src/modules/physics/box2d/Physics.h | 8 ++++--- src/modules/physics/box2d/PrismaticJoint.cpp | 9 ++++---- src/modules/physics/box2d/PrismaticJoint.h | 2 +- src/modules/physics/box2d/wrap_Physics.cpp | 24 +++++++++++++++----- 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index e2e6be22e..7720b92ea 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -167,9 +167,9 @@ namespace box2d return new RevoluteJoint(body1, body2, x, y, collideConnected); } - PrismaticJoint * Physics::newPrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool 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, x, y, ax, ay, 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) diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 127e28ec2..96ed7989a 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -183,13 +183,15 @@ namespace box2d /** * Creates a new PrismaticJoint connecting body1 with body2. - * @param x World-anchor along the x-axis. - * @param y World-anchor along the y-axis. + * @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 x, float y, float ax, float ay, bool collideConnected); + 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. diff --git a/src/modules/physics/box2d/PrismaticJoint.cpp b/src/modules/physics/box2d/PrismaticJoint.cpp index 17b6b1c7e..276cb5493 100644 --- a/src/modules/physics/box2d/PrismaticJoint.cpp +++ b/src/modules/physics/box2d/PrismaticJoint.cpp @@ -31,12 +31,13 @@ namespace physics { namespace box2d { - PrismaticJoint::PrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected) + 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(x,y)), b2Vec2(ax,ay)); + 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; @@ -52,12 +53,12 @@ namespace box2d float PrismaticJoint::getJointTranslation() const { - return Physics::scaleDown(joint->GetJointTranslation()); + return Physics::scaleUp(joint->GetJointTranslation()); } float PrismaticJoint::getJointSpeed() const { - return Physics::scaleDown(joint->GetJointSpeed()); + return Physics::scaleUp(joint->GetJointSpeed()); } void PrismaticJoint::enableMotor(bool motor) diff --git a/src/modules/physics/box2d/PrismaticJoint.h b/src/modules/physics/box2d/PrismaticJoint.h index 5e0c39222..b7c5efeec 100644 --- a/src/modules/physics/box2d/PrismaticJoint.h +++ b/src/modules/physics/box2d/PrismaticJoint.h @@ -46,7 +46,7 @@ namespace box2d /** * Creates a new PrismaticJoint connecting body1 and body2. **/ - PrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected); + PrismaticJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected); virtual ~PrismaticJoint(); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 89d82424c..dd422f579 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -176,12 +176,24 @@ namespace box2d { 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); - float ax = (float)luaL_checknumber(L, 5); - float ay = (float)luaL_checknumber(L, 6); - bool collideConnected = luax_optboolean(L, 7, false); - PrismaticJoint * j = instance->newPrismaticJoint(body1, body2, x, y, ax, ay, collideConnected); + 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 = instance->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); luax_newtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, (void*)j); return 1; } From d4703960a44baf08bab489d88e8c3ea776528c04 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 27 Sep 2011 16:38:46 -0400 Subject: [PATCH 236/384] Do the same for WheelJoint --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.cpp | 4 ++-- src/modules/physics/box2d/Physics.h | 8 ++++--- src/modules/physics/box2d/WheelJoint.cpp | 9 ++++---- src/modules/physics/box2d/WheelJoint.h | 2 +- src/modules/physics/box2d/wrap_Physics.cpp | 25 ++++++++++++++++------ 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 7720b92ea..7ba45f241 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -192,9 +192,9 @@ namespace box2d return new WeldJoint(body1, body2, x, y, collideConnected); } - WheelJoint * Physics::newWheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool 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, x, y, ax, ay, 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) diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 96ed7989a..2c4491d3f 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -231,13 +231,15 @@ namespace box2d /** * Creates a new WheelJoint connecting body1 with body2. - * @param x Anchor along the x-axis. (World coordinates) - * @param y Anchor along the y-axis. (World coordinates) + * @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 x, float y, float ax, float ay, bool collideConnected); + 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. diff --git a/src/modules/physics/box2d/WheelJoint.cpp b/src/modules/physics/box2d/WheelJoint.cpp index 93e59a910..2a7fb7317 100644 --- a/src/modules/physics/box2d/WheelJoint.cpp +++ b/src/modules/physics/box2d/WheelJoint.cpp @@ -31,12 +31,13 @@ namespace physics { namespace box2d { - WheelJoint::WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected) + 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(x,y)), b2Vec2(ax,ay)); + 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); } @@ -49,12 +50,12 @@ namespace box2d float WheelJoint::getJointTranslation() const { - return Physics::scaleDown(joint->GetJointTranslation()); + return Physics::scaleUp(joint->GetJointTranslation()); } float WheelJoint::getJointSpeed() const { - return Physics::scaleDown(joint->GetJointSpeed()); + return Physics::scaleUp(joint->GetJointSpeed()); } void WheelJoint::enableMotor(bool motor) diff --git a/src/modules/physics/box2d/WheelJoint.h b/src/modules/physics/box2d/WheelJoint.h index eb4053636..2f50b14fc 100644 --- a/src/modules/physics/box2d/WheelJoint.h +++ b/src/modules/physics/box2d/WheelJoint.h @@ -47,7 +47,7 @@ namespace box2d /** * Creates a new WheelJoint connecting body1 and body2. **/ - WheelJoint(Body * body1, Body * body2, float x, float y, float ax, float ay, bool collideConnected); + WheelJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected); virtual ~WheelJoint(); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index dd422f579..0d7f409bc 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -258,12 +258,25 @@ namespace box2d { 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); - float ax = (float)luaL_checknumber(L, 5); - float ay = (float)luaL_checknumber(L, 6); - bool collideConnected = luax_optboolean(L, 7, false); - WheelJoint * j = instance->newWheelJoint(body1, body2, x, y, ax, ay, collideConnected); + 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 = instance->newWheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); luax_newtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, (void*)j); return 1; } From c5cd6d709bf3432bee0b1cfedd70eaac42011a08 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 29 Sep 2011 11:09:08 -0400 Subject: [PATCH 237/384] Fix a lot of scaling issues --HG-- branch : box2d-update --- src/modules/physics/box2d/Body.cpp | 10 ++++++---- src/modules/physics/box2d/FrictionJoint.cpp | 8 ++++---- src/modules/physics/box2d/Joint.cpp | 4 ++-- src/modules/physics/box2d/MouseJoint.cpp | 4 ++-- src/modules/physics/box2d/RevoluteJoint.cpp | 4 ++-- src/modules/physics/box2d/RevoluteJoint.h | 4 ++-- src/modules/physics/box2d/WheelJoint.cpp | 18 +++++++++--------- 7 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 44fb96eb5..22d38f4e2 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -176,22 +176,24 @@ namespace box2d void Body::applyAngularImpulse(float impulse) { - body->ApplyAngularImpulse(Physics::scaleDown(impulse)); + // Angular impulse is in kg*m^2/s, meaning it needs to be scaled twice + body->ApplyAngularImpulse(Physics::scaleDown(Physics::scaleDown(impulse))); } void Body::applyTorque(float t) { - body->ApplyTorque(t); + // 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))); } void Body::applyForce(float fx, float fy, float rx, float ry) { - body->ApplyForce(b2Vec2(fx, fy), Physics::scaleDown(b2Vec2(rx, ry))); + body->ApplyForce(Physics::scaleDown(b2Vec2(fx, fy)), Physics::scaleDown(b2Vec2(rx, ry))); } void Body::applyForce(float fx, float fy) { - body->ApplyForce(b2Vec2(fx, fy), body->GetWorldCenter()); + body->ApplyForce(Physics::scaleDown(b2Vec2(fx, fy)), body->GetWorldCenter()); } void Body::setX(float x) diff --git a/src/modules/physics/box2d/FrictionJoint.cpp b/src/modules/physics/box2d/FrictionJoint.cpp index 699bd478a..7449aab19 100644 --- a/src/modules/physics/box2d/FrictionJoint.cpp +++ b/src/modules/physics/box2d/FrictionJoint.cpp @@ -50,22 +50,22 @@ namespace box2d void FrictionJoint::setMaxForce(float force) { - joint->SetMaxForce(force); + joint->SetMaxForce(Physics::scaleDown(force)); } float FrictionJoint::getMaxForce() const { - return joint->GetMaxForce(); + return Physics::scaleUp(joint->GetMaxForce()); } void FrictionJoint::setMaxTorque(float torque) { - joint->SetMaxTorque(torque); + joint->SetMaxTorque(Physics::scaleDown(Physics::scaleDown(torque))); } float FrictionJoint::getMaxTorque() const { - return joint->GetMaxTorque(); + return Physics::scaleUp(Physics::scaleUp(joint->GetMaxTorque())); } diff --git a/src/modules/physics/box2d/Joint.cpp b/src/modules/physics/box2d/Joint.cpp index 1aa48f00d..13a29f18a 100644 --- a/src/modules/physics/box2d/Joint.cpp +++ b/src/modules/physics/box2d/Joint.cpp @@ -98,7 +98,7 @@ namespace box2d int Joint::getReactionForce(lua_State * L) { float dt = (float)luaL_checknumber(L, 2); - b2Vec2 v = joint->GetReactionForce(dt); + b2Vec2 v = Physics::scaleUp(joint->GetReactionForce(dt)); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); return 2; @@ -106,7 +106,7 @@ namespace box2d float Joint::getReactionTorque(float dt) { - return joint->GetReactionTorque(dt); + return Physics::scaleUp(Physics::scaleUp(joint->GetReactionTorque(dt))); } b2Joint * Joint::createJoint(b2JointDef * def) diff --git a/src/modules/physics/box2d/MouseJoint.cpp b/src/modules/physics/box2d/MouseJoint.cpp index 9ea217b6f..b800645c8 100644 --- a/src/modules/physics/box2d/MouseJoint.cpp +++ b/src/modules/physics/box2d/MouseJoint.cpp @@ -63,12 +63,12 @@ namespace box2d void MouseJoint::setMaxForce(float force) { - joint->SetMaxForce(force); + joint->SetMaxForce(Physics::scaleDown(force)); } float MouseJoint::getMaxForce() const { - return joint->GetMaxForce(); + return Physics::scaleUp(joint->GetMaxForce()); } void MouseJoint::setFrequency(float hz) diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index a80ffe303..45b66856d 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -70,7 +70,7 @@ namespace box2d void RevoluteJoint::setMaxMotorTorque(float torque) { - joint->SetMaxMotorTorque(torque); + joint->SetMaxMotorTorque(Physics::scaleDown(Physics::scaleDown(torque))); } void RevoluteJoint::setMotorSpeed(float speed) @@ -85,7 +85,7 @@ namespace box2d float RevoluteJoint::getMotorTorque(float inv_dt) const { - return joint->GetMotorTorque(inv_dt); + return Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(inv_dt))); } void RevoluteJoint::enableLimit(bool limit) diff --git a/src/modules/physics/box2d/RevoluteJoint.h b/src/modules/physics/box2d/RevoluteJoint.h index c5b255e23..3043f19c6 100644 --- a/src/modules/physics/box2d/RevoluteJoint.h +++ b/src/modules/physics/box2d/RevoluteJoint.h @@ -76,12 +76,12 @@ namespace box2d void setMaxMotorTorque(float torque); /** - * Sets the motor speed in degrees per second. + * Sets the motor speed in radians per second. **/ void setMotorSpeed(float speed); /** - * Gets the motor speed in degrees per second. + * Gets the motor speed in radians per second. **/ float getMotorSpeed() const; diff --git a/src/modules/physics/box2d/WheelJoint.cpp b/src/modules/physics/box2d/WheelJoint.cpp index 2a7fb7317..c818d1fb6 100644 --- a/src/modules/physics/box2d/WheelJoint.cpp +++ b/src/modules/physics/box2d/WheelJoint.cpp @@ -70,47 +70,47 @@ namespace box2d void WheelJoint::setMotorSpeed(float speed) { - joint->SetMotorSpeed(Physics::scaleDown(speed)); + joint->SetMotorSpeed(speed); } float WheelJoint::getMotorSpeed() const { - return Physics::scaleUp(joint->GetMotorSpeed()); + return joint->GetMotorSpeed(); } void WheelJoint::setMaxMotorTorque(float torque) { - joint->SetMaxMotorTorque(Physics::scaleDown(torque)); + joint->SetMaxMotorTorque(Physics::scaleDown(Physics::scaleDown(torque))); } float WheelJoint::getMaxMotorTorque() const { - return Physics::scaleUp(joint->GetMaxMotorTorque()); + return Physics::scaleUp(Physics::scaleUp(joint->GetMaxMotorTorque())); } float WheelJoint::getMotorTorque(float inv_dt) const { - return Physics::scaleUp(joint->GetMotorTorque(inv_dt)); + return Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(inv_dt))); } void WheelJoint::setSpringFrequencyHz(float hz) { - joint->SetSpringFrequencyHz(Physics::scaleDown(hz)); + joint->SetSpringFrequencyHz(hz); } float WheelJoint::getSpringFrequencyHz() const { - return Physics::scaleUp(joint->GetSpringFrequencyHz()); + return joint->GetSpringFrequencyHz(); } void WheelJoint::setSpringDampingRatio(float ratio) { - joint->SetSpringDampingRatio(Physics::scaleDown(ratio)); + joint->SetSpringDampingRatio(ratio); } float WheelJoint::getSpringDampingRatio() const { - return Physics::scaleUp(joint->GetSpringDampingRatio()); + return joint->GetSpringDampingRatio(); } From 53cdd0ea7d809929ddcb93fe63cdda4be03d8b39 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 29 Sep 2011 11:12:03 -0400 Subject: [PATCH 238/384] Add RevoluteJoint:getMaxMotorTorque --HG-- branch : box2d-update --- src/modules/physics/box2d/RevoluteJoint.cpp | 5 +++++ src/modules/physics/box2d/RevoluteJoint.h | 5 +++++ src/modules/physics/box2d/wrap_RevoluteJoint.cpp | 8 ++++++++ src/modules/physics/box2d/wrap_RevoluteJoint.h | 1 + 4 files changed, 19 insertions(+) diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index 45b66856d..3beaa136c 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -87,6 +87,11 @@ namespace box2d { return Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(inv_dt))); } + + float RevoluteJoint::getMaxMotorTorque() + { + return Physics::scaleUp(Physics::scaleUp(joint->GetMaxMotorTorque())); + } void RevoluteJoint::enableLimit(bool limit) { diff --git a/src/modules/physics/box2d/RevoluteJoint.h b/src/modules/physics/box2d/RevoluteJoint.h index 3043f19c6..5c6c95096 100644 --- a/src/modules/physics/box2d/RevoluteJoint.h +++ b/src/modules/physics/box2d/RevoluteJoint.h @@ -91,6 +91,11 @@ namespace box2d **/ float getMotorTorque(float inv_dt) const; + /** + * Get the maximum motor torque, usually in N-m. + **/ + float getMaxMotorTorque(); + /** * Enable/disable the joint limit. **/ diff --git a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp index d6517e687..51b092eed 100644 --- a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp +++ b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp @@ -90,6 +90,13 @@ namespace box2d 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_enableLimit(lua_State * L) { @@ -161,6 +168,7 @@ namespace box2d { "setMotorSpeed", w_RevoluteJoint_setMotorSpeed }, { "getMotorSpeed", w_RevoluteJoint_getMotorSpeed }, { "getMotorTorque", w_RevoluteJoint_getMotorTorque }, + { "getMaxMotorTorque", w_RevoluteJoint_getMaxMotorTorque }, { "enableLimit", w_RevoluteJoint_enableLimit }, { "isLimitEnabled", w_RevoluteJoint_isLimitEnabled }, { "setUpperLimit", w_RevoluteJoint_setUpperLimit }, diff --git a/src/modules/physics/box2d/wrap_RevoluteJoint.h b/src/modules/physics/box2d/wrap_RevoluteJoint.h index 1e13aec3a..a06767b6c 100644 --- a/src/modules/physics/box2d/wrap_RevoluteJoint.h +++ b/src/modules/physics/box2d/wrap_RevoluteJoint.h @@ -41,6 +41,7 @@ namespace box2d 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_enableLimit(lua_State * L); int w_RevoluteJoint_isLimitEnabled(lua_State * L); int w_RevoluteJoint_setUpperLimit(lua_State * L); From fa58c87605e4bf6f42e44e12f3e1a849e9a7af68 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 29 Sep 2011 11:14:42 -0400 Subject: [PATCH 239/384] Add PrismaticJoint:getMaxMotorForce --HG-- branch : box2d-update --- src/modules/physics/box2d/PrismaticJoint.cpp | 5 +++++ src/modules/physics/box2d/PrismaticJoint.h | 5 +++++ src/modules/physics/box2d/RevoluteJoint.cpp | 2 +- src/modules/physics/box2d/RevoluteJoint.h | 2 +- src/modules/physics/box2d/wrap_PrismaticJoint.cpp | 8 ++++++++ src/modules/physics/box2d/wrap_PrismaticJoint.h | 1 + 6 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/modules/physics/box2d/PrismaticJoint.cpp b/src/modules/physics/box2d/PrismaticJoint.cpp index 276cb5493..d9b407a7d 100644 --- a/src/modules/physics/box2d/PrismaticJoint.cpp +++ b/src/modules/physics/box2d/PrismaticJoint.cpp @@ -90,6 +90,11 @@ namespace box2d { return Physics::scaleUp(joint->GetMotorForce(inv_dt)); } + + float PrismaticJoint::getMaxMotorForce() const + { + return Physics::scaleUp(joint->GetMaxMotorForce()); + } void PrismaticJoint::enableLimit(bool limit) { diff --git a/src/modules/physics/box2d/PrismaticJoint.h b/src/modules/physics/box2d/PrismaticJoint.h index b7c5efeec..c267f4ec7 100644 --- a/src/modules/physics/box2d/PrismaticJoint.h +++ b/src/modules/physics/box2d/PrismaticJoint.h @@ -91,6 +91,11 @@ namespace box2d **/ float getMotorForce(float inv_dt) const; + /** + * Get the maximum motor force, usually in N. + **/ + float getMaxMotorForce() const; + /** * Enable/disable the joint limit. **/ diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index 3beaa136c..30ef8ce14 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -88,7 +88,7 @@ namespace box2d return Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(inv_dt))); } - float RevoluteJoint::getMaxMotorTorque() + float RevoluteJoint::getMaxMotorTorque() const { return Physics::scaleUp(Physics::scaleUp(joint->GetMaxMotorTorque())); } diff --git a/src/modules/physics/box2d/RevoluteJoint.h b/src/modules/physics/box2d/RevoluteJoint.h index 5c6c95096..2147b59e1 100644 --- a/src/modules/physics/box2d/RevoluteJoint.h +++ b/src/modules/physics/box2d/RevoluteJoint.h @@ -94,7 +94,7 @@ namespace box2d /** * Get the maximum motor torque, usually in N-m. **/ - float getMaxMotorTorque(); + float getMaxMotorTorque() const; /** * Enable/disable the joint limit. diff --git a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp index a09344a06..5d9d04953 100644 --- a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp +++ b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp @@ -90,6 +90,13 @@ namespace box2d 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_enableLimit(lua_State * L) { @@ -161,6 +168,7 @@ namespace box2d { "setMotorSpeed", w_PrismaticJoint_setMotorSpeed }, { "getMotorSpeed", w_PrismaticJoint_getMotorSpeed }, { "getMotorForce", w_PrismaticJoint_getMotorForce }, + { "getMaxMotorForce", w_PrismaticJoint_getMaxMotorForce }, { "enableLimit", w_PrismaticJoint_enableLimit }, { "isLimitEnabled", w_PrismaticJoint_isLimitEnabled }, { "setUpperLimit", w_PrismaticJoint_setUpperLimit }, diff --git a/src/modules/physics/box2d/wrap_PrismaticJoint.h b/src/modules/physics/box2d/wrap_PrismaticJoint.h index 203edaea7..3f7152338 100644 --- a/src/modules/physics/box2d/wrap_PrismaticJoint.h +++ b/src/modules/physics/box2d/wrap_PrismaticJoint.h @@ -41,6 +41,7 @@ namespace box2d 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_enableLimit(lua_State * L); int w_PrismaticJoint_isLimitEnabled(lua_State * L); int w_PrismaticJoint_setUpperLimit(lua_State * L); From 5d26c564e052ad3298a05e0bfaee10d45d60ce96 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 29 Sep 2011 11:19:30 -0400 Subject: [PATCH 240/384] Add EdgeShape:getPoints() --HG-- branch : box2d-update --- src/modules/physics/box2d/EdgeShape.cpp | 14 ++++++++++++++ src/modules/physics/box2d/EdgeShape.h | 8 ++++++++ src/modules/physics/box2d/wrap_EdgeShape.cpp | 8 ++++++++ src/modules/physics/box2d/wrap_EdgeShape.h | 1 + 4 files changed, 31 insertions(+) diff --git a/src/modules/physics/box2d/EdgeShape.cpp b/src/modules/physics/box2d/EdgeShape.cpp index 1416419b1..2795d2d11 100644 --- a/src/modules/physics/box2d/EdgeShape.cpp +++ b/src/modules/physics/box2d/EdgeShape.cpp @@ -23,6 +23,7 @@ // Module #include "Body.h" #include "World.h" +#include "Physics.h" #include @@ -43,6 +44,19 @@ namespace box2d delete shape; shape = NULL; } + + 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 diff --git a/src/modules/physics/box2d/EdgeShape.h b/src/modules/physics/box2d/EdgeShape.h index 67569b51b..6f51c2008 100644 --- a/src/modules/physics/box2d/EdgeShape.h +++ b/src/modules/physics/box2d/EdgeShape.h @@ -45,6 +45,14 @@ namespace box2d EdgeShape(b2EdgeShape * e); 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 diff --git a/src/modules/physics/box2d/wrap_EdgeShape.cpp b/src/modules/physics/box2d/wrap_EdgeShape.cpp index 3a8f23276..5d4d113d1 100644 --- a/src/modules/physics/box2d/wrap_EdgeShape.cpp +++ b/src/modules/physics/box2d/wrap_EdgeShape.cpp @@ -30,8 +30,16 @@ namespace box2d { 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 }, diff --git a/src/modules/physics/box2d/wrap_EdgeShape.h b/src/modules/physics/box2d/wrap_EdgeShape.h index 4b9cba3b4..9a5a39be0 100644 --- a/src/modules/physics/box2d/wrap_EdgeShape.h +++ b/src/modules/physics/box2d/wrap_EdgeShape.h @@ -33,6 +33,7 @@ namespace physics namespace box2d { EdgeShape * luax_checkedgeshape(lua_State * L, int idx); + int w_EdgeShape_getPoints(lua_State * L); int luaopen_edgeshape(lua_State * L); } // box2d From eb7053b43f9456ac9dfd94bbf19fd542fa6b7e9b Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 30 Sep 2011 14:57:03 +0200 Subject: [PATCH 241/384] Switch love.timer over to double precision floats --- src/modules/timer/sdl/Timer.cpp | 24 ++++++++++++------------ src/modules/timer/sdl/Timer.h | 19 ++++++++----------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/modules/timer/sdl/Timer.cpp b/src/modules/timer/sdl/Timer.cpp index 2428b5855..da9dca743 100644 --- a/src/modules/timer/sdl/Timer.cpp +++ b/src/modules/timer/sdl/Timer.cpp @@ -37,7 +37,7 @@ namespace timer namespace sdl { Timer::Timer() - : time_init(0), currTime(0), prevFpsUpdate(0), fps(0), fpsUpdateFrequency(1), + : currTime(0), prevFpsUpdate(0), fps(0), fpsUpdateFrequency(1), frames(0), dt(0) { // Init the SDL timer system. @@ -68,10 +68,10 @@ namespace sdl currTime = SDL_GetTicks(); // Convert to number of seconds - dt = (currTime - prevTime)/1000.0f; + dt = (currTime - prevTime)/1000.0; // Update FPS? - if((currTime - prevFpsUpdate)/1000.0f > fpsUpdateFrequency) + if((currTime - prevFpsUpdate)/1000.0 > fpsUpdateFrequency) { fps = frames/fpsUpdateFrequency; prevFpsUpdate = currTime; @@ -79,28 +79,28 @@ namespace sdl } } - void Timer::sleep(float seconds) + void Timer::sleep(double seconds) { if(seconds > 0) delay((int) (seconds*1000)); } - float Timer::getDelta() const + double Timer::getDelta() const { return dt; } - float Timer::getFPS() const + double Timer::getFPS() const { return fps; } - float Timer::getTime() const + double Timer::getTime() const { - return (SDL_GetTicks() - time_init)/1000.0f; + return SDL_GetTicks()/1000.0; } - float Timer::getMicroTime() const + double Timer::getMicroTime() const { #ifdef LOVE_WINDOWS __int64 ticks, freq; @@ -110,12 +110,12 @@ namespace sdl QueryPerformanceFrequency(&temp); freq = temp.QuadPart; __int64 secs = ticks/freq; - __int64 usecs = static_cast<__int64>((ticks%freq)/(freq/1000000.0f)); - return secs%86400 + usecs/1000000.0f; + __int64 usecs = static_cast<__int64>((ticks%freq)/(freq/1000000.0)); + return secs%86400 + usecs/1000000.0; #else timeval t; gettimeofday(&t, NULL); - return t.tv_sec%86400 + t.tv_usec/1000000.0f; + return t.tv_sec%86400 + t.tv_usec/1000000.0; #endif } diff --git a/src/modules/timer/sdl/Timer.h b/src/modules/timer/sdl/Timer.h index cea9b28ff..9f8772d48 100644 --- a/src/modules/timer/sdl/Timer.h +++ b/src/modules/timer/sdl/Timer.h @@ -41,25 +41,22 @@ namespace sdl { private: - // Timing vars for benchmarking. - Uint32 time_init; - // Frame delta vars. Uint32 currTime; Uint32 prevTime; Uint32 prevFpsUpdate; // Updated with a certain frequency. - float fps; + double fps; // The frequency by which to update the FPS. - float fpsUpdateFrequency; + double fpsUpdateFrequency; // Frames since last FPS update. int frames; // The current timestep. - float dt; + double dt; public: @@ -90,34 +87,34 @@ namespace sdl * usually 1ms. * @param seconds The number of seconds to sleep for. **/ - void sleep(float seconds); + void sleep(double seconds); /** * Gets the time between the last two frames, assuming step is called * each frame. **/ - float getDelta() const; + double getDelta() const; /** * 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. **/ - float getFPS() const; + double getFPS() const; /** * Gets the amount of time since the program started. Only useful for timing * code or measuring intervals. * @return The time (in seconds) since the program started. **/ - float getTime() const; + double getTime() const; /** * Gets the amount of time passed since an unspecified time. The time is accurate * to the microsecond, and is limited to 24 hours. * @return The time (in seconds) **/ - float getMicroTime() const; + double getMicroTime() const; }; // Timer From ffef6f58a94201ebaf72449abcab61838fd03471 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 2 Oct 2011 09:28:39 -0400 Subject: [PATCH 242/384] Make Joint::getReactionForce use the right stack position --HG-- branch : box2d-update --- src/modules/physics/box2d/Joint.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/Joint.cpp b/src/modules/physics/box2d/Joint.cpp index 13a29f18a..97aa16785 100644 --- a/src/modules/physics/box2d/Joint.cpp +++ b/src/modules/physics/box2d/Joint.cpp @@ -97,7 +97,7 @@ namespace box2d int Joint::getReactionForce(lua_State * L) { - float dt = (float)luaL_checknumber(L, 2); + float dt = (float)luaL_checknumber(L, 1); b2Vec2 v = Physics::scaleUp(joint->GetReactionForce(dt)); lua_pushnumber(L, v.x); lua_pushnumber(L, v.y); From 735c52b228a52413c4be00245aa38dc3b5942c18 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 2 Oct 2011 09:33:42 -0400 Subject: [PATCH 243/384] make love.physics.setMeter error on invalid meters (anything less than 1) --HG-- branch : box2d-update --- src/modules/physics/box2d/Physics.cpp | 1 + src/modules/physics/box2d/wrap_Physics.cpp | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 7ba45f241..37aa766a0 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -234,6 +234,7 @@ namespace box2d void Physics::setMeter(int meter) { + if (meter < 1) throw love::Exception("Physics error: invalid meter"); Physics::meter = meter; } diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 0d7f409bc..b1af0a61d 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -304,7 +304,11 @@ namespace box2d int w_setMeter(lua_State * L) { int arg1 = luaL_checkint(L, 1); - Physics::setMeter(arg1); + try { + Physics::setMeter(arg1); + } catch (love::Exception e) { + return luaL_error(L, e.what()); + } return 0; } From f38655a934167a8279ded7ff2edb6f4eb10fa0ce Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 2 Oct 2011 10:06:31 -0400 Subject: [PATCH 244/384] Add second body anchor point to FrictionJoint/WeldJoint constructors --HG-- branch : box2d-update --- src/modules/physics/box2d/FrictionJoint.cpp | 5 +-- src/modules/physics/box2d/FrictionJoint.h | 2 +- src/modules/physics/box2d/Physics.cpp | 8 ++--- src/modules/physics/box2d/Physics.h | 16 +++++---- src/modules/physics/box2d/WeldJoint.cpp | 5 +-- src/modules/physics/box2d/WeldJoint.h | 2 +- src/modules/physics/box2d/wrap_Physics.cpp | 36 ++++++++++++++++----- 7 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/modules/physics/box2d/FrictionJoint.cpp b/src/modules/physics/box2d/FrictionJoint.cpp index 7449aab19..524c746f7 100644 --- a/src/modules/physics/box2d/FrictionJoint.cpp +++ b/src/modules/physics/box2d/FrictionJoint.cpp @@ -33,11 +33,12 @@ namespace physics { namespace box2d { - FrictionJoint::FrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + 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(x,y))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); + def.localAnchorB = Physics::scaleDown(b2Vec2(xB, yB)); def.collideConnected = collideConnected; joint = (b2FrictionJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/FrictionJoint.h b/src/modules/physics/box2d/FrictionJoint.h index d334c4799..e0dbb2f60 100644 --- a/src/modules/physics/box2d/FrictionJoint.h +++ b/src/modules/physics/box2d/FrictionJoint.h @@ -45,7 +45,7 @@ namespace box2d /** * Creates a new FrictionJoint connecting body1 and body2. **/ - FrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); + FrictionJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected); virtual ~FrictionJoint(); diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 37aa766a0..55cb889f2 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -182,14 +182,14 @@ namespace box2d return new GearJoint(joint1, joint2, ratio, collideConnected); } - FrictionJoint * Physics::newFrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + FrictionJoint * Physics::newFrictionJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected) { - return new FrictionJoint(body1, body2, x, y, collideConnected); + return new FrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected); } - WeldJoint * Physics::newWeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + WeldJoint * Physics::newWeldJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected) { - return new WeldJoint(body1, body2, x, y, 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) diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 2c4491d3f..d04dc2755 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -215,19 +215,23 @@ namespace box2d /** * Creates a new FrictionJoint connecting body1 with body2. - * @param x Anchor along the x-axis. (World coordinates) - * @param y Anchor along the y-axis. (World coordinates) + * @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 x, float y, bool collideConnected); + 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 x Anchor along the x-axis. (World coordinates) - * @param y Anchor along the y-axis. (World coordinates) + * @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 x, float y, bool collideConnected); + WeldJoint * newWeldJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected); /** * Creates a new WheelJoint connecting body1 with body2. diff --git a/src/modules/physics/box2d/WeldJoint.cpp b/src/modules/physics/box2d/WeldJoint.cpp index b2882d0be..7e437437a 100644 --- a/src/modules/physics/box2d/WeldJoint.cpp +++ b/src/modules/physics/box2d/WeldJoint.cpp @@ -33,11 +33,12 @@ namespace physics { namespace box2d { - WeldJoint::WeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + 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(x,y))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); + def.localAnchorB = Physics::scaleDown(b2Vec2(xB, yB)); def.collideConnected = collideConnected; joint = (b2WeldJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/WeldJoint.h b/src/modules/physics/box2d/WeldJoint.h index e8469dac2..c62b1912c 100644 --- a/src/modules/physics/box2d/WeldJoint.h +++ b/src/modules/physics/box2d/WeldJoint.h @@ -45,7 +45,7 @@ namespace box2d /** * Creates a new WeldJoint connecting body1 and body2. **/ - WeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); + WeldJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected); virtual ~WeldJoint(); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index b1af0a61d..d9cb427c8 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -234,10 +234,20 @@ namespace box2d { 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); - FrictionJoint * j = instance->newFrictionJoint(body1, body2, x, y, collideConnected); + 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 = instance->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected); luax_newtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, (void*)j); return 1; } @@ -246,10 +256,20 @@ namespace box2d { 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); - WeldJoint * j = instance->newWeldJoint(body1, body2, x, y, collideConnected); + 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 = instance->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected); luax_newtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, (void*)j); return 1; } From 66ecf8aff004a4d64bd7226bc41cb676c1e1dfef Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 2 Oct 2011 16:11:24 +0200 Subject: [PATCH 245/384] Apply patch for increased timer accuracy (issue #303) --- src/modules/timer/sdl/Timer.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/modules/timer/sdl/Timer.cpp b/src/modules/timer/sdl/Timer.cpp index da9dca743..e15505d34 100644 --- a/src/modules/timer/sdl/Timer.cpp +++ b/src/modules/timer/sdl/Timer.cpp @@ -103,19 +103,27 @@ namespace sdl double Timer::getMicroTime() const { #ifdef LOVE_WINDOWS - __int64 ticks, freq; - LARGE_INTEGER temp; - QueryPerformanceCounter(&temp); - ticks = temp.QuadPart; - QueryPerformanceFrequency(&temp); - freq = temp.QuadPart; - __int64 secs = ticks/freq; - __int64 usecs = static_cast<__int64>((ticks%freq)/(freq/1000000.0)); - return secs%86400 + usecs/1000000.0; + static __int64 freq = 0; + + if (!freq) + { + LARGE_INTEGER temp; + QueryPerformanceFrequency(&temp); + + freq = (__int64) temp.QuadPart; + } + + LARGE_INTEGER microTime; + QueryPerformanceCounter(µTime); + + // The 64 to 32 bit integer conversion, assuming the fraction part down + // to microseconds takes 20 bits, should not be a problem unless the + // system has an uptime of a few decades. + return (double) microTime.QuadPart / (double) freq; #else timeval t; gettimeofday(&t, NULL); - return t.tv_sec%86400 + t.tv_usec/1000000.0; + return t.tv_sec + t.tv_usec/1000000.0; #endif } From 705fa14736e5e5cf9342498095eed0a6a703077d Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 2 Oct 2011 10:28:37 -0400 Subject: [PATCH 246/384] Forgot to put the second anchor points in local coordinates --HG-- branch : box2d-update --- src/modules/physics/box2d/FrictionJoint.cpp | 2 +- src/modules/physics/box2d/WeldJoint.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/physics/box2d/FrictionJoint.cpp b/src/modules/physics/box2d/FrictionJoint.cpp index 524c746f7..416f58a5c 100644 --- a/src/modules/physics/box2d/FrictionJoint.cpp +++ b/src/modules/physics/box2d/FrictionJoint.cpp @@ -38,7 +38,7 @@ namespace box2d { b2FrictionJointDef def; def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); - def.localAnchorB = Physics::scaleDown(b2Vec2(xB, yB)); + def.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB))); def.collideConnected = collideConnected; joint = (b2FrictionJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/WeldJoint.cpp b/src/modules/physics/box2d/WeldJoint.cpp index 7e437437a..2360a517e 100644 --- a/src/modules/physics/box2d/WeldJoint.cpp +++ b/src/modules/physics/box2d/WeldJoint.cpp @@ -38,7 +38,7 @@ namespace box2d { b2WeldJointDef def; def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); - def.localAnchorB = Physics::scaleDown(b2Vec2(xB, yB)); + def.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB))); def.collideConnected = collideConnected; joint = (b2WeldJoint*)createJoint(&def); } From bd2172f8269ab67af1eada959a038a18c17552a8 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 2 Oct 2011 17:00:09 +0200 Subject: [PATCH 247/384] Update version keeping --- src/common/version.h | 5 ++--- src/love.cpp | 9 +++------ src/scripts/boot.lua | 2 +- src/scripts/boot.lua.h | 7 +++---- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/common/version.h b/src/common/version.h index c475dc3a8..a40ee5b8b 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -27,9 +27,8 @@ namespace love const int VERSION_MAJOR = 0; const int VERSION_MINOR = 8; const int VERSION_REV = 0; - const int VERSION = VERSION_MAJOR*100 + VERSION_MINOR*10 + VERSION_REV; - const int VERSION_COMPATIBILITY[] = { VERSION, 072, 071, 070, 0 }; - const char * VERSION_STR = "0.8.0"; + const char * VERSION = "0.8.0"; + const char * VERSION_COMPATIBILITY[] = { VERSION }; const char * VERSION_CODENAME = "Rubber Piggy"; } // love diff --git a/src/love.cpp b/src/love.cpp index f875b486b..dfbaa275b 100644 --- a/src/love.cpp +++ b/src/love.cpp @@ -92,12 +92,9 @@ extern "C" LOVE_EXPORT int luaopen_love(lua_State * L) love::luax_insistglobal(L, "love"); // Set version information. - lua_pushinteger(L, love::VERSION); + lua_pushstring(L, love::VERSION); lua_setfield(L, -2, "_version"); - lua_pushstring(L, love::VERSION_STR); - lua_setfield(L, -2, "_version_string"); - lua_pushstring(L, love::VERSION_CODENAME); lua_setfield(L, -2, "_version_codename"); @@ -110,7 +107,7 @@ extern "C" LOVE_EXPORT int luaopen_love(lua_State * L) for(int i = 0; love::VERSION_COMPATIBILITY[i] != 0; ++i) { - lua_pushinteger(L, love::VERSION_COMPATIBILITY[i]); + lua_pushstring(L, love::VERSION_COMPATIBILITY[i]); lua_rawseti(L, -2, i+1); } @@ -239,7 +236,7 @@ int main(int argc, char ** argv) // Oh, you just want the version? Okay! if(argc > 1 && strcmp(argv[1],"--version") == 0) { - printf("LOVE %s (%s)\n", love::VERSION_STR, love::VERSION_CODENAME); + printf("LOVE %s (%s)\n", love::VERSION, love::VERSION_CODENAME); return 0; } diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 725d9c9f9..b874a7539 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -601,7 +601,7 @@ function love.nogame() end function love.conf(t) - t.title = "L\195\150VE " .. love._version_string .. " (" .. love._version_codename .. ")" + t.title = "L\195\150VE " .. love._version .. " (" .. love._version_codename .. ")" t.modules.audio = false t.modules.sound = false t.modules.physics = false diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 64338e684..460dbfb00 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -1512,10 +1512,9 @@ const unsigned char boot_lua[] = 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, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 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, + 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, From 4f707428752f2fe89ed062f145647b664ea8a8bb Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 3 Oct 2011 00:52:44 +0200 Subject: [PATCH 248/384] Display a warning if the game's version is incompatible. --- src/love.cpp | 7 +++++ src/scripts/boot.lua | 29 +++++++++++++++++- src/scripts/boot.lua.h | 68 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 102 insertions(+), 2 deletions(-) diff --git a/src/love.cpp b/src/love.cpp index dfbaa275b..b2ec85caa 100644 --- a/src/love.cpp +++ b/src/love.cpp @@ -95,6 +95,13 @@ extern "C" LOVE_EXPORT int luaopen_love(lua_State * L) 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"); diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index b874a7539..93aa4f693 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -225,7 +225,7 @@ function love.init() local c = { title = "Untitled", author = "Unnamed", - version = 0, + version = love._version, screen = { width = 800, height = 600, @@ -315,6 +315,33 @@ function love.init() love._openConsole() 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 + 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 version that is probably incompatible.\n".. + "The game might still work, but it is not guaranteed.\n" .. + "Furthermore, this means one should not judge this game or the engine if not." + print(msg) + if love.graphics and love.timer and love.event then + love.event.pump() + love.graphics.setBackgroundColor(89, 157, 220) + love.graphics.clear() + love.graphics.print(msg, 70, 70) + love.graphics.present() + love.graphics.setBackgroundColor(0, 0, 0) + love.timer.sleep(3) + end + end + end + end function love.run() diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 460dbfb00..9944e00e0 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -377,7 +377,8 @@ const unsigned char boot_lua[] = 0x64, 0x22, 0x2c, 0x0a, 0x09, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x22, 0x2c, 0x0a, - 0x09, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 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, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 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, @@ -531,6 +532,71 @@ const unsigned char boot_lua[] = 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,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, 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, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x2e, 0x5c, 0x6e, 0x22, 0x2e, 0x2e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x22, 0x54, 0x68, 0x65, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x64, 0x2e, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x22, 0x46, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x2c, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6a, 0x75, 0x64, 0x67, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x2e, 0x22, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, + 0x73, 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, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x75, 0x6d, + 0x70, 0x28, 0x29, 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, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 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, 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, 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, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x6c, 0x65, + 0x65, 0x70, 0x28, 0x33, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, 0x65, 0x6e, 0x64, 0x0a,0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x75, 0x6e, 0x28, 0x29, 0x0a,0x0a, From 2949d2ea4ac49b0dca4553f9f90bf308695aadb6 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 3 Oct 2011 01:38:13 -0400 Subject: [PATCH 249/384] Update Xcode project to support 64-bit builds, and clean up some old project cruft --- .../macosx/love.xcodeproj/project.pbxproj | 35 +++---------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 82403be1b..777206514 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -1704,29 +1704,13 @@ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = love_Prefix.pch; - HEADER_SEARCH_PATHS = ( - /Library/Frameworks/Lua.framework/Headers, - /Library/Frameworks/FreeType.framework/Headers, - /Library/Frameworks/SDL.framework/Headers, - ../../src, - ../../src/modules, - ); INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); PRODUCT_NAME = love; }; name = Debug; @@ -1734,30 +1718,20 @@ C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = love_Prefix.pch; INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = love; - SDKROOT = ""; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES; @@ -1797,7 +1771,6 @@ OTHER_LDFLAGS = ""; PRODUCT_NAME = love; SDKROOT = macosx; - VALID_ARCHS = "i386 ppc"; WARNING_CFLAGS = ( "-W", "-Wall", @@ -1808,7 +1781,8 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; DEPLOYMENT_POSTPROCESSING = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; @@ -1853,7 +1827,6 @@ SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = ""; - VALID_ARCHS = "i386 ppc"; WARNING_CFLAGS = ( "-W", "-Wall", From 73de544d214423c2a8d5d0d7cb00dbc02f011fd3 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 3 Oct 2011 09:40:41 +0200 Subject: [PATCH 250/384] Add getWidth and getHeight to Canvas (issue #307) --- src/modules/graphics/opengl/wrap_Canvas.cpp | 16 ++++++++++++++++ src/modules/graphics/opengl/wrap_Canvas.h | 2 ++ 2 files changed, 18 insertions(+) diff --git a/src/modules/graphics/opengl/wrap_Canvas.cpp b/src/modules/graphics/opengl/wrap_Canvas.cpp index 5eb9f6070..692f58b2c 100644 --- a/src/modules/graphics/opengl/wrap_Canvas.cpp +++ b/src/modules/graphics/opengl/wrap_Canvas.cpp @@ -140,6 +140,20 @@ namespace opengl 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; + } + static const luaL_Reg functions[] = { { "renderTo", w_Canvas_renderTo }, { "getImageData", w_Canvas_getImageData }, @@ -148,6 +162,8 @@ namespace opengl { "setWrap", w_Canvas_setWrap }, { "getWrap", w_Canvas_getWrap }, { "clear", w_Canvas_clear }, + { "getWidth", w_Canvas_getWidth }, + { "getHeight", w_Canvas_getHeight }, { 0, 0 } }; diff --git a/src/modules/graphics/opengl/wrap_Canvas.h b/src/modules/graphics/opengl/wrap_Canvas.h index 257b6c038..05f7ab5ad 100644 --- a/src/modules/graphics/opengl/wrap_Canvas.h +++ b/src/modules/graphics/opengl/wrap_Canvas.h @@ -20,6 +20,8 @@ namespace opengl 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 luaopen_canvas(lua_State * L); } // opengl From 9425c56de8c5bd886af4ee9433cba37fe7a1a01b Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 4 Oct 2011 15:19:17 +0200 Subject: [PATCH 251/384] Null terminate version compatibility list --- src/common/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/version.h b/src/common/version.h index a40ee5b8b..1bffde34f 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -28,7 +28,7 @@ namespace love const int VERSION_MINOR = 8; const int VERSION_REV = 0; const char * VERSION = "0.8.0"; - const char * VERSION_COMPATIBILITY[] = { VERSION }; + const char * VERSION_COMPATIBILITY[] = { VERSION, 0 }; const char * VERSION_CODENAME = "Rubber Piggy"; } // love From 4cb247b3ea6fafdbc1c064dd0d14f1d716ee8aaf Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 4 Oct 2011 11:34:33 -0400 Subject: [PATCH 252/384] Change how Canvas is flipped and add Canvas::drawq --- src/modules/graphics/opengl/Canvas.cpp | 55 ++++++++++++++++---------- src/modules/graphics/opengl/Canvas.h | 12 ++++++ 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index 60cf10ca2..70d66c13c 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -177,10 +177,10 @@ namespace opengl vertices[3].x = w; vertices[3].y = 0; // texture coordinates - vertices[0].s = 0; vertices[0].t = 1; - vertices[1].s = 0; vertices[1].t = 0; - vertices[2].s = 1; vertices[2].t = 0; - vertices[3].s = 1; vertices[3].t = 1; + 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; loadStrategy(); @@ -228,8 +228,8 @@ namespace opengl glPushMatrix(); glLoadIdentity(); - // Set up orthographic view (no depth) - glOrtho(0.0, width, height, 0.0, -1.0, 1.0); + // Set up upside-down orthographic view (no depth) + glOrtho(0.0, width, 0.0, height, -1.0, 1.0); // Switch back to modelview matrix glMatrixMode(GL_MODELVIEW); @@ -273,20 +273,16 @@ namespace opengl static Matrix t; t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); - glPushMatrix(); - glMultMatrixf((const GLfloat*)t.getElements()); - - glBindTexture(GL_TEXTURE_2D, img); - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glVertexPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)&vertices[0].x); - glTexCoordPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)&vertices[0].s); - glDrawArrays(GL_QUADS, 0, 4); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_VERTEX_ARRAY); - - glPopMatrix(); + 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; + const vertex * v = quad->getVertices(); + + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + drawv(t, v); } love::image::ImageData * Canvas::getImageData(love::image::Image * image) @@ -399,6 +395,25 @@ namespace opengl { return height; } + + void Canvas::drawv(const Matrix & t, const vertex * v) const + { + glPushMatrix(); + + glMultMatrixf((const GLfloat*)t.getElements()); + + glBindTexture(GL_TEXTURE_2D, img); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)&v[0].x); + glTexCoordPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)&v[0].s); + glDrawArrays(GL_QUADS, 0, 4); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + + glPopMatrix(); + } } // opengl } // graphics diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index a3ef7c323..40b9aed2d 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -8,7 +8,9 @@ #include #include #include +#include #include "GLee.h" +#include "Quad.h" namespace love { @@ -35,6 +37,14 @@ namespace opengl void clear(const Color& c); virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + /** + * This function draws a section of the canvas using a Quad object. + * + * @param quad Represents the region of the Canvas to draw. + **/ + void drawq(Quad * quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + love::image::ImageData * getImageData(love::image::Image * image); void setFilter(const Image::Filter &f); @@ -67,6 +77,8 @@ namespace opengl Image::Filter filter; Image::Wrap wrap; } settings; + + void drawv(const Matrix & t, const vertex * v) const; }; } // opengl From 14348f61466a7da02d9bc2e859875ea72f23372c Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 4 Oct 2011 12:33:34 -0400 Subject: [PATCH 253/384] Create DrawQable class, make Image and Canvas DrawQable, and make love.graphics.drawq take a DrawQable as its first argument --- .../macosx/love.xcodeproj/project.pbxproj | 12 ++++ src/common/types.h | 6 +- src/modules/graphics/DrawQable.cpp | 33 ++++++++++ src/modules/graphics/DrawQable.h | 64 +++++++++++++++++++ src/modules/graphics/Image.h | 4 +- src/modules/graphics/Quad.cpp | 36 +++++++++++ src/modules/graphics/Quad.h | 61 ++++++++++++++++++ src/modules/graphics/opengl/Canvas.cpp | 2 +- src/modules/graphics/opengl/Canvas.h | 17 ++--- src/modules/graphics/opengl/Image.cpp | 2 +- src/modules/graphics/opengl/Image.h | 9 +-- src/modules/graphics/opengl/Quad.h | 19 ++---- src/modules/graphics/opengl/wrap_Graphics.cpp | 8 +-- 13 files changed, 233 insertions(+), 40 deletions(-) create mode 100644 src/modules/graphics/DrawQable.cpp create mode 100644 src/modules/graphics/DrawQable.h create mode 100644 src/modules/graphics/Quad.cpp create mode 100644 src/modules/graphics/Quad.h diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 777206514..0a2ac25e2 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + A901B882143B65C500D77063 /* DrawQable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A901B880143B65C400D77063 /* DrawQable.cpp */; }; + A901B885143B661400D77063 /* Quad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A901B883143B661300D77063 /* Quad.cpp */; }; A9255DD11043183600BA1496 /* FreeType.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E4810420B4A007D418B /* FreeType.framework */; }; A9255DD21043183600BA1496 /* SDL.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5210420B57007D418B /* SDL.framework */; }; A9255DD31043183600BA1496 /* Lua.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; }; @@ -223,6 +225,10 @@ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 8D1107320486CEB800E47090 /* love.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = love.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A901B880143B65C400D77063 /* DrawQable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DrawQable.cpp; sourceTree = ""; }; + A901B881143B65C400D77063 /* DrawQable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawQable.h; sourceTree = ""; }; + A901B883143B661300D77063 /* Quad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Quad.cpp; sourceTree = ""; }; + A901B884143B661300D77063 /* Quad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Quad.h; sourceTree = ""; }; A9255DEA1043188D00BA1496 /* SDLMain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLMain.m; sourceTree = ""; }; A9255DEB1043188D00BA1496 /* SDLMain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLMain.h; sourceTree = ""; }; A9255E021043195A00BA1496 /* Vorbis.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Vorbis.framework; path = /Library/Frameworks/Vorbis.framework; sourceTree = ""; }; @@ -977,11 +983,15 @@ children = ( A93E6A8210420AC2007D418B /* Drawable.cpp */, A93E6A8310420AC2007D418B /* Drawable.h */, + A901B880143B65C400D77063 /* DrawQable.cpp */, + A901B881143B65C400D77063 /* DrawQable.h */, A968F0D21083A9D400A895AA /* Graphics.cpp */, A93E6A8410420AC2007D418B /* Graphics.h */, A93A3AB41121E86E003B04A4 /* Image.cpp */, A93E6A8510420AC2007D418B /* Image.h */, A93E6A8610420AC2007D418B /* opengl */, + A901B883143B661300D77063 /* Quad.cpp */, + A901B884143B661300D77063 /* Quad.h */, A93E6AA510420AC3007D418B /* Volatile.cpp */, A93E6AA610420AC3007D418B /* Volatile.h */, ); @@ -1695,6 +1705,8 @@ A96F41981412BC000067FE9A /* VertexBuffer.cpp in Sources */, A96F419B1412BC070067FE9A /* wrap_Canvas.cpp in Sources */, A96F419E1412BC0E0067FE9A /* wrap_PixelEffect.cpp in Sources */, + A901B882143B65C500D77063 /* DrawQable.cpp in Sources */, + A901B885143B661400D77063 /* Quad.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/common/types.h b/src/common/types.h index 214dc1313..5ce872c83 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -44,6 +44,7 @@ namespace love // Graphics GRAPHICS_DRAWABLE_ID, + GRAPHICS_DRAWQABLE_ID, GRAPHICS_IMAGE_ID, GRAPHICS_QUAD_ID, GRAPHICS_FONT_ID, @@ -107,12 +108,13 @@ namespace love // Graphics. const bits GRAPHICS_DRAWABLE_T = (bits(1) << GRAPHICS_DRAWABLE_ID) | OBJECT_T; - const bits GRAPHICS_IMAGE_T = (bits(1) << GRAPHICS_IMAGE_ID) | GRAPHICS_DRAWABLE_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_DRAWABLE_T; + const bits GRAPHICS_CANVAS_T = (bits(1) << GRAPHICS_CANVAS_ID) | GRAPHICS_DRAWQABLE_T; const bits GRAPHICS_PIXELEFFECT_T = (bits(1) << GRAPHICS_PIXELEFFECT_ID) | OBJECT_T; // Image. diff --git a/src/modules/graphics/DrawQable.cpp b/src/modules/graphics/DrawQable.cpp new file mode 100644 index 000000000..d39eda31f --- /dev/null +++ b/src/modules/graphics/DrawQable.cpp @@ -0,0 +1,33 @@ +/** +* 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. +**/ + +#include "DrawQable.h" + +namespace love +{ +namespace graphics +{ + + DrawQable::~DrawQable() + { + } + +} // graphics +} // love diff --git a/src/modules/graphics/DrawQable.h b/src/modules/graphics/DrawQable.h new file mode 100644 index 000000000..855cf9c31 --- /dev/null +++ b/src/modules/graphics/DrawQable.h @@ -0,0 +1,64 @@ +/** +* 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_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. + **/ + class DrawQable : public Drawable + { + public: + + /** + * Destructor. + **/ + virtual ~DrawQable(); + + /** + * Draws the object with the specified transformation. + * + * @param quad The Quad 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/src/modules/graphics/Image.h b/src/modules/graphics/Image.h index 9106239ea..3bb000b6b 100644 --- a/src/modules/graphics/Image.h +++ b/src/modules/graphics/Image.h @@ -23,7 +23,7 @@ // LOVE #include -#include +#include #include namespace love @@ -31,7 +31,7 @@ namespace love namespace graphics { - class Image : public Drawable, public Volatile + class Image : public DrawQable, public Volatile { public: diff --git a/src/modules/graphics/Quad.cpp b/src/modules/graphics/Quad.cpp new file mode 100644 index 000000000..cd4c379d5 --- /dev/null +++ b/src/modules/graphics/Quad.cpp @@ -0,0 +1,36 @@ +/** +* 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. +**/ + +#include "Quad.h" + +namespace love +{ +namespace graphics +{ + Quad::Quad() + { + } + + Quad::~Quad() + { + } + +} // graphics +} // love diff --git a/src/modules/graphics/Quad.h b/src/modules/graphics/Quad.h new file mode 100644 index 000000000..a3487039f --- /dev/null +++ b/src/modules/graphics/Quad.h @@ -0,0 +1,61 @@ +/** +* 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_QUAD_H +#define LOVE_GRAPHICS_QUAD_H + +// LOVE +#include +#include + +namespace love +{ +namespace graphics +{ + class Quad : public Object + { + public: + + struct Viewport + { + float x, y, w, h; + }; + + public: + Quad(); + + virtual ~Quad(); + + virtual void refresh(const Viewport & v, float sw, float sh) = 0; + + virtual void setViewport(const Viewport & v) = 0; + virtual Viewport getViewport() const = 0; + + virtual void flip(bool x, bool y) = 0; + + /** + * Gets a pointer to the vertices. + **/ + virtual const vertex * getVertices() const = 0; + }; +} // graphics +} // love + +#endif // LOVE_GRAPHICS_QUAD_H diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index 70d66c13c..88e731ac3 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -276,7 +276,7 @@ namespace opengl 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 + void Canvas::drawq(love::graphics::Quad * quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const { static Matrix t; const vertex * v = quad->getVertices(); diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index 40b9aed2d..9ab5bb4ac 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -1,7 +1,7 @@ -#ifndef LOVE_GRAPHICS_CANVAS_H -#define LOVE_GRAPHICS_CANVAS_H +#ifndef LOVE_GRAPHICS_OPENGL_CANVAS_H +#define LOVE_GRAPHICS_OPENGL_CANVAS_H -#include +#include #include #include #include @@ -10,7 +10,6 @@ #include #include #include "GLee.h" -#include "Quad.h" namespace love { @@ -18,7 +17,7 @@ namespace graphics { namespace opengl { - class Canvas : public Drawable, public Volatile + class Canvas : public DrawQable, public Volatile { public: Canvas(int width, int height); @@ -39,11 +38,9 @@ namespace opengl virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; /** - * This function draws a section of the canvas using a Quad object. - * - * @param quad Represents the region of the Canvas to draw. + * @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; + void drawq(love::graphics::Quad * quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; love::image::ImageData * getImageData(love::image::Image * image); @@ -85,4 +82,4 @@ namespace opengl } // graphics } // love -#endif // LOVE_GRAPHICS_CANVAS_H +#endif // LOVE_GRAPHICS_OPENGL_CANVAS_H diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index 7439deff7..ec0f6a133 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -110,7 +110,7 @@ namespace opengl 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 + void Image::drawq(love::graphics::Quad * quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const { static Matrix t; const vertex * v = quad->getVertices(); diff --git a/src/modules/graphics/opengl/Image.h b/src/modules/graphics/opengl/Image.h index 4fd1a6035..d97129d30 100644 --- a/src/modules/graphics/opengl/Image.h +++ b/src/modules/graphics/opengl/Image.h @@ -27,11 +27,9 @@ #include #include #include -#include "Quad.h" // OpenGL #include "GLee.h" -#include namespace love { @@ -114,12 +112,9 @@ namespace opengl void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; /** - * This function draws a section of the image using a Quad object. - * - * @copydetails Image::draws() - * @param frame Represents the region of the Image to draw. + * @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; + void drawq(love::graphics::Quad * quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; /** * Sets the filter mode. diff --git a/src/modules/graphics/opengl/Quad.h b/src/modules/graphics/opengl/Quad.h index b85c6ec39..10ff0bafc 100644 --- a/src/modules/graphics/opengl/Quad.h +++ b/src/modules/graphics/opengl/Quad.h @@ -22,9 +22,8 @@ #define LOVE_GRAPHICS_OPENGL_QUAD_H // LOVE -#include #include -#include +#include namespace love { @@ -32,19 +31,13 @@ namespace graphics { namespace opengl { - class Quad : public Object + class Quad : public love::graphics::Quad { - public: - - struct Viewport - { - float x, y, w, h; - }; - - private: - + + protected: + vertex vertices[4]; - + Viewport viewport; float sw, sh; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 5d8668944..f289a3093 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -19,7 +19,7 @@ **/ #include "wrap_Graphics.h" - +#include "DrawQable.h" #include #include @@ -800,7 +800,7 @@ namespace opengl } /** - * Draws an Quad of an Image at the specified coordinates, + * Draws an Quad of a DrawQable at the specified coordinates, * with rotation and scaling along both axes. * * @param q The Quad to draw. @@ -816,7 +816,7 @@ namespace opengl **/ int w_drawq(lua_State * L) { - Image * image = luax_checktype(L, 1, "Image", GRAPHICS_IMAGE_T); + DrawQable * dq = luax_checktype(L, 1, "DrawQable", GRAPHICS_DRAWQABLE_T); Quad * q = luax_checkframe(L, 2); float x = (float)luaL_checknumber(L, 3); float y = (float)luaL_checknumber(L, 4); @@ -827,7 +827,7 @@ namespace opengl float oy = (float)luaL_optnumber(L, 9, 0); float kx = (float)luaL_optnumber(L, 10, 0); float ky = (float)luaL_optnumber(L, 11, 0); - image->drawq(q, x, y, angle, sx, sy, ox, oy, kx, ky); + dq->drawq(q, x, y, angle, sx, sy, ox, oy, kx, ky); return 0; } From 4f4fbae9a525628b5e1de575524c3dcc31fd6e31 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 4 Oct 2011 12:38:40 -0400 Subject: [PATCH 254/384] Properly #include DrawQable in wrap_Graphics.cpp --- src/modules/graphics/opengl/wrap_Graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index f289a3093..14c9c80a5 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -19,7 +19,7 @@ **/ #include "wrap_Graphics.h" -#include "DrawQable.h" +#include #include #include From 5fb9f982b0b8bdd73ec01a10366df66d9dc7cab4 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 4 Oct 2011 12:47:20 -0400 Subject: [PATCH 255/384] Ch-ch-ch-ch-changes --- changes.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/changes.txt b/changes.txt index 92061937a..b24600c03 100644 --- a/changes.txt +++ b/changes.txt @@ -3,7 +3,9 @@ LOVE 0.8.0 [Rubber Piggy] * Added release error screen. * Added alpha to love.graphics.setBackgroundColor. - * Added canvas:clear(r, g, b, a). + * Added Canvas:clear(r, g, b, a). + * Added Canvas:drawq. + * Added Canvas:getWidth and Canvas:getHeight. * Added love.graphics.arc. * Added seek and tell to Source objects. * Added color interpolation to ParticleSystem. @@ -25,6 +27,7 @@ LOVE 0.8.0 [Rubber Piggy] * 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. * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. @@ -56,11 +59,14 @@ LOVE 0.8.0 [Rubber Piggy] * Removed old syntax for require (with extension). * 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. LOVE 0.7.2 [Game Slave] ----------------------- From ff284e74e49f92ec06bc6cb2642b012234d117c6 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 5 Oct 2011 01:34:42 -0400 Subject: [PATCH 256/384] It's not Canvas:drawq, it's love.graphics.drawq --- changes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changes.txt b/changes.txt index b24600c03..6c24af79b 100644 --- a/changes.txt +++ b/changes.txt @@ -4,7 +4,7 @@ LOVE 0.8.0 [Rubber Piggy] * Added release error screen. * Added alpha to love.graphics.setBackgroundColor. * Added Canvas:clear(r, g, b, a). - * Added Canvas:drawq. + * Added Canvas support to love.graphics.drawq. * Added Canvas:getWidth and Canvas:getHeight. * Added love.graphics.arc. * Added seek and tell to Source objects. From bee9d49515b69cfe4826b31907d5f000ca12ba9e Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 6 Oct 2011 15:17:21 +0200 Subject: [PATCH 257/384] Add premultiplied blending --- src/modules/graphics/Graphics.cpp | 1 + src/modules/graphics/Graphics.h | 1 + src/modules/graphics/opengl/Graphics.cpp | 8 +++++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index 79c536b79..7f8e4dc82 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -121,6 +121,7 @@ namespace graphics { "additive", Graphics::BLEND_ADDITIVE }, { "subtractive", Graphics::BLEND_SUBTRACTIVE }, { "multiplicative", Graphics::BLEND_MULTIPLICATIVE }, + { "premultiplied", Graphics::BLEND_PREMULTIPLIED }, }; StringMap Graphics::blendModes(Graphics::blendModeEntries, sizeof(Graphics::blendModeEntries)); diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index 0875f24a1..0fe150d6f 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -54,6 +54,7 @@ namespace graphics BLEND_ADDITIVE, BLEND_SUBTRACTIVE, BLEND_MULTIPLICATIVE, + BLEND_PREMULTIPLIED, BLEND_MAX_ENUM }; diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index a8935ed7a..527a487f8 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -659,6 +659,8 @@ namespace opengl glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); else if (mode == BLEND_MULTIPLICATIVE) glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); + else if (mode == BLEND_PREMULTIPLIED) + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); else // mode == BLEND_ADDITIVE || mode == BLEND_SUBTRACTIVE glBlendFunc(GL_SRC_ALPHA, GL_ONE); } @@ -684,8 +686,12 @@ namespace opengl return BLEND_ADDITIVE; else if (src == GL_SRC_ALPHA && dst == GL_ONE_MINUS_SRC_ALPHA) // && equation == GL_FUNC_ADD return BLEND_ALPHA; - else // src == GL_DST_COLOR && dst == GL_ONE_MINUS_SRC_ALPHA && equation == GL_FUNC_ADD + else if (src == GL_DST_COLOR && dst == GL_ONE_MINUS_SRC_ALPHA) // && equation == GL_FUNC_ADD return BLEND_MULTIPLICATIVE; + else if (src == GL_ONE && dst == GL_ONE_MINUS_SRC_ALPHA) // && equation == GL_FUNC_ADD + return BLEND_PREMULTIPLIED; + + return BLEND_MAX_ENUM; // Should never be reached. } Graphics::ColorMode Graphics::getColorMode() From 48137cd2e1e2ef940c5c7a0c73d7ba4476e60574 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 7 Oct 2011 14:44:17 +0200 Subject: [PATCH 258/384] Fix Issue #278: Set default filter mode for new images. Add the somewhat lengthy named love.graphics.getDefaultImageFilter() and love.graphics.getDefaultImageFilter(). The verbose name should point to the fact that changing the default filter midway through the game will not affect the images already loaded using love.graphics.newImage(). --- src/modules/graphics/opengl/Graphics.cpp | 14 ++++++-- src/modules/graphics/opengl/Graphics.h | 11 +++++++ src/modules/graphics/opengl/Image.cpp | 5 +-- src/modules/graphics/opengl/Image.h | 4 +-- src/modules/graphics/opengl/wrap_Graphics.cpp | 33 +++++++++++++++++++ src/modules/graphics/opengl/wrap_Graphics.h | 2 ++ src/modules/graphics/opengl/wrap_Image.cpp | 2 +- 7 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 527a487f8..aab365f54 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -37,7 +37,7 @@ namespace opengl { Graphics::Graphics() - : currentFont(0), lineWidth(1), matrixLimit(0), userMatrices(0) + : currentFont(0), currentImageFilter(), lineWidth(1), matrixLimit(0), userMatrices(0) { // Indicates that there is no screen // created yet. @@ -476,7 +476,7 @@ namespace opengl Image * Graphics::newImage(love::image::ImageData * data) { // Create the image. - Image * image = new Image(data); + Image * image = new Image(data, currentImageFilter); bool success; try { success = image->load(); @@ -673,6 +673,11 @@ namespace opengl glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } + void Graphics::setDefaultImageFilter(const Image::Filter& f) + { + currentImageFilter = f; + } + Graphics::BlendMode Graphics::getBlendMode () { GLint dst, src, equation; @@ -705,6 +710,11 @@ namespace opengl return COLOR_REPLACE; } + const Image::Filter& Graphics::getDefaultImageFilter() const + { + return currentImageFilter; + } + void Graphics::setLineWidth( float width ) { lineWidth = width; diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index 2ade6ad3c..b55b6a547 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -113,6 +113,7 @@ namespace opengl private: Font * currentFont; + Image::Filter currentImageFilter; DisplayMode currentMode; float lineWidth; @@ -332,6 +333,11 @@ namespace opengl **/ void setColorMode (ColorMode mode); + /** + * Sets the current image filter. + **/ + void setDefaultImageFilter(const Image::Filter& f); + /** * Gets the current blend mode. **/ @@ -342,6 +348,11 @@ namespace opengl **/ ColorMode getColorMode(); + /** + * Gets the current image filter. + **/ + const Image::Filter& getDefaultImageFilter() const; + /** * Sets the line width. * @param width The new width of the line. diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index ec0f6a133..19a1a91bd 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -29,7 +29,7 @@ namespace graphics { namespace opengl { - Image::Image(love::image::ImageData * data) + Image::Image(love::image::ImageData * data, const Image::Filter& filter) : width((float)(data->getWidth())), height((float)(data->getHeight())), texture(0) { data->retain(); @@ -47,6 +47,7 @@ namespace opengl vertices[2].s = 1; vertices[2].t = 1; vertices[3].s = 1; vertices[3].t = 0; + setFilter(filter); } Image::~Image() @@ -119,7 +120,7 @@ namespace opengl drawv(t, v); } - void Image::setFilter(Image::Filter f) + void Image::setFilter(const Image::Filter& f) { GLint gmin, gmag; gmin = gmag = 0; // so that they're not used uninitialized diff --git a/src/modules/graphics/opengl/Image.h b/src/modules/graphics/opengl/Image.h index d97129d30..1e0dbefff 100644 --- a/src/modules/graphics/opengl/Image.h +++ b/src/modules/graphics/opengl/Image.h @@ -78,7 +78,7 @@ namespace opengl * * @param file The file from which to load the image. **/ - Image(love::image::ImageData * data); + Image(love::image::ImageData * data, const Image::Filter& f = Image::Filter()); /** * Destructor. Deletes the hardware texture and other resources. @@ -121,7 +121,7 @@ namespace opengl * * @param mode The filter mode. **/ - void setFilter(Image::Filter f); + void setFilter(const Image::Filter& f); Image::Filter getFilter() const; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 14c9c80a5..753ff6332 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -568,6 +568,25 @@ namespace opengl return 0; } + int w_setDefaultImageFilter(lua_State * L) + { + Image::FilterMode min; + Image::FilterMode mag; + const char * minstr = luaL_checkstring(L, 1); + const char * magstr = luaL_checkstring(L, 2); + 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); + + Image::Filter f; + f.min = min; + f.mag = mag; + instance->setDefaultImageFilter(f); + + return 0; + } + int w_getBlendMode(lua_State * L) { Graphics::BlendMode mode = instance->getBlendMode(); @@ -590,6 +609,18 @@ namespace opengl return 1; } + int w_getDefaultImageFilter(lua_State * L) + { + const Image::Filter& f = instance->getDefaultImageFilter(); + const char * minstr; + const char * magstr; + Image::getConstant(f.min, minstr); + Image::getConstant(f.mag, magstr); + lua_pushstring(L, minstr); + lua_pushstring(L, magstr); + return 2; + } + int w_setLineWidth(lua_State * L) { float width = (float)luaL_checknumber(L, 1); @@ -1159,8 +1190,10 @@ namespace opengl { "setBlendMode", w_setBlendMode }, { "setColorMode", w_setColorMode }, + { "setDefaultImageFilter", w_setDefaultImageFilter }, { "getBlendMode", w_getBlendMode }, { "getColorMode", w_getColorMode }, + { "getDefaultImageFilter", w_getDefaultImageFilter }, { "setLineWidth", w_setLineWidth }, { "setLineStyle", w_setLineStyle }, { "setLine", w_setLine }, diff --git a/src/modules/graphics/opengl/wrap_Graphics.h b/src/modules/graphics/opengl/wrap_Graphics.h index 17a5a0a24..74f862006 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.h +++ b/src/modules/graphics/opengl/wrap_Graphics.h @@ -71,8 +71,10 @@ namespace opengl int w_getFont(lua_State * L); int w_setBlendMode(lua_State * L); int w_setColorMode(lua_State * L); + int w_setDefaultImageFilter(lua_State * L); int w_getBlendMode(lua_State * L); int w_getColorMode(lua_State * L); + int w_getDefaultImageFilter(lua_State * L); int w_setLineWidth(lua_State * L); int w_setLineStyle(lua_State * L); int w_setLine(lua_State * L); diff --git a/src/modules/graphics/opengl/wrap_Image.cpp b/src/modules/graphics/opengl/wrap_Image.cpp index bc855fc32..ffddc7f7d 100644 --- a/src/modules/graphics/opengl/wrap_Image.cpp +++ b/src/modules/graphics/opengl/wrap_Image.cpp @@ -67,7 +67,7 @@ namespace opengl int w_Image_getFilter(lua_State * L) { - Image * t = luax_checkimage(L, 1); + Image * t = luax_checkimage(L, 1); Image::Filter f = t->getFilter(); Image::FilterMode min = f.min; Image::FilterMode mag = f.mag; From b0b9117721dd3413641709a80a12cc1b387daea8 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 7 Oct 2011 14:44:57 +0200 Subject: [PATCH 259/384] Add uniform cache in pixel effect. Remove a compiler warning and debug output. --- src/modules/graphics/opengl/PixelEffect.cpp | 6 ++++++ src/modules/graphics/opengl/PixelEffect.h | 3 +++ src/modules/graphics/opengl/wrap_PixelEffect.cpp | 5 ++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/modules/graphics/opengl/PixelEffect.cpp b/src/modules/graphics/opengl/PixelEffect.cpp index d155ee653..91f00c159 100644 --- a/src/modules/graphics/opengl/PixelEffect.cpp +++ b/src/modules/graphics/opengl/PixelEffect.cpp @@ -241,12 +241,18 @@ namespace opengl GLint PixelEffect::getUniformLocation(const std::string& name) { + std::map::const_iterator it = _uniforms.find(name); + if (it != _uniforms.end()) + return it->second; + GLint location = glGetUniformLocation(_program, name.c_str()); if (location == -1) { throw love::Exception( "Cannot get location of shader variable `%s'.\n" "A common error is to define but not use the variable.", name.c_str()); } + + _uniforms[name] = location; return location; } diff --git a/src/modules/graphics/opengl/PixelEffect.h b/src/modules/graphics/opengl/PixelEffect.h index 47927b627..4d34190e4 100644 --- a/src/modules/graphics/opengl/PixelEffect.h +++ b/src/modules/graphics/opengl/PixelEffect.h @@ -39,6 +39,9 @@ namespace opengl GLuint _program; std::string _code; // volatile and stuff + // uniform location buffer + std::map _uniforms; + // texture unit pool for setting images static std::map _texture_unit_pool; static GLint _current_texture_unit; diff --git a/src/modules/graphics/opengl/wrap_PixelEffect.cpp b/src/modules/graphics/opengl/wrap_PixelEffect.cpp index fa02aa6bf..62a22af36 100644 --- a/src/modules/graphics/opengl/wrap_PixelEffect.cpp +++ b/src/modules/graphics/opengl/wrap_PixelEffect.cpp @@ -47,7 +47,7 @@ namespace opengl static int _sendVectors(lua_State * L, PixelEffect * effect, const char * name, int count) { - int dimension = lua_objlen(L, 3); + size_t dimension = lua_objlen(L, 3); float * values = new float[count * dimension]; for (int i = 0; i < count; ++i) { @@ -61,7 +61,7 @@ namespace opengl 3+i, dimension, lua_objlen(L, 3+i)); } - for (int k = 1; k <= dimension; ++k) { + for (size_t k = 1; k <= dimension; ++k) { lua_rawgeti(L, 3 + i, k); values[i * dimension + k - 1] = (float)lua_tonumber(L, -1); } @@ -131,7 +131,6 @@ namespace opengl 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); - cout << i << "." << k << " = " << (float)lua_tonumber(L, -1) << endl; } lua_pop(L, 1 + dimension); From d1e5bc4b1f717cc5599f8fc687ef527a2aee3c04 Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 7 Oct 2011 15:00:40 +0200 Subject: [PATCH 260/384] Update changelog --- changes.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/changes.txt b/changes.txt index 6c24af79b..336977944 100644 --- a/changes.txt +++ b/changes.txt @@ -28,8 +28,9 @@ LOVE 0.8.0 [Rubber Piggy] * 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. - * Fixed polygon drawing (was off by one). * Fixed wrapping for single words. * Fixed tracebacks not showing filenames. * Fixed love.graphics.push/pop capable of causing overflows/underflows. @@ -48,7 +49,7 @@ LOVE 0.8.0 [Rubber Piggy] * 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 ordering of loaders, love should have priority over Lua. * Renamed SpriteBatch's lock/unlock to bind/unbind. * Renamed Framebuffer to Canvas. @@ -75,7 +76,7 @@ LOVE 0.7.2 [Game Slave] * 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. From 7584efe46d1311f713d9d50325360fc812f9dbce Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 7 Oct 2011 15:14:43 -0400 Subject: [PATCH 261/384] Fix include paths on Linux (from bartbes) --HG-- branch : box2d-update --- platform/unix/gen-makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/unix/gen-makefile b/platform/unix/gen-makefile index 4824822ca..8dc6e4c57 100644 --- a/platform/unix/gen-makefile +++ b/platform/unix/gen-makefile @@ -3,8 +3,8 @@ echo Generating src/Makefile.am ... cd src inc_current=. inc_modules="$inc_current/modules" -inc_box2d="$inc_current/libraries/Box2D" -echo "AM_CPPFLAGS = -I$inc_current -I$inc_modules -I$inc_box2d -I/usr/include/AL -I/usr/include/freetype2 \$(INCLUDE_LUA) -I/usr/include/SDL \$(FILE_OFFSET) +inc_libraries="$inc_current/libraries" +echo "AM_CPPFLAGS = -I$inc_current -I$inc_modules -I$inc_libraries -I/usr/include/AL -I/usr/include/freetype2 \$(INCLUDE_LUA) -I/usr/include/SDL \$(FILE_OFFSET) AUTOMAKE_OPTIONS = subdir-objects DEFAULT_INCLUDES = SUBDIRS = From 668b4cbcbdb32197ea3bec2ec65087b61c93fc7d Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 7 Oct 2011 19:52:14 -0400 Subject: [PATCH 262/384] Update MSVC project with new files --- platform/msvc2010/love.vcxproj | 41 ++++++++-- platform/msvc2010/love.vcxproj.filters | 105 ++++++++++++++++--------- 2 files changed, 103 insertions(+), 43 deletions(-) diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 4abc36f8c..403dc85a2 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -91,10 +91,11 @@ + + - TurnOffAllWarnings @@ -105,14 +106,15 @@ + - + @@ -201,8 +203,20 @@ - + + true + true + + + true + true + + + + true + true + @@ -260,10 +274,11 @@ + + - @@ -272,14 +287,15 @@ + - + @@ -326,10 +342,21 @@ - + + true + true + + + true + true + + + + true + true + - diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index aeb7c8138..561463ebd 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -79,9 +79,6 @@ {6e32c8cf-d49d-4a78-a1d8-21240da24dab} - - {734b78fd-00fa-4000-9b6d-9bb4fb090c37} - {60308813-dcf2-47cb-869b-f3d7bb7c805d} @@ -103,6 +100,15 @@ {014c1d0d-8028-42fc-a870-19f78d93b083} + + {07055354-8f1c-4db7-8129-87e07b6da216} + + + {ef6d45be-dfa4-4260-9152-d671571e93d1} + + + {58b00bbb-5c09-4510-8a23-5c3f869354b2} + @@ -571,21 +577,6 @@ common - - modules\graphics\opengl - - - modules\graphics\opengl - - - modules\thread - - - modules\thread - - - modules\thread\sdl - common @@ -598,6 +589,36 @@ modules\graphics\opengl + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread\win32 + + + modules\thread\sdl + + + modules\thread\posix + + + modules\graphics + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics + @@ -870,9 +891,6 @@ modules\physics\box2d - - modules\thread - modules\timer\sdl @@ -933,12 +951,6 @@ common - - modules\graphics\opengl - - - modules\graphics\opengl - utf8 @@ -951,15 +963,6 @@ utf8\utf8 - - modules\thread - - - modules\thread - - - modules\thread\sdl - common @@ -972,6 +975,36 @@ modules\graphics\opengl + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread\win32 + + + modules\thread\sdl + + + modules\thread\posix + + + modules\graphics + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics + From ce9e694acc9705fd42a341b2c248e128a52addba Mon Sep 17 00:00:00 2001 From: vrld Date: Mon, 10 Oct 2011 12:16:28 +0200 Subject: [PATCH 263/384] Make setDefaultImageFilter() not break image:setFilter() (thanks adrix89!) --- src/modules/graphics/opengl/Graphics.cpp | 4 +++- src/modules/graphics/opengl/Image.cpp | 7 ++++--- src/modules/graphics/opengl/Image.h | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index aab365f54..15b21a64d 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -476,7 +476,7 @@ namespace opengl Image * Graphics::newImage(love::image::ImageData * data) { // Create the image. - Image * image = new Image(data, currentImageFilter); + Image * image = new Image(data); bool success; try { success = image->load(); @@ -489,6 +489,8 @@ namespace opengl return 0; } + image->setFilter(currentImageFilter); + return image; } diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index 19a1a91bd..06f572a21 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -23,13 +23,16 @@ // STD #include // For memcpy +#include +using namespace std; + namespace love { namespace graphics { namespace opengl { - Image::Image(love::image::ImageData * data, const Image::Filter& filter) + Image::Image(love::image::ImageData * data) : width((float)(data->getWidth())), height((float)(data->getHeight())), texture(0) { data->retain(); @@ -46,8 +49,6 @@ namespace opengl vertices[1].s = 0; vertices[1].t = 1; vertices[2].s = 1; vertices[2].t = 1; vertices[3].s = 1; vertices[3].t = 0; - - setFilter(filter); } Image::~Image() diff --git a/src/modules/graphics/opengl/Image.h b/src/modules/graphics/opengl/Image.h index 1e0dbefff..f3118b44a 100644 --- a/src/modules/graphics/opengl/Image.h +++ b/src/modules/graphics/opengl/Image.h @@ -78,7 +78,7 @@ namespace opengl * * @param file The file from which to load the image. **/ - Image(love::image::ImageData * data, const Image::Filter& f = Image::Filter()); + Image(love::image::ImageData * data); /** * Destructor. Deletes the hardware texture and other resources. From bc0cd3b2d59659ec1dc5be0fc4399935d0ec46db Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 11 Oct 2011 23:29:10 -0500 Subject: [PATCH 264/384] Changing flipping broke Canvas:getImageData - fortunately, it also made it much simpler (fixes issue #311) --- src/modules/graphics/opengl/Canvas.cpp | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index 88e731ac3..093050dd7 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -280,20 +280,14 @@ namespace opengl { static Matrix t; const vertex * v = quad->getVertices(); - + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); drawv(t, v); } love::image::ImageData * Canvas::getImageData(love::image::Image * image) { - int row = 4 * width; - int size = row * height; - - // see Graphics::newScreenshot. OpenGL reads from lower-left, - // but we need the pixels from upper-left. - GLubyte* pixels = new GLubyte[size]; - GLubyte* screenshot = new GLubyte[size]; + GLubyte pixels[4*width*height]; strategy->bindFBO( fbo ); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); @@ -302,16 +296,7 @@ namespace opengl else strategy->bindFBO( 0 ); - GLubyte* src = pixels - row; // second line of buffer - GLubyte* dst = screenshot + size; // end of buffer - - for (int i = 0; i < height; ++i) - memcpy(dst -= row, src += row, row); - - love::image::ImageData * img = image->newImageData(width, height, (void*)screenshot); - - delete[] screenshot; - delete[] pixels; + love::image::ImageData * img = image->newImageData(width, height, (void*)pixels); return img; } From c5cf3fefeb7a08ba2c991d2ebfd013b2d0abe525 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 12 Oct 2011 00:06:15 -0500 Subject: [PATCH 265/384] that awkward moment when you forget you can't automatically allocate arrays with variable expressions in C++ --- src/modules/graphics/opengl/Canvas.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index 093050dd7..cbd151005 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -287,7 +287,7 @@ namespace opengl love::image::ImageData * Canvas::getImageData(love::image::Image * image) { - GLubyte pixels[4*width*height]; + GLubyte * pixels = new GLubyte[4*width*height]; strategy->bindFBO( fbo ); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); @@ -297,6 +297,8 @@ namespace opengl strategy->bindFBO( 0 ); love::image::ImageData * img = image->newImageData(width, height, (void*)pixels); + + delete[] pixels; return img; } From 6b7b68ebd0dcad0b1e657131a8b543b70646c21d Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 12 Oct 2011 12:37:09 +0200 Subject: [PATCH 266/384] Fix issue #314: Can't use #define in shader code. --- src/scripts/graphics.lua | 2 +- src/scripts/graphics.lua.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index bfb051873..6354de039 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -1294,7 +1294,7 @@ do code = code:gsub("#include (%b'')", include) code = code:gsub('#include (%b"")', include) - return table.concat{header, code, footer} + return table.concat{header, "\n", code, footer} end function love.graphics._transformGLSLErrorMessages(message) diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index 37087fdb9..ee24c94b0 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -6297,8 +6297,8 @@ const unsigned char graphics_lua[] = 0x28, 0x27, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x28, 0x25, 0x62, 0x22, 0x22, 0x29, 0x27, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x29, 0x0a,0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, - 0x63, 0x61, 0x74, 0x7b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, - 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x7d, 0x0a, + 0x63, 0x61, 0x74, 0x7b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x7d, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,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, From 51443454c2bd6b6c19addb7a7c82574511f51578 Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 12 Oct 2011 17:10:04 +0200 Subject: [PATCH 267/384] Determine FramebufferStrategy only once --- src/modules/graphics/opengl/Canvas.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index cbd151005..910a9c33b 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -140,7 +140,7 @@ namespace opengl } }; - FramebufferStrategy* strategy; + FramebufferStrategy* strategy = NULL; FramebufferStrategy strategyNone; @@ -165,8 +165,6 @@ namespace opengl Canvas::Canvas(int width, int height) : width(width), height(height) { - strategy = NULL; - float w = static_cast(width); float h = static_cast(height); From 5eb26e8f7eb454a8ef517efa6a4e01d935997ac7 Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 12 Oct 2011 17:11:13 +0200 Subject: [PATCH 268/384] Probably fix issue #312. Needs more testing with intel cards. --- src/modules/graphics/opengl/Canvas.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index 910a9c33b..00fca68dd 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -49,7 +49,7 @@ namespace opengl // create stencil buffer glGenRenderbuffers(1, &depth_stencil); glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depth_stencil); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, @@ -101,7 +101,7 @@ namespace opengl // create stencil buffer glGenRenderbuffersEXT(1, &depth_stencil); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_stencil); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, width, height); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, width, height); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_stencil); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, From 56ae3a95fc54682158021d9eb349043b9e594498 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 12 Oct 2011 13:51:47 -0500 Subject: [PATCH 269/384] Bring back some elements of better Body destruction that got lost in the merge --- src/modules/physics/box2d/Body.h | 5 +++++ src/modules/physics/box2d/World.cpp | 13 +++++++++++++ src/modules/physics/box2d/World.h | 10 ++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index f5b457bab..4db997fff 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -385,6 +385,11 @@ namespace box2d **/ int getFixtureList(lua_State * L) const; + /** + * Mark the body for destruction + **/ + void destroy(); + private: /** diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index e35b4b5d6..8e292d7c6 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -210,6 +210,14 @@ namespace box2d void World::update(float dt) { world->Step(dt, 8, 6); + + // Really destroy all marked bodies. + for (std::vector::iterator i = destructBodies.begin(); i < destructBodies.end(); i++) + { + Body * b = *i; + b->release(); + } + destructBodies.clear(); } void World::BeginContact(b2Contact* contact) @@ -422,6 +430,11 @@ namespace box2d world->RayCast(&raycast, v1, v2); return 0; } + + void World::destroyBody(Body * b) + { + destructBodies.push_back(b); + } } // box2d } // physics diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index fc6d3aca8..e345f2fba 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -40,6 +40,7 @@ namespace box2d { class Contact; + class Body; class Fixture; /** @@ -106,6 +107,9 @@ namespace box2d // Ground body b2Body * groundBody; + + // The list of to be destructed bodies. + std::vector destructBodies; // Contact callbacks. ContactCallback begin, end, presolve, postsolve; @@ -255,6 +259,12 @@ namespace box2d * Raycasts the World for all Fixtures in the path of the ray. **/ int rayCast(lua_State * L); + + /** + * Mark a body for destruction. + * To be called from Body + **/ + void destroyBody(Body * b); }; From 57f9cf439e7fa9a230a0f83eae068499a01cd610 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 12 Oct 2011 14:03:38 -0500 Subject: [PATCH 270/384] Add LOVE_UNUSED macro to stamp out all those "unused parameter" warnings --- src/common/Exception.cpp | 2 + src/common/config.h | 4 + src/modules/graphics/opengl/Graphics.cpp | 1 + src/modules/graphics/opengl/VertexBuffer.cpp | 154 ++++++++++--------- src/modules/thread/sdl/threads.h | 7 +- src/modules/thread/threads.h | 2 +- 6 files changed, 90 insertions(+), 80 deletions(-) diff --git a/src/common/Exception.cpp b/src/common/Exception.cpp index 8d0a9ed6e..ca804345a 100644 --- a/src/common/Exception.cpp +++ b/src/common/Exception.cpp @@ -19,6 +19,7 @@ **/ #include "Exception.h" +#include namespace love { @@ -32,6 +33,7 @@ namespace love Exception::Exception(int unparsed, const char * str) { + LOVE_UNUSED(unparsed); strncpy(buffer, str, BUFFER_SIZE); } diff --git a/src/common/config.h b/src/common/config.h index bfd8f80c7..ae35a6069 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -48,6 +48,10 @@ # define _CRT_SECURE_NO_WARNINGS #endif +#ifndef LOVE_UNUSED +# define LOVE_UNUSED(x) (void)sizeof(x) +#endif + #ifndef LOVE_BUILD # define LOVE_BUILD # define LOVE_BUILD_STANDALONE diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 15b21a64d..3614c6651 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -734,6 +734,7 @@ namespace opengl // glEnable (GL_POLYGON_SMOOTH); // glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST); //} + LOVE_UNUSED(style); } void Graphics::setLine( float width, Graphics::LineStyle style ) diff --git a/src/modules/graphics/opengl/VertexBuffer.cpp b/src/modules/graphics/opengl/VertexBuffer.cpp index 7953e28ea..9bedca37a 100644 --- a/src/modules/graphics/opengl/VertexBuffer.cpp +++ b/src/modules/graphics/opengl/VertexBuffer.cpp @@ -21,6 +21,7 @@ #include "VertexBuffer.h" #include "common/Exception.h" +#include #include #include @@ -61,13 +62,13 @@ namespace opengl } // VertexBuffer::Bind - - VertexBuffer::Bind::Bind(VertexBuffer &buf) - : buf(buf) - { - buf.bind(); - } - + + VertexBuffer::Bind::Bind(VertexBuffer &buf) + : buf(buf) + { + buf.bind(); + } + VertexBuffer::Bind::~Bind() { buf.unbind(); @@ -86,23 +87,24 @@ namespace opengl delete [] buf; } - void *VertexArray::map(GLenum access) - { - return buf; - } - - void VertexArray::unmap() - { - } - - void VertexArray::bind() - { - } - - void VertexArray::unbind() - { - } - + void *VertexArray::map(GLenum access) + { + LOVE_UNUSED(access); + return buf; + } + + void VertexArray::unmap() + { + } + + void VertexArray::bind() + { + } + + void VertexArray::unbind() + { + } + void VertexArray::fill(int offset, int size, const void *data) { memcpy(buf + offset, data, size); @@ -136,33 +138,33 @@ namespace opengl unload(false); } - void *VBO::map(GLenum access) - { - // Don't map twice. - if (mapped) - return mapped; - - mapped = glMapBufferARB(getTarget(), access); - - return mapped; - } - - void VBO::unmap() - { - glUnmapBufferARB(getTarget()); - mapped = 0; - } - - void VBO::bind() - { - glBindBufferARB(getTarget(), vbo); - } - - void VBO::unbind() - { - glBindBufferARB(getTarget(), 0); - } - + void *VBO::map(GLenum access) + { + // Don't map twice. + if (mapped) + return mapped; + + mapped = glMapBufferARB(getTarget(), access); + + return mapped; + } + + void VBO::unmap() + { + glUnmapBufferARB(getTarget()); + mapped = 0; + } + + void VBO::bind() + { + glBindBufferARB(getTarget(), vbo); + } + + void VBO::unbind() + { + glBindBufferARB(getTarget(), 0); + } + void VBO::fill(int offset, int size, const void *data) { if (mapped) @@ -176,35 +178,35 @@ namespace opengl return reinterpret_cast(offset); } - bool VBO::loadVolatile() - { - return load(true); - } - - void VBO::unloadVolatile() - { - unload(true); + bool VBO::loadVolatile() + { + return load(true); } - bool VBO::load(bool restore) - { - glGenBuffersARB(1, &vbo); - - VertexBuffer::Bind bind(*this); - - // Copy the old buffer only if 'restore' was requested. - const GLvoid *src = restore ? buffer_copy : 0; - - // Note that if 'src' is '0', no data will be copied. - glBufferDataARB(getTarget(), getSize(), src, getUsage()); - + void VBO::unloadVolatile() + { + unload(true); + } + + bool VBO::load(bool restore) + { + glGenBuffersARB(1, &vbo); + + VertexBuffer::Bind bind(*this); + + // Copy the old buffer only if 'restore' was requested. + const GLvoid *src = restore ? buffer_copy : 0; + + // Note that if 'src' is '0', no data will be copied. + glBufferDataARB(getTarget(), getSize(), src, getUsage()); + // Clean up buffer_copy, if it exists. delete[] buffer_copy; - buffer_copy = 0; - - return true; - } - + buffer_copy = 0; + + return true; + } + void VBO::unload(bool save) { // Clean up buffer_copy, if it exists. diff --git a/src/modules/thread/sdl/threads.h b/src/modules/thread/sdl/threads.h index 0b73f8e88..693a21b1e 100644 --- a/src/modules/thread/sdl/threads.h +++ b/src/modules/thread/sdl/threads.h @@ -22,6 +22,7 @@ #define LOVE_THREAD_SDL_THREADS_H #include "SDL.h" +#include namespace love { @@ -31,7 +32,7 @@ namespace thread class Mutex { private: SDL_mutex* mutex; - Mutex(const Mutex& mutex) {} + Mutex(const Mutex& mutex) {LOVE_UNUSED(mutex);} friend class Conditional; @@ -48,7 +49,7 @@ namespace thread class ThreadBase { private: SDL_Thread* thread; - ThreadBase(ThreadBase& thread) {} + ThreadBase(ThreadBase& thread) {LOVE_UNUSED(thread);} bool running; static int thread_runner(void* param); @@ -70,7 +71,7 @@ namespace thread class Semaphore { private: - Semaphore(const Semaphore& sem) {} + Semaphore(const Semaphore& sem) {LOVE_UNUSED(sem);} SDL_sem* semaphore; public: diff --git a/src/modules/thread/threads.h b/src/modules/thread/threads.h index c8f94845a..eb431e484 100644 --- a/src/modules/thread/threads.h +++ b/src/modules/thread/threads.h @@ -63,7 +63,7 @@ namespace thread private: Mutex* mutex; - Lock(Lock& lock) {} + Lock(Lock& lock) {LOVE_UNUSED(lock);} public: Lock(Mutex* m): mutex(m) { From b32464f0d33ba66883e5adc65055d2d0a1e459f3 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 12 Oct 2011 21:36:46 +0200 Subject: [PATCH 271/384] Forward box2d asserts to exception, then catch those in the new* functions --- src/libraries/Box2D/Common/b2Settings.cpp | 10 +++- src/libraries/Box2D/Common/b2Settings.h | 5 +- src/modules/physics/box2d/wrap_Physics.cpp | 58 ++++++++++++++-------- src/modules/physics/box2d/wrap_Physics.h | 2 + 4 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/libraries/Box2D/Common/b2Settings.cpp b/src/libraries/Box2D/Common/b2Settings.cpp index 05a322305..82bc23630 100755 --- a/src/libraries/Box2D/Common/b2Settings.cpp +++ b/src/libraries/Box2D/Common/b2Settings.cpp @@ -21,6 +21,8 @@ #include #include +#include "common/Exception.h" + b2Version b2_version = {2, 2, 1}; // Memory allocators. Modify these to use your own allocator. @@ -41,4 +43,10 @@ void b2Log(const char* string, ...) va_start(args, string); vprintf(string, args); va_end(args); -} \ No newline at end of file +} + +void loveAssert(bool test, const char *teststr) +{ + if (!test) + throw love::Exception("Box2D error: %s", teststr); +} diff --git a/src/libraries/Box2D/Common/b2Settings.h b/src/libraries/Box2D/Common/b2Settings.h index 7e0a165b5..f049fa4de 100755 --- a/src/libraries/Box2D/Common/b2Settings.h +++ b/src/libraries/Box2D/Common/b2Settings.h @@ -22,8 +22,11 @@ #include #include +void loveAssert(bool test, const char *teststr); + #define B2_NOT_USED(x) ((void)(x)) -#define b2Assert(A) assert(A) +//#define b2Assert(A) assert(A) +#define b2Assert(A) loveAssert((A), #A) typedef signed char int8; typedef signed short int16; diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index d9cb427c8..cfbd95ddf 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -35,7 +35,8 @@ namespace box2d float gy = (float)luaL_optnumber(L, 2, 0); bool sleep = luax_optboolean(L, 3, true); - World * w = instance->newWorld(gx, gy, sleep); + World * w; + ASSERT_GUARD(w = instance->newWorld(gx, gy, sleep);) luax_newtype(L, "World", PHYSICS_WORLD_T, (void*)w); return 1; @@ -49,7 +50,8 @@ namespace box2d const char * type = luaL_optstring(L, 4, "static"); Body::Type bodyType; Body::getConstant(type, bodyType); - Body * body = instance->newBody(world, x, y, bodyType); + Body * body; + ASSERT_GUARD(body = instance->newBody(world, x, y, bodyType);) luax_newtype(L, "Body", PHYSICS_BODY_T, (void*)body); return 1; } @@ -59,7 +61,8 @@ namespace box2d Body * body = luax_checkbody(L, 1); Shape * shape = luax_checkshape(L, 2); float density = (float)luaL_checknumber(L, 3); - Fixture * fixture = instance->newFixture(body, shape, density); + Fixture * fixture; + ASSERT_GUARD(fixture = instance->newFixture(body, shape, density);) luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)fixture); return 1; } @@ -71,7 +74,8 @@ namespace box2d if(top == 1) { float radius = (float)luaL_checknumber(L, 1); - CircleShape * shape = instance->newCircleShape(radius); + CircleShape * shape; + ASSERT_GUARD(shape = instance->newCircleShape(radius);) luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); return 1; } @@ -80,7 +84,8 @@ namespace box2d float x = (float)luaL_checknumber(L, 1); float y = (float)luaL_checknumber(L, 2); float radius = (float)luaL_checknumber(L, 3); - CircleShape * shape = instance->newCircleShape(x, y, radius); + CircleShape * shape; + ASSERT_GUARD(shape = instance->newCircleShape(x, y, radius);) luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void*)shape); return 1; } @@ -96,7 +101,8 @@ namespace box2d { float w = (float)luaL_checknumber(L, 1); float h = (float)luaL_checknumber(L, 2); - PolygonShape * shape = instance->newRectangleShape(w, h); + PolygonShape * shape; + ASSERT_GUARD(shape = instance->newRectangleShape(w, h);) luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); return 1; } @@ -107,7 +113,8 @@ namespace box2d float w = (float)luaL_checknumber(L, 3); float h = (float)luaL_checknumber(L, 4); float angle = (float)luaL_optnumber(L, 5, 0); - PolygonShape * shape = instance->newRectangleShape(x, y, w, h, angle); + PolygonShape * shape; + ASSERT_GUARD(shape = instance->newRectangleShape(x, y, w, h, angle);) luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void*)shape); return 1; } @@ -121,19 +128,20 @@ namespace box2d float y1 = (float)luaL_checknumber(L, 2); float x2 = (float)luaL_checknumber(L, 3); float y2 = (float)luaL_checknumber(L, 4); - EdgeShape * shape = instance->newEdgeShape(x1, y1, x2, y2); + EdgeShape * shape; + ASSERT_GUARD(shape = instance->newEdgeShape(x1, y1, x2, y2);) luax_newtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, (void*)shape); return 1; } int w_newPolygonShape(lua_State * L) { - return instance->newPolygonShape(L); + ASSERT_GUARD(return instance->newPolygonShape(L);) } int w_newChainShape(lua_State * L) { - return instance->newChainShape(L); + ASSERT_GUARD(return instance->newChainShape(L);) } int w_newDistanceJoint(lua_State * L) @@ -145,7 +153,8 @@ namespace box2d float x2 = (float)luaL_checknumber(L, 5); float y2 = (float)luaL_checknumber(L, 6); bool collideConnected = luax_optboolean(L, 7, false); - DistanceJoint * j = instance->newDistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected); + DistanceJoint * j; + ASSERT_GUARD(j = instance->newDistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected);) luax_newtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, (void*)j); return 1; } @@ -155,7 +164,8 @@ namespace box2d 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 = instance->newMouseJoint(body, x, y); + MouseJoint * j; + ASSERT_GUARD(j = instance->newMouseJoint(body, x, y);) luax_newtype(L, "MouseJoint", PHYSICS_MOUSE_JOINT_T, (void*)j); return 1; } @@ -167,7 +177,8 @@ namespace box2d float x = (float)luaL_checknumber(L, 3); float y = (float)luaL_checknumber(L, 4); bool collideConnected = luax_optboolean(L, 5, false); - RevoluteJoint * j = instance->newRevoluteJoint(body1, body2, x, y, collideConnected); + RevoluteJoint * j; + ASSERT_GUARD(j = instance->newRevoluteJoint(body1, body2, x, y, collideConnected);) luax_newtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, (void*)j); return 1; } @@ -193,7 +204,8 @@ namespace box2d ay = (float)luaL_checknumber(L, 6); collideConnected = luax_optboolean(L, 7, false); } - PrismaticJoint * j = instance->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); + PrismaticJoint * j; + ASSERT_GUARD(j = instance->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);) luax_newtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, (void*)j); return 1; } @@ -213,7 +225,8 @@ namespace box2d 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 = instance->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio, collideConnected); + PulleyJoint * j; + ASSERT_GUARD(j = instance->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio, collideConnected);) luax_newtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, (void*)j); return 1; } @@ -225,7 +238,8 @@ namespace box2d float ratio = (float)luaL_optnumber(L, 3, 1.0); bool collideConnected = luax_optboolean(L, 4, false); - GearJoint * j = instance->newGearJoint(joint1, joint2, ratio, collideConnected); + GearJoint * j; + ASSERT_GUARD(j = instance->newGearJoint(joint1, joint2, ratio, collideConnected);) luax_newtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, (void*)j); return 1; } @@ -247,7 +261,8 @@ namespace box2d yB = yA; collideConnected = luax_optboolean(L, 5, false); } - FrictionJoint * j = instance->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected); + FrictionJoint * j; + ASSERT_GUARD(j = instance->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected);) luax_newtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, (void*)j); return 1; } @@ -269,7 +284,8 @@ namespace box2d yB = yA; collideConnected = luax_optboolean(L, 5, false); } - WeldJoint * j = instance->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected); + WeldJoint * j; + ASSERT_GUARD(j = instance->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected);) luax_newtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, (void*)j); return 1; } @@ -296,7 +312,8 @@ namespace box2d collideConnected = luax_optboolean(L, 7, false); } - WheelJoint * j = instance->newWheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); + WheelJoint * j; + ASSERT_GUARD(j = instance->newWheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);) luax_newtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, (void*)j); return 1; } @@ -311,7 +328,8 @@ namespace box2d float y2 = (float)luaL_checknumber(L, 6); float maxLength = (float)luaL_checknumber(L, 7); bool collideConnected = luax_optboolean(L, 8, false); - RopeJoint * j = instance->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); + RopeJoint * j; + ASSERT_GUARD(j = instance->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected);) luax_newtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, (void*)j); return 1; } diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index 5a086b01e..db1a27038 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -45,6 +45,8 @@ #include "wrap_WheelJoint.h" #include "wrap_RopeJoint.h" +#define ASSERT_GUARD(A) try { A } catch (love::Exception & e) { return luaL_error(L, e.what()); } + namespace love { namespace physics From d20f42c230fb68129b8b8e55a32f4851f4eb48ba Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 12 Oct 2011 14:41:25 -0500 Subject: [PATCH 272/384] this machine kills compiler warnings --- src/modules/sound/lullaby/VorbisDecoder.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/sound/lullaby/VorbisDecoder.cpp b/src/modules/sound/lullaby/VorbisDecoder.cpp index 074a8485d..cd6ff9d35 100644 --- a/src/modules/sound/lullaby/VorbisDecoder.cpp +++ b/src/modules/sound/lullaby/VorbisDecoder.cpp @@ -75,9 +75,9 @@ namespace lullaby ogg_int64_t offset /*offset from the point we wish to seek to*/, int whence /*where we want to seek to*/) { - size_t 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) + 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; From cb6bde5ad78e9d3d0d18926c0f153da85fa535e8 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Wed, 12 Oct 2011 14:42:51 -0500 Subject: [PATCH 273/384] Always use protection --- src/modules/physics/box2d/wrap_Physics.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/wrap_Physics.h b/src/modules/physics/box2d/wrap_Physics.h index db1a27038..3574aac5d 100644 --- a/src/modules/physics/box2d/wrap_Physics.h +++ b/src/modules/physics/box2d/wrap_Physics.h @@ -45,7 +45,7 @@ #include "wrap_WheelJoint.h" #include "wrap_RopeJoint.h" -#define ASSERT_GUARD(A) try { A } catch (love::Exception & e) { return luaL_error(L, e.what()); } +#define ASSERT_GUARD(A) try { A } catch (love::Exception & e) { return luaL_error(L, "%s", e.what()); } namespace love { From bc2dd6f75b5ebdd67769eae06554a2bdb6629723 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 12 Oct 2011 21:49:04 +0200 Subject: [PATCH 274/384] Enola Gay delivers again --- .../physics/box2d/Source/Common/b2Settings.h | 178 ------------------ 1 file changed, 178 deletions(-) delete mode 100644 src/modules/physics/box2d/Source/Common/b2Settings.h diff --git a/src/modules/physics/box2d/Source/Common/b2Settings.h b/src/modules/physics/box2d/Source/Common/b2Settings.h deleted file mode 100644 index 545b6f64b..000000000 --- a/src/modules/physics/box2d/Source/Common/b2Settings.h +++ /dev/null @@ -1,178 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as 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 - -#define B2_NOT_USED(x) x -//#define b2Assert(A) assert(A) -#define b2Assert(A) {if(!(A)) throw love::Exception(1, #A);} - - -// need to include NDS jtypes.h instead of -// usual typedefs because NDS jtypes defines -// them slightly differently, oh well. -#ifdef TARGET_IS_NDS - -#include "jtypes.h" - -#else - -typedef signed char int8; -typedef signed short int16; -typedef signed int int32; -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; - -#endif - -#ifdef TARGET_FLOAT32_IS_FIXED - -#include "Fixed.h" - -typedef Fixed float32; -#define B2_FLT_MAX FIXED_MAX -#define B2_FLT_EPSILON FIXED_EPSILON -#define B2FORCE_SCALE(x) ((x)<<7) -#define B2FORCE_INV_SCALE(x) ((x)>>7) - -#else - -typedef float float32; -#define B2_FLT_MAX FLT_MAX -#define B2_FLT_EPSILON FLT_EPSILON -#define B2FORCE_SCALE(x) (x) -#define B2FORCE_INV_SCALE(x) (x) - -#endif - -const float32 b2_pi = 3.14159265359f; - -/// @file -/// Global tuning constants based on meters-kilograms-seconds (MKS) units. -/// - -// Collision -const int32 b2_maxManifoldPoints = 2; -const int32 b2_maxPolygonVertices = 8; -const int32 b2_maxProxies = 2048; // this must be a power of two -const int32 b2_maxPairs = 8 * b2_maxProxies; // this must be a power of two - -// Dynamics - -/// A small length used as a collision and constraint tolerance. Usually it is -/// chosen to be numerically significant, but visually insignificant. -const float32 b2_linearSlop = 0.005f; // 0.5 cm - -/// A small angle used as a collision and constraint tolerance. Usually it is -/// chosen to be numerically significant, but visually insignificant. -const float32 b2_angularSlop = 2.0f / 180.0f * b2_pi; // 2 degrees - -/// Continuous collision detection (CCD) works with core, shrunken shapes. This is the -/// amount by which shapes are automatically shrunk to work with CCD. This must be -/// larger than b2_linearSlop. -const float32 b2_toiSlop = 8.0f * b2_linearSlop; - -/// Maximum number of contacts to be handled to solve a TOI island. -const int32 b2_maxTOIContactsPerIsland = 32; - -/// A velocity threshold for elastic collisions. Any collision with a relative linear -/// velocity below this threshold will be treated as inelastic. -const float32 b2_velocityThreshold = 1.0f; // 1 m/s - -/// The maximum linear position correction used when solving constraints. This helps to -/// prevent overshoot. -const float32 b2_maxLinearCorrection = 0.2f; // 20 cm - -/// The maximum angular position correction used when solving constraints. This helps to -/// prevent overshoot. -const float32 b2_maxAngularCorrection = 8.0f / 180.0f * b2_pi; // 8 degrees - -/// 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. -#ifdef TARGET_FLOAT32_IS_FIXED -const float32 b2_maxLinearVelocity = 100.0f; -#else -const float32 b2_maxLinearVelocity = 200.0f; -const float32 b2_maxLinearVelocitySquared = b2_maxLinearVelocity * b2_maxLinearVelocity; -#endif - -/// 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. -const float32 b2_maxAngularVelocity = 250.0f; -#ifndef TARGET_FLOAT32_IS_FIXED -const float32 b2_maxAngularVelocitySquared = b2_maxAngularVelocity * b2_maxAngularVelocity; -#endif - -/// 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. -const float32 b2_contactBaumgarte = 0.2f; - -// Sleep - -/// The time that a body must be still before it will go to sleep. -const float32 b2_timeToSleep = 0.5f; // half a second - -/// A body cannot sleep if its linear velocity is above this tolerance. -const float32 b2_linearSleepTolerance = 0.01f; // 1 cm/s - -/// A body cannot sleep if its angular velocity is above this tolerance. -const float32 b2_angularSleepTolerance = 2.0f / 180.0f; // 2 degrees/s - -// Memory Allocation - -/// The current number of bytes allocated through b2Alloc. -extern int32 b2_byteCount; - -/// 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); - -/// 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; - -/// Friction mixing law. Feel free to customize this. -inline float32 b2MixFriction(float32 friction1, float32 friction2) -{ - return sqrtf(friction1 * friction2); -} - -/// Restitution mixing law. Feel free to customize this. -inline float32 b2MixRestitution(float32 restitution1, float32 restitution2) -{ - return restitution1 > restitution2 ? restitution1 : restitution2; -} - -#endif From b3e80e389b4cf872c4b6628de2d3776cbcb3a817 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 13 Oct 2011 12:15:35 -0500 Subject: [PATCH 275/384] Update Xcode project for 4.2 (still 3.2-compatible) --- .../macosx/love.xcodeproj/project.pbxproj | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index ae4ee18fc..0bf00ddc6 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -152,15 +152,15 @@ A96E254E13B9892100456DEA /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254313B9892100456DEA /* Thread.cpp */; }; A96E254F13B9892100456DEA /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254513B9892100456DEA /* threads.cpp */; }; A96E255113B9892100456DEA /* wrap_Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96E254A13B9892100456DEA /* wrap_Thread.cpp */; }; + A96F41831412AFE20067FE9A /* wrap_WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */; }; + A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41841412AFEB0067FE9A /* WeldJoint.cpp */; }; + A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */; }; + A96F418C1412B3AD0067FE9A /* WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F418A1412B3A30067FE9A /* WheelJoint.cpp */; }; A96F41921412BBEE0067FE9A /* Canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41901412BBEE0067FE9A /* Canvas.cpp */; }; A96F41951412BBF80067FE9A /* PixelEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41931412BBF80067FE9A /* PixelEffect.cpp */; }; A96F41981412BC000067FE9A /* VertexBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41961412BC000067FE9A /* VertexBuffer.cpp */; }; A96F419B1412BC070067FE9A /* wrap_Canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41991412BC070067FE9A /* wrap_Canvas.cpp */; }; A96F419E1412BC0E0067FE9A /* wrap_PixelEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F419C1412BC0E0067FE9A /* wrap_PixelEffect.cpp */; }; - A96F41831412AFE20067FE9A /* wrap_WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */; }; - A96F41861412AFF80067FE9A /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41841412AFEB0067FE9A /* WeldJoint.cpp */; }; - A96F41891412B36D0067FE9A /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */; }; - A96F418C1412B3AD0067FE9A /* WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F418A1412B3A30067FE9A /* WheelJoint.cpp */; }; A96F41A41412C91F0067FE9A /* EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41A21412C91E0067FE9A /* EdgeShape.cpp */; }; A96F41A71412C92B0067FE9A /* wrap_EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */; }; A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986ECAD132CEB9300F048C8 /* Fixture.cpp */; }; @@ -188,7 +188,6 @@ A9D5C4F1142E5F7F0044ECF7 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C497142E5F7F0044ECF7 /* b2CircleShape.cpp */; }; A9D5C4F2142E5F7F0044ECF7 /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C499142E5F7F0044ECF7 /* b2EdgeShape.cpp */; }; A9D5C4F3142E5F7F0044ECF7 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C49B142E5F7F0044ECF7 /* b2PolygonShape.cpp */; }; - A9D5C4F4142E5F7F0044ECF7 /* b2PolygonShape.cpp.orig in Resources */ = {isa = PBXBuildFile; fileRef = A9D5C49C142E5F7F0044ECF7 /* b2PolygonShape.cpp.orig */; }; A9D5C4F5142E5F7F0044ECF7 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A0142E5F7F0044ECF7 /* b2BlockAllocator.cpp */; }; A9D5C4F6142E5F7F0044ECF7 /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A2142E5F7F0044ECF7 /* b2Draw.cpp */; }; A9D5C4F7142E5F7F0044ECF7 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D5C4A5142E5F7F0044ECF7 /* b2Math.cpp */; }; @@ -568,6 +567,14 @@ A96E254913B9892100456DEA /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; A96E254A13B9892100456DEA /* wrap_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Thread.cpp; sourceTree = ""; }; A96E254B13B9892100456DEA /* wrap_Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Thread.h; sourceTree = ""; }; + A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = ""; }; + A96F41821412AFC60067FE9A /* wrap_WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = ""; }; + A96F41841412AFEB0067FE9A /* WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = ""; }; + A96F41851412AFEE0067FE9A /* WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeldJoint.h; sourceTree = ""; }; + A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WheelJoint.cpp; sourceTree = ""; }; + A96F41881412B3610067FE9A /* wrap_WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WheelJoint.h; sourceTree = ""; }; + A96F418A1412B3A30067FE9A /* WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WheelJoint.cpp; sourceTree = ""; }; + A96F418B1412B3A80067FE9A /* WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelJoint.h; sourceTree = ""; }; A96F41901412BBEE0067FE9A /* Canvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Canvas.cpp; sourceTree = ""; }; A96F41911412BBEE0067FE9A /* Canvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Canvas.h; sourceTree = ""; }; A96F41931412BBF80067FE9A /* PixelEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PixelEffect.cpp; sourceTree = ""; }; @@ -578,27 +585,13 @@ A96F419A1412BC070067FE9A /* wrap_Canvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Canvas.h; sourceTree = ""; }; A96F419C1412BC0E0067FE9A /* wrap_PixelEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PixelEffect.cpp; sourceTree = ""; }; A96F419D1412BC0E0067FE9A /* wrap_PixelEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_PixelEffect.h; sourceTree = ""; }; - A96F41811412AFB70067FE9A /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = ""; }; - A96F41821412AFC60067FE9A /* wrap_WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = ""; }; - A96F41841412AFEB0067FE9A /* WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = ""; }; - A96F41851412AFEE0067FE9A /* WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeldJoint.h; sourceTree = ""; }; - A96F41871412B35B0067FE9A /* wrap_WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WheelJoint.cpp; sourceTree = ""; }; - A96F41881412B3610067FE9A /* wrap_WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WheelJoint.h; sourceTree = ""; }; - A96F418A1412B3A30067FE9A /* WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WheelJoint.cpp; sourceTree = ""; }; - A96F418B1412B3A80067FE9A /* WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelJoint.h; sourceTree = ""; }; A96F41A21412C91E0067FE9A /* EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EdgeShape.cpp; sourceTree = ""; }; A96F41A31412C91E0067FE9A /* EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdgeShape.h; sourceTree = ""; }; A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_EdgeShape.cpp; sourceTree = ""; }; A96F41A61412C92B0067FE9A /* wrap_EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_EdgeShape.h; sourceTree = ""; }; A97E3842132A9EDE00198A2F /* love-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "love-Info.plist"; sourceTree = ""; }; - A986DEB1113249A800810279 /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Thread.cpp; sourceTree = ""; }; - A986DEB2113249A800810279 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; - A986DEB3113249A800810279 /* wrap_Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Thread.cpp; sourceTree = ""; }; - A986DEB4113249A800810279 /* wrap_Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Thread.h; sourceTree = ""; }; A986ECAD132CEB9300F048C8 /* Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Fixture.cpp; sourceTree = ""; }; A986ECAE132CEB9B00F048C8 /* Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fixture.h; sourceTree = ""; }; - A98D913E10507BF9008E03F2 /* EncodedImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EncodedImageData.h; sourceTree = ""; }; - A98D914310507C97008E03F2 /* EncodedImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EncodedImageData.cpp; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; A9B4BA981045937F001DBC80 /* ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleSystem.h; sourceTree = ""; }; A9B4BA991045937F001DBC80 /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = ""; }; @@ -1649,7 +1642,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0410; + LastUpgradeCheck = 0420; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "love" */; compatibilityVersion = "Xcode 3.2"; From ae02ee573c38f89a659c2dcfd1cec8d554dae2ef Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 13 Oct 2011 12:16:20 -0500 Subject: [PATCH 276/384] Update MSVC project --- platform/msvc2010/love.vcxproj | 159 ++++- platform/msvc2010/love.vcxproj.filters | 858 +++++++++++++++++-------- 2 files changed, 701 insertions(+), 316 deletions(-) diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 403dc85a2..a84abd2e9 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -15,12 +15,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TurnOffAllWarnings @@ -130,12 +176,16 @@ + + + + + - @@ -143,43 +193,19 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + @@ -188,7 +214,10 @@ + + + @@ -230,6 +259,7 @@ + @@ -240,6 +270,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -312,10 +388,15 @@ + + + + + @@ -324,12 +405,19 @@ + + + + + + + @@ -338,7 +426,10 @@ + + + @@ -397,7 +488,7 @@ Level3 Disabled - include;include\SDL;include\AL;..\..\src;..\..\src\modules;%(AdditionalIncludeDirectories) + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;%(AdditionalIncludeDirectories) MultiThreadedDebug %(Identity)_d.obj true @@ -420,7 +511,7 @@ MaxSpeed true true - include;include\SDL;include\AL;..\..\src;..\..\src\modules;%(AdditionalIncludeDirectories) + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;%(AdditionalIncludeDirectories) MultiThreaded NotSet %(Identity).obj diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index 561463ebd..29a791082 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -64,12 +64,6 @@ {b1d3e8d2-4ac9-4f6a-b69d-7ac42113d87f} - - {56c3b1e6-7dbc-40df-be87-11e6531de639} - - - {d05db3cf-4382-4e60-93ec-f0003a477a4c} - {cee682a4-e85e-49e5-b67c-c7ee37cca3aa} @@ -109,6 +103,33 @@ {58b00bbb-5c09-4510-8a23-5c3f869354b2} + + {5e41ee66-11e1-479f-8937-b14436a34de1} + + + {997022df-9fb8-4c89-9030-669d180c5a98} + + + {e757e102-2b56-4802-9a6d-03be5d69be25} + + + {31f30224-9040-4f55-b5fa-3e5a288e75d0} + + + {33235938-7b0c-451e-be82-8fe0cdb5a7be} + + + {31ed03bf-a64f-4508-8de3-de81c295a31f} + + + {12990be8-e8f2-4b22-994e-edd15c2b1cdd} + + + {0af6f9d5-64f5-4d97-bc07-502d9c7c6f7b} + + + {9282b1b4-0df5-4180-8840-ea58561dc7b8} + @@ -283,192 +304,6 @@ modules\mouse\sdl - - 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\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - - - modules\physics\box2d\Source - modules\sound @@ -619,6 +454,279 @@ modules\graphics + + Box2D\Collision\Shapes + + + Box2D\Collision\Shapes + + + Box2D\Collision\Shapes + + + Box2D\Collision\Shapes + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Rope + + + 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 + + + common + @@ -801,96 +909,6 @@ modules\mouse\sdl - - 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\timer\sdl @@ -1005,6 +1023,282 @@ modules\graphics + + Box2D + + + Box2D\Collision\Shapes + + + Box2D\Collision\Shapes + + + Box2D\Collision\Shapes + + + Box2D\Collision\Shapes + + + Box2D\Collision\Shapes + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Collision + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Common + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Contacts + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics\Joints + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Dynamics + + + Box2D\Rope + + + 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 + + + common + From 7a15953595a6a78803550f8b6f461ca9780adaa2 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 13 Oct 2011 12:38:19 -0500 Subject: [PATCH 277/384] Add cstddef include so certain compilers don't complain about NULL not being declared --- src/common/Memoizer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/Memoizer.cpp b/src/common/Memoizer.cpp index 792c2c13f..cfde69743 100644 --- a/src/common/Memoizer.cpp +++ b/src/common/Memoizer.cpp @@ -18,6 +18,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ #include "Memoizer.h" +#include namespace love { From dc66ea20c1b4659692d50bf048da1375c193705f Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 20 Oct 2011 20:19:01 +0200 Subject: [PATCH 278/384] Add SpriteBatch:set(q) and make add(q) return the index --- src/modules/graphics/opengl/SpriteBatch.cpp | 68 ++-- src/modules/graphics/opengl/SpriteBatch.h | 6 +- .../graphics/opengl/wrap_SpriteBatch.cpp | 298 ++++++++++-------- .../graphics/opengl/wrap_SpriteBatch.h | 2 + 4 files changed, 209 insertions(+), 165 deletions(-) diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index 3976931b5..9889c0d8e 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -99,50 +99,54 @@ namespace opengl delete element_buf; } - void SpriteBatch::add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky) + 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(next < size) - { - // Needed for texture coordinates. - memcpy(sprite, image->getVertices(), sizeof(vertex)*4); + if((index == -1 && next >= size) || index < -1 || index >= size) + return -1; - // Transform. - Matrix t; - t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); - t.transform(sprite, sprite, 4); + // Needed for colors. + memcpy(sprite, image->getVertices(), sizeof(vertex)*4); - if (color) - setColorv(sprite, *color); + // Transform. + Matrix t; + t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); + t.transform(sprite, sprite, 4); - addv(sprite); + if (color) + setColorv(sprite, *color); - // Increment counter. - next++; - } + addv(sprite, (index == -1 ? next : index)); + + // Increment counter. + if (index == -1) + return next++; + return index; } - void SpriteBatch::addq(Quad * quad, float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky) + 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(next < size) - { - // Needed for colors. - memcpy(sprite, quad->getVertices(), sizeof(vertex)*4); + if((index == -1 && next >= size) || index < -1 || index >= next) + return -1; - // Transform. - Matrix t; - t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); - t.transform(sprite, sprite, 4); + // Needed for colors. + memcpy(sprite, quad->getVertices(), sizeof(vertex)*4); - if (color) - setColorv(sprite, *color); + // Transform. + Matrix t; + t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); + t.transform(sprite, sprite, 4); - addv(sprite); + if (color) + setColorv(sprite, *color); - // Increment counter. - next++; - } + addv(sprite, (index == -1 ? next : index)); + + // Increment counter. + if (index == -1) + return next++; + return index; } void SpriteBatch::clear() @@ -226,13 +230,13 @@ namespace opengl glPopMatrix(); } - void SpriteBatch::addv(const vertex * v) + void SpriteBatch::addv(const vertex * v, int index) { int sprite_size = sizeof(vertex) * 4; VertexArray::Bind bind(*array_buf); - array_buf->fill(next * sprite_size, sprite_size, v); + array_buf->fill(index * sprite_size, sprite_size, v); } void SpriteBatch::setColorv(vertex * v, const Color & color) diff --git a/src/modules/graphics/opengl/SpriteBatch.h b/src/modules/graphics/opengl/SpriteBatch.h index 40300ce9a..9bab62b9a 100644 --- a/src/modules/graphics/opengl/SpriteBatch.h +++ b/src/modules/graphics/opengl/SpriteBatch.h @@ -83,8 +83,8 @@ namespace opengl SpriteBatch(Image * image, int size, int usage); virtual ~SpriteBatch(); - void add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky); - void addq(Quad * quad, float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky); + 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(); @@ -115,7 +115,7 @@ namespace opengl private: - void addv(const vertex * v); + void addv(const vertex * v, int index); /** * Set the color for vertices. diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp index ac22ad18d..f1df5043f 100644 --- a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp @@ -1,133 +1,171 @@ -/** -* 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. -**/ - -#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); - float x = (float)luaL_optnumber(L, 2, 0.0f); - float y = (float)luaL_optnumber(L, 3, 0.0f); - 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); - float oy = (float)luaL_optnumber(L, 8, 0); - float kx = (float)luaL_optnumber(L, 10, 0); - float ky = (float)luaL_optnumber(L, 11, 0); - t->add(x, y, angle, sx, sy, ox, oy, kx, ky); - return 0; - } - - int w_SpriteBatch_addq(lua_State * L) - { - SpriteBatch * t = luax_checkspritebatch(L, 1); - Quad * q = luax_checktype(L, 2, "Quad", GRAPHICS_QUAD_T); - float x = (float)luaL_optnumber(L, 3, 0.0f); - float y = (float)luaL_optnumber(L, 4, 0.0f); - float angle = (float)luaL_optnumber(L, 5, 0.0f); - float sx = (float)luaL_optnumber(L, 6, 1.0f); - float sy = (float)luaL_optnumber(L, 7, sx); - float ox = (float)luaL_optnumber(L, 8, 0); - float oy = (float)luaL_optnumber(L, 9, 0); - float kx = (float)luaL_optnumber(L, 10, 0); - float ky = (float)luaL_optnumber(L, 11, 0); - t->addq(q, x, y, angle, sx, sy, ox, oy, kx, ky); - 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); - 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_setColor(lua_State * L) - { - SpriteBatch * t = luax_checkspritebatch(L, 1); - - if (lua_gettop(L) <= 1) - t->setColor(); - else - { - Color c; +/** +* 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. +**/ + +#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); + float x = (float)luaL_optnumber(L, 2, 0.0f); + float y = (float)luaL_optnumber(L, 3, 0.0f); + 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); + float oy = (float)luaL_optnumber(L, 8, 0); + float kx = (float)luaL_optnumber(L, 9, 0); + float ky = (float)luaL_optnumber(L, 10, 0); + lua_pushnumber(L, t->add(x, y, angle, sx, sy, ox, oy, kx, ky)); + return 1; + } + + int w_SpriteBatch_addq(lua_State * L) + { + SpriteBatch * t = luax_checkspritebatch(L, 1); + Quad * q = luax_checktype(L, 2, "Quad", GRAPHICS_QUAD_T); + float x = (float)luaL_optnumber(L, 3, 0.0f); + float y = (float)luaL_optnumber(L, 4, 0.0f); + float angle = (float)luaL_optnumber(L, 5, 0.0f); + float sx = (float)luaL_optnumber(L, 6, 1.0f); + float sy = (float)luaL_optnumber(L, 7, sx); + float ox = (float)luaL_optnumber(L, 8, 0); + float oy = (float)luaL_optnumber(L, 9, 0); + float kx = (float)luaL_optnumber(L, 10, 0); + float ky = (float)luaL_optnumber(L, 11, 0); + lua_pushnumber(L, t->addq(q, x, y, angle, sx, sy, ox, oy, kx, ky)); + return 1; + } + + int w_SpriteBatch_set(lua_State * L) + { + SpriteBatch * t = luax_checkspritebatch(L, 1); + int index = luaL_checkinteger(L, 2); + float x = (float)luaL_optnumber(L, 3, 0.0f); + float y = (float)luaL_optnumber(L, 4, 0.0f); + float angle = (float)luaL_optnumber(L, 5, 0.0f); + float sx = (float)luaL_optnumber(L, 6, 1.0f); + float sy = (float)luaL_optnumber(L, 7, sx); + float ox = (float)luaL_optnumber(L, 8, 0); + float oy = (float)luaL_optnumber(L, 9, 0); + float kx = (float)luaL_optnumber(L, 10, 0); + float ky = (float)luaL_optnumber(L, 11, 0); + t->add(x, y, angle, sx, sy, ox, oy, kx, ky, index); + return 0; + } + + int w_SpriteBatch_setq(lua_State * L) + { + SpriteBatch * t = luax_checkspritebatch(L, 1); + int index = luaL_checkinteger(L, 2); + Quad * q = luax_checktype(L, 3, "Quad", GRAPHICS_QUAD_T); + float x = (float)luaL_optnumber(L, 4, 0.0f); + float y = (float)luaL_optnumber(L, 5, 0.0f); + float angle = (float)luaL_optnumber(L, 6, 0.0f); + float sx = (float)luaL_optnumber(L, 7, 1.0f); + float sy = (float)luaL_optnumber(L, 8, sx); + float ox = (float)luaL_optnumber(L, 9, 0); + float oy = (float)luaL_optnumber(L, 10, 0); + float kx = (float)luaL_optnumber(L, 11, 0); + float ky = (float)luaL_optnumber(L, 12, 0); + t->addq(q, x, y, angle, sx, sy, ox, oy, kx, ky, index); + 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); + 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_setColor(lua_State * L) + { + SpriteBatch * t = luax_checkspritebatch(L, 1); + + if (lua_gettop(L) <= 1) + t->setColor(); + else + { + Color c; c.r = (unsigned char)luaL_checkint(L, 2); c.g = (unsigned char)luaL_checkint(L, 3); c.b = (unsigned char)luaL_checkint(L, 4); - c.a = (unsigned char)luaL_optint(L, 5, 255); - t->setColor(c); - } - - return 0; - } - - static const luaL_Reg functions[] = { - { "add", w_SpriteBatch_add }, - { "addq", w_SpriteBatch_addq }, - { "clear", w_SpriteBatch_clear }, - { "bind", w_SpriteBatch_bind }, - { "unbind", w_SpriteBatch_unbind }, - { "setImage", w_SpriteBatch_setImage }, - { "setColor", w_SpriteBatch_setColor }, - { 0, 0 } - }; - - int luaopen_spritebatch(lua_State * L) - { - return luax_register_type(L, "SpriteBatch", functions); - } - -} // opengl -} // graphics -} // love + c.a = (unsigned char)luaL_optint(L, 5, 255); + t->setColor(c); + } + + return 0; + } + + static const luaL_Reg functions[] = { + { "add", w_SpriteBatch_add }, + { "addq", w_SpriteBatch_addq }, + { "set", w_SpriteBatch_set }, + { "setq", w_SpriteBatch_setq }, + { "clear", w_SpriteBatch_clear }, + { "bind", w_SpriteBatch_bind }, + { "unbind", w_SpriteBatch_unbind }, + { "setImage", w_SpriteBatch_setImage }, + { "setColor", w_SpriteBatch_setColor }, + { 0, 0 } + }; + + int luaopen_spritebatch(lua_State * L) + { + return luax_register_type(L, "SpriteBatch", functions); + } + +} // opengl +} // graphics +} // love diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.h b/src/modules/graphics/opengl/wrap_SpriteBatch.h index d2ced3d63..0a38477e5 100644 --- a/src/modules/graphics/opengl/wrap_SpriteBatch.h +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.h @@ -33,6 +33,8 @@ namespace opengl SpriteBatch * luax_checkspritebatch(lua_State * L, int idx); int w_SpriteBatch_add(lua_State * L); int w_SpriteBatch_addq(lua_State * L); + int w_SpriteBatch_set(lua_State * L); + int w_SpriteBatch_setq(lua_State * L); int w_SpriteBatch_clear(lua_State * L); int w_SpriteBatch_lock(lua_State * L); int w_SpriteBatch_unlock(lua_State * L); From a6eca47cef2d8e770414d4a4f6f9f948152b0023 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 20 Oct 2011 18:30:49 -0400 Subject: [PATCH 279/384] Add love.audio.stop() call to the error handlers --- src/scripts/boot.lua | 2 ++ src/scripts/boot.lua.h | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 93aa4f693..bd5e3286d 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -655,6 +655,7 @@ function love.errhand(msg) end -- Load. + if love.audio then love.audio.stop() end love.graphics.reset() love.graphics.setBackgroundColor(89, 157, 220) local font = love.graphics.newFont(14) @@ -719,6 +720,7 @@ function love.releaseerrhand(msg) love.graphics.setPixelEffect() -- Load. + if love.audio then love.audio.stop() end love.graphics.reset() love.graphics.setBackgroundColor(89, 157, 220) local font = love.graphics.newFont(14) diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 9944e00e0..88ac8841c 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -1623,6 +1623,9 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, 0x09, 0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2e, 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, @@ -1711,6 +1714,9 @@ const unsigned char boot_lua[] = 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x29, 0x0a,0x0a, 0x09, 0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2e, 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, From d8b1d67a34474e693355eaad9095446135ec1cf0 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 24 Oct 2011 17:43:56 +0200 Subject: [PATCH 280/384] Centralize NPOT support check for image, export it to isSupported --- src/modules/graphics/Graphics.cpp | 1 + src/modules/graphics/Graphics.h | 1 + src/modules/graphics/opengl/Image.cpp | 7 ++++++- src/modules/graphics/opengl/Image.h | 3 ++- src/modules/graphics/opengl/wrap_Graphics.cpp | 4 ++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index 7f8e4dc82..450682ce6 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -154,6 +154,7 @@ namespace graphics { { "canvas", Graphics::SUPPORT_CANVAS }, { "pixeleffect", Graphics::SUPPORT_PIXELEFFECT }, + { "npot", Graphics::SUPPORT_NPOT }, }; StringMap Graphics::support(Graphics::supportEntries, sizeof(Graphics::supportEntries)); diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index 0fe150d6f..f4bdb5dc5 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -83,6 +83,7 @@ namespace graphics { SUPPORT_CANVAS = 1, SUPPORT_PIXELEFFECT, + SUPPORT_NPOT, SUPPORT_MAX_ENUM }; diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index 06f572a21..0a684af96 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -278,7 +278,7 @@ namespace opengl bool Image::loadVolatile() { - if (GLEE_ARB_texture_non_power_of_two) + if (hasNpot()) return loadVolatileNPOT(); else return loadVolatilePOT(); @@ -387,6 +387,11 @@ namespace opengl glPopMatrix(); } + bool Image::hasNpot() + { + return GLEE_ARB_texture_non_power_of_two; + } + } // opengl } // graphics } // love diff --git a/src/modules/graphics/opengl/Image.h b/src/modules/graphics/opengl/Image.h index f3118b44a..1f134efdd 100644 --- a/src/modules/graphics/opengl/Image.h +++ b/src/modules/graphics/opengl/Image.h @@ -37,7 +37,6 @@ 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. @@ -138,6 +137,8 @@ namespace opengl bool loadVolatile(); void unloadVolatile(); + static bool hasNpot(); + private: void drawv(const Matrix & t, const vertex * v) const; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 753ff6332..dfb2bc441 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -791,6 +791,10 @@ namespace opengl if (!PixelEffect::isSupported()) supported = false; break; + case Graphics::SUPPORT_NPOT: + if (!Image::hasNpot()) + supported = false; + break; default: supported = false; } From f296fbb903e74e0881a1cbb3cadad3246285cff7 Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 26 Oct 2011 21:12:17 +0200 Subject: [PATCH 281/384] Add format guard --- src/modules/graphics/opengl/wrap_Graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index dfb2bc441..86f1c3261 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -391,7 +391,7 @@ namespace opengl lua_pushstring(L, e.what()); lua_pcall(L, 1,1, 0); const char* err = lua_tostring(L, -1); - return luaL_error(L, err); + return luaL_error(L, "%s", err); } return 1; From cd66b01da3607fd24e7460f5a809408701408b26 Mon Sep 17 00:00:00 2001 From: vrld Date: Wed, 26 Oct 2011 21:17:40 +0200 Subject: [PATCH 282/384] Add GLSL version number check to PixelEffect::isSupported() --- src/modules/graphics/opengl/PixelEffect.cpp | 21 +++++++++++++++++++-- src/modules/graphics/opengl/PixelEffect.h | 1 + src/modules/graphics/opengl/wrap_Graphics.h | 1 - 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/modules/graphics/opengl/PixelEffect.cpp b/src/modules/graphics/opengl/PixelEffect.cpp index 91f00c159..7f894b3a1 100644 --- a/src/modules/graphics/opengl/PixelEffect.cpp +++ b/src/modules/graphics/opengl/PixelEffect.cpp @@ -2,6 +2,7 @@ #include "GLee.h" #include #include +#include namespace { @@ -44,7 +45,6 @@ namespace opengl return _current_texture_unit; } - PixelEffect::PixelEffect(const std::string& code) : _program(0), _code(code) { @@ -120,9 +120,26 @@ namespace opengl glDeleteProgram(_program); } + std::string PixelEffect::getGLSLVersion() + { + // GL_SHADING_LANGUAGE_VERSION is not available in OpenGL < 2.1. + // Be very pessimistic about the GLSL version in that case. + if (!GLEE_VERSION_2_1) + 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 + std::string versionString((const char*)glGetString(GL_SHADING_LANGUAGE_VERSION)); + size_t minorEndPos = versionString.find(" "); + return versionString.substr(0, minorEndPos); + } + + bool PixelEffect::isSupported() { - return GLEE_VERSION_2_0 && GLEE_ARB_shader_objects && GLEE_ARB_fragment_shader; + return GLEE_VERSION_2_0 && GLEE_ARB_shader_objects && GLEE_ARB_fragment_shader && getGLSLVersion() >= "1.2"; } std::string PixelEffect::getWarnings() const diff --git a/src/modules/graphics/opengl/PixelEffect.h b/src/modules/graphics/opengl/PixelEffect.h index 4d34190e4..79f6e8941 100644 --- a/src/modules/graphics/opengl/PixelEffect.h +++ b/src/modules/graphics/opengl/PixelEffect.h @@ -26,6 +26,7 @@ namespace opengl void attach(); static void detach(); + static std::string getGLSLVersion(); static bool isSupported(); void sendFloat(const std::string& name, int size, const GLfloat* vec, int count); diff --git a/src/modules/graphics/opengl/wrap_Graphics.h b/src/modules/graphics/opengl/wrap_Graphics.h index 74f862006..c64781b2a 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.h +++ b/src/modules/graphics/opengl/wrap_Graphics.h @@ -93,7 +93,6 @@ namespace opengl int w_getRenderTarget(lua_State * L); int w_setPixelEffect(lua_State * L); int w_isSupported(lua_State * L); - int w_getGLSLVersion(lua_State * L); int w_draw(lua_State * L); int w_drawq(lua_State * L); int w_drawTest(lua_State * L); From 2753c6298504f7e34733cdc3a523ede30ae5cbb2 Mon Sep 17 00:00:00 2001 From: rude Date: Fri, 28 Oct 2011 10:47:16 +0200 Subject: [PATCH 283/384] Abstractify some modules completely: timer, keyboard and mouse. If this commit breaks some project file(s), well ... I AM RUDE AND I WILL BREAK EVERYTHING, AHAHAHAHAHAHAHHAHAHAHAHA! --- platform/msvc2010/love.vcxproj | 13 +-- platform/msvc2010/love.vcxproj.filters | 99 ++++++++++--------- src/love.cpp | 12 +-- src/modules/keyboard/Keyboard.cpp | 3 +- src/modules/keyboard/Keyboard.h | 26 +++++ src/modules/keyboard/sdl/Keyboard.cpp | 2 + src/modules/keyboard/sdl/Keyboard.h | 22 ----- .../keyboard/{sdl => }/wrap_Keyboard.cpp | 10 +- .../keyboard/{sdl => }/wrap_Keyboard.h | 14 +-- src/modules/mouse/Mouse.h | 10 ++ src/modules/mouse/sdl/Mouse.cpp | 13 --- src/modules/mouse/sdl/Mouse.h | 7 -- src/modules/mouse/{sdl => }/wrap_Mouse.cpp | 9 +- src/modules/mouse/{sdl => }/wrap_Mouse.h | 10 +- src/modules/timer/Timer.h | 85 ++++++++++++++++ src/modules/timer/sdl/Timer.h | 85 +++++----------- src/modules/timer/{sdl => }/wrap_Timer.cpp | 10 +- src/modules/timer/{sdl => }/wrap_Timer.h | 10 +- 18 files changed, 239 insertions(+), 201 deletions(-) rename src/modules/keyboard/{sdl => }/wrap_Keyboard.cpp (92%) rename src/modules/keyboard/{sdl => }/wrap_Keyboard.h (82%) rename src/modules/mouse/{sdl => }/wrap_Mouse.cpp (92%) rename src/modules/mouse/{sdl => }/wrap_Mouse.h (86%) create mode 100644 src/modules/timer/Timer.h rename src/modules/timer/{sdl => }/wrap_Timer.cpp (91%) rename src/modules/timer/{sdl => }/wrap_Timer.h (85%) diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index a84abd2e9..573b0f3e4 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -172,10 +172,10 @@ - + - + @@ -248,7 +248,7 @@ - + @@ -384,10 +384,10 @@ - + - + @@ -449,7 +449,8 @@ - + + diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index 29a791082..ab9c93a59 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -286,24 +286,6 @@ modules\joystick\sdl - - modules\keyboard - - - modules\keyboard\sdl - - - modules\keyboard\sdl - - - modules\mouse - - - modules\mouse\sdl - - - modules\mouse\sdl - modules\sound @@ -337,12 +319,6 @@ modules\sound\lullaby - - modules\timer\sdl - - - modules\timer\sdl - luasocket @@ -727,6 +703,30 @@ common + + modules\timer\sdl + + + modules\timer + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\keyboard + + + modules\keyboard + + + modules\keyboard\sdl + @@ -891,30 +891,6 @@ modules\joystick\sdl - - modules\keyboard - - - modules\keyboard\sdl - - - modules\keyboard\sdl - - - modules\mouse - - - modules\mouse\sdl - - - modules\mouse\sdl - - - modules\timer\sdl - - - modules\timer\sdl - luasocket @@ -1299,6 +1275,33 @@ common + + modules\timer\sdl + + + modules\timer + + + modules\timer + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\keyboard + + + modules\keyboard + + + modules\keyboard\sdl + diff --git a/src/love.cpp b/src/love.cpp index b2ec85caa..4b454b2d2 100644 --- a/src/love.cpp +++ b/src/love.cpp @@ -47,11 +47,11 @@ #include #include #include -#include -#include +#include +#include #include #include -#include +#include #include // Libraries. @@ -72,11 +72,11 @@ static const luaL_Reg modules[] = { { "love.graphics", love::graphics::opengl::luaopen_love_graphics }, { "love.image", love::image::luaopen_love_image }, { "love.joystick", love::joystick::sdl::luaopen_love_joystick }, - { "love.keyboard", love::keyboard::sdl::luaopen_love_keyboard }, - { "love.mouse", love::mouse::sdl::luaopen_love_mouse }, + { "love.keyboard", love::keyboard::luaopen_love_keyboard }, + { "love.mouse", love::mouse::luaopen_love_mouse }, { "love.physics", love::physics::box2d::luaopen_love_physics }, { "love.sound", love::sound::luaopen_love_sound }, - { "love.timer", love::timer::sdl::luaopen_love_timer }, + { "love.timer", love::timer::luaopen_love_timer }, { "love.thread", love::thread::luaopen_love_thread }, { 0, 0 } }; diff --git a/src/modules/keyboard/Keyboard.cpp b/src/modules/keyboard/Keyboard.cpp index db16cb501..6bc2caac3 100644 --- a/src/modules/keyboard/Keyboard.cpp +++ b/src/modules/keyboard/Keyboard.cpp @@ -18,13 +18,14 @@ * 3. This notice may not be removed or altered from any source distribution. **/ +#include + #include "Keyboard.h" namespace love { namespace keyboard { - bool Keyboard::getConstant(const char * in, Keyboard::Key & out) { return keys.find(in, out); diff --git a/src/modules/keyboard/Keyboard.h b/src/modules/keyboard/Keyboard.h index 9d3753a4e..4fc257d64 100644 --- a/src/modules/keyboard/Keyboard.h +++ b/src/modules/keyboard/Keyboard.h @@ -184,6 +184,32 @@ namespace keyboard virtual ~Keyboard(){} + /** + * Checks whether a certain key is down or not. + * @param key A key identifier. + * @return boolean + **/ + virtual bool isDown(Key * keylist) const = 0; + + /** + * Enables key repeating. + * @param delay The amount of delay before repeating the key (in milliseconds) + * @param interval Specifies the amount of time between repeats (in milliseconds) + **/ + virtual void setKeyRepeat(int delay, int interval) const = 0; + + /** + * Gets the specified delay for the key repeat. + * @return int + **/ + virtual int getKeyRepeatDelay() const = 0; + + /** + * Gets the specified interval for the key repeat. + * @return int + **/ + virtual int getKeyRepeatInterval() const = 0; + static bool getConstant(const char * in, Key & out); static bool getConstant(Key in, const char *& out); diff --git a/src/modules/keyboard/sdl/Keyboard.cpp b/src/modules/keyboard/sdl/Keyboard.cpp index 30b13bc8e..6bd13a029 100644 --- a/src/modules/keyboard/sdl/Keyboard.cpp +++ b/src/modules/keyboard/sdl/Keyboard.cpp @@ -18,6 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ +#include + #include "Keyboard.h" namespace love diff --git a/src/modules/keyboard/sdl/Keyboard.h b/src/modules/keyboard/sdl/Keyboard.h index 4183ee7e0..251571fdb 100644 --- a/src/modules/keyboard/sdl/Keyboard.h +++ b/src/modules/keyboard/sdl/Keyboard.h @@ -40,31 +40,9 @@ namespace sdl // Implements Module. const char * getName() const; - - /** - * Checks whether a certain key is down or not. - * @param key A key identifier. - * @return boolean - **/ bool isDown(Key * keylist) const; - - /** - * Enables key repeating. - * @param delay The amount of delay before repeating the key (in milliseconds) - * @param interval Specifies the amount of time between repeats (in milliseconds) - **/ void setKeyRepeat(int delay, int interval) const; - - /** - * Gets the specified delay for the key repeat. - * @return int - **/ int getKeyRepeatDelay() const; - - /** - * Gets the specified interval for the key repeat. - * @return int - **/ int getKeyRepeatInterval() const; private: diff --git a/src/modules/keyboard/sdl/wrap_Keyboard.cpp b/src/modules/keyboard/wrap_Keyboard.cpp similarity index 92% rename from src/modules/keyboard/sdl/wrap_Keyboard.cpp rename to src/modules/keyboard/wrap_Keyboard.cpp index 11f11d459..614b0a492 100644 --- a/src/modules/keyboard/sdl/wrap_Keyboard.cpp +++ b/src/modules/keyboard/wrap_Keyboard.cpp @@ -18,13 +18,15 @@ * 3. This notice may not be removed or altered from any source distribution. **/ +#include + #include "wrap_Keyboard.h" +#include "sdl/Keyboard.h" + namespace love { namespace keyboard -{ -namespace sdl { static Keyboard * instance; @@ -81,7 +83,7 @@ namespace sdl { try { - instance = new Keyboard(); + instance = new love::keyboard::sdl::Keyboard(); } catch(Exception & e) { @@ -100,7 +102,5 @@ namespace sdl return luax_register_module(L, w); } - -} // sdl } // keyboard } // love diff --git a/src/modules/keyboard/sdl/wrap_Keyboard.h b/src/modules/keyboard/wrap_Keyboard.h similarity index 82% rename from src/modules/keyboard/sdl/wrap_Keyboard.h rename to src/modules/keyboard/wrap_Keyboard.h index 798850e5f..7a33fc7b2 100644 --- a/src/modules/keyboard/sdl/wrap_Keyboard.h +++ b/src/modules/keyboard/wrap_Keyboard.h @@ -18,29 +18,21 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_KEYBOARD_SDL_WRAP_KEYBOARD_H -#define LOVE_KEYBOARD_SDL_WRAP_KEYBOARD_H +#ifndef LOVE_KEYBOARD_WRAP_KEYBOARD_H +#define LOVE_KEYBOARD_WRAP_KEYBOARD_H // LOVE -#include #include "Keyboard.h" -// SDL -#include - namespace love { namespace keyboard -{ -namespace sdl { int w_isDown(lua_State * L); int w_setKeyRepeat(lua_State * L); int w_getKeyRepeat(lua_State * L); extern "C" LOVE_EXPORT int luaopen_love_keyboard(lua_State * L); - -} // sdl } // keyboard } // love -#endif // LOVE_KEYBOARD_SDL_WRAP_KEYBOARD_H +#endif // LOVE_KEYBOARD_WRAP_KEYBOARD_H diff --git a/src/modules/mouse/Mouse.h b/src/modules/mouse/Mouse.h index b8d6a05d3..cf3f8cc54 100644 --- a/src/modules/mouse/Mouse.h +++ b/src/modules/mouse/Mouse.h @@ -48,6 +48,16 @@ namespace mouse virtual ~Mouse(){}; + virtual int getX() const = 0; + virtual int getY() const = 0; + virtual void getPosition(int & x, int & y) const = 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 setGrab(bool grab) = 0; + virtual bool isGrabbed() const = 0; + static bool getConstant(const char * in, Button & out); static bool getConstant(Button in, const char *& out); diff --git a/src/modules/mouse/sdl/Mouse.cpp b/src/modules/mouse/sdl/Mouse.cpp index 010510b78..9a8e4be06 100644 --- a/src/modules/mouse/sdl/Mouse.cpp +++ b/src/modules/mouse/sdl/Mouse.cpp @@ -91,19 +91,6 @@ namespace sdl return (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON ? true : false); } - EnumMap::Entry Mouse::buttonEntries[] = - { - { Mouse::BUTTON_LEFT, SDL_BUTTON_LEFT}, - { Mouse::BUTTON_MIDDLE, SDL_BUTTON_MIDDLE}, - { Mouse::BUTTON_RIGHT, SDL_BUTTON_RIGHT}, - { Mouse::BUTTON_WHEELUP, SDL_BUTTON_WHEELUP}, - { Mouse::BUTTON_WHEELDOWN, SDL_BUTTON_WHEELDOWN}, - { Mouse::BUTTON_X1, SDL_BUTTON_X1}, - { Mouse::BUTTON_X2, SDL_BUTTON_X2}, - }; - - EnumMap Mouse::buttons(Mouse::buttonEntries, sizeof(Mouse::buttonEntries)); - } // sdl } // mouse } // love diff --git a/src/modules/mouse/sdl/Mouse.h b/src/modules/mouse/sdl/Mouse.h index 31b03fb95..aab2f8d63 100644 --- a/src/modules/mouse/sdl/Mouse.h +++ b/src/modules/mouse/sdl/Mouse.h @@ -23,7 +23,6 @@ // LOVE #include -#include namespace love { @@ -47,12 +46,6 @@ namespace sdl bool isVisible() const; void setGrab(bool grab); bool isGrabbed() const; - - public: - - static EnumMap::Entry buttonEntries[]; - static EnumMap buttons; - }; // Mouse } // sdl diff --git a/src/modules/mouse/sdl/wrap_Mouse.cpp b/src/modules/mouse/wrap_Mouse.cpp similarity index 92% rename from src/modules/mouse/sdl/wrap_Mouse.cpp rename to src/modules/mouse/wrap_Mouse.cpp index 2460c2547..96ac1503e 100644 --- a/src/modules/mouse/sdl/wrap_Mouse.cpp +++ b/src/modules/mouse/wrap_Mouse.cpp @@ -18,13 +18,15 @@ * 3. This notice may not be removed or altered from any source distribution. **/ +#include + +#include "sdl/Mouse.h" + #include "wrap_Mouse.h" namespace love { namespace mouse -{ -namespace sdl { static Mouse * instance = 0; @@ -122,7 +124,7 @@ namespace sdl { try { - instance = new Mouse(); + instance = new love::mouse::sdl::Mouse(); } catch(Exception & e) { @@ -142,6 +144,5 @@ namespace sdl return luax_register_module(L, w); } -} // sdl } // mouse } // love diff --git a/src/modules/mouse/sdl/wrap_Mouse.h b/src/modules/mouse/wrap_Mouse.h similarity index 86% rename from src/modules/mouse/sdl/wrap_Mouse.h rename to src/modules/mouse/wrap_Mouse.h index 6c3b9cdc7..0210b19ff 100644 --- a/src/modules/mouse/sdl/wrap_Mouse.h +++ b/src/modules/mouse/wrap_Mouse.h @@ -18,18 +18,15 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_MOUSE_SDL_WRAP_MOUSE_H -#define LOVE_MOUSE_SDL_WRAP_MOUSE_H +#ifndef LOVE_MOUSE_WRAP_MOUSE_H +#define LOVE_MOUSE_WRAP_MOUSE_H // LOVE -#include #include "Mouse.h" namespace love { namespace mouse -{ -namespace sdl { int w_getX(lua_State * L); int w_getY(lua_State * L); @@ -42,9 +39,8 @@ namespace sdl int w_isGrabbed(lua_State * L); extern "C" LOVE_EXPORT int luaopen_love_mouse(lua_State * L); -} // sdl } // mouse } // love -#endif // LOVE_MOUSE_SDL_WRAP_MOUSE_H +#endif // LOVE_MOUSE_WRAP_MOUSE_H diff --git a/src/modules/timer/Timer.h b/src/modules/timer/Timer.h new file mode 100644 index 000000000..eaaa7c578 --- /dev/null +++ b/src/modules/timer/Timer.h @@ -0,0 +1,85 @@ +/** +* 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_TIMER_TIMER_H +#define LOVE_TIMER_TIMER_H + +// LOVE +#include + +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) = 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 double getFPS() const = 0; + + /** + * Gets the amount of time since the program started. Only useful for timing + * code or measuring intervals. + * @return The time (in seconds) since the program started. + **/ + virtual double getTime() const = 0; + + /** + * Gets the amount of time passed since an unspecified time. The time is accurate + * to the microsecond, and is limited to 24 hours. + * @return The time (in seconds) + **/ + virtual double getMicroTime() const = 0; + + }; // Timer + +} // timer +} // love + +#endif // LOVE_TIMER_TIMER_H diff --git a/src/modules/timer/sdl/Timer.h b/src/modules/timer/sdl/Timer.h index 9f8772d48..0d30658ae 100644 --- a/src/modules/timer/sdl/Timer.h +++ b/src/modules/timer/sdl/Timer.h @@ -25,7 +25,7 @@ #include // LOVE -#include +#include namespace love { @@ -37,10 +37,33 @@ 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 Module + 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); + double getDelta() const; + double getFPS() const; + double getTime() const; + double getMicroTime() const; + private: + // Timing vars for benchmarking. + Uint32 time_init; + // Frame delta vars. Uint32 currTime; Uint32 prevTime; @@ -58,64 +81,6 @@ namespace sdl // The current timestep. double dt; - public: - - /** - * Constructor. Initializes the SDL/timer subsystem. - **/ - Timer(); - - /** - * Destructor. - **/ - ~Timer(); - - /** - * Gets the name of the module. - * @return Always returns "love.timer.sdl". - **/ - const char * getName() const; - - /** - * Measures the time between this call and the previous call, - * and updates internal values accordinly. - **/ - void step(); - - /** - * Tries to sleep for the specified amount of time. The precision is - * usually 1ms. - * @param seconds The number of seconds to sleep for. - **/ - void sleep(double seconds); - - /** - * Gets the time between the last two frames, assuming step is called - * each frame. - **/ - double getDelta() const; - - /** - * 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. - **/ - double getFPS() const; - - /** - * Gets the amount of time since the program started. Only useful for timing - * code or measuring intervals. - * @return The time (in seconds) since the program started. - **/ - double getTime() const; - - /** - * Gets the amount of time passed since an unspecified time. The time is accurate - * to the microsecond, and is limited to 24 hours. - * @return The time (in seconds) - **/ - double getMicroTime() const; - }; // Timer } // sdl diff --git a/src/modules/timer/sdl/wrap_Timer.cpp b/src/modules/timer/wrap_Timer.cpp similarity index 91% rename from src/modules/timer/sdl/wrap_Timer.cpp rename to src/modules/timer/wrap_Timer.cpp index 402e646f1..279c2a5b6 100644 --- a/src/modules/timer/sdl/wrap_Timer.cpp +++ b/src/modules/timer/wrap_Timer.cpp @@ -18,14 +18,16 @@ * 3. This notice may not be removed or altered from any source distribution. **/ +#include + // LOVE #include "wrap_Timer.h" +#include "sdl/Timer.h" + namespace love { namespace timer -{ -namespace sdl { static Timer * instance = 0; @@ -83,7 +85,8 @@ namespace sdl { try { - instance = new Timer(); + instance = new love::timer::sdl::Timer(); + } catch(Exception & e) { @@ -103,6 +106,5 @@ namespace sdl return luax_register_module(L, w); } -} // sdl } // timer } // love diff --git a/src/modules/timer/sdl/wrap_Timer.h b/src/modules/timer/wrap_Timer.h similarity index 85% rename from src/modules/timer/sdl/wrap_Timer.h rename to src/modules/timer/wrap_Timer.h index 4863bd269..57836a9e0 100644 --- a/src/modules/timer/sdl/wrap_Timer.h +++ b/src/modules/timer/wrap_Timer.h @@ -18,18 +18,15 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_TIMER_SDL_WRAP_TIMER_H -#define LOVE_TIMER_SDL_WRAP_TIMER_H +#ifndef LOVE_TIMER_WRAP_TIMER_H +#define LOVE_TIMER_WRAP_TIMER_H // LOVE -#include #include "Timer.h" namespace love { namespace timer -{ -namespace sdl { int w_step(lua_State * L); int w_getDelta(lua_State * L); @@ -39,8 +36,7 @@ namespace sdl int w_getMicroTime(lua_State * L); extern "C" LOVE_EXPORT int luaopen_love_timer(lua_State * L); -} // sdl } // timer } // love -#endif // LOVE_TIMER_SDL_WRAP_TIMER_H +#endif // LOVE_TIMER_WRAP_TIMER_H From 7eb1cef99c28967d52f9b559c1664f9a0461e318 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Tue, 1 Nov 2011 11:48:28 -0400 Subject: [PATCH 284/384] Update Xcode project for newly abstractified modules --- .../macosx/love.xcodeproj/project.pbxproj | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 0bf00ddc6..728ab0ecd 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -94,9 +94,7 @@ A946D73410424AA4002BF36C /* wrap_Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AB910420AC3007D418B /* wrap_Joystick.cpp */; }; A946D73510424AA4002BF36C /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AB710420AC3007D418B /* Joystick.cpp */; }; A946D73910424AB8002BF36C /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6ABE10420AC3007D418B /* Keyboard.cpp */; }; - A946D73A10424AB8002BF36C /* wrap_Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AC010420AC3007D418B /* wrap_Keyboard.cpp */; }; A946D73C10424AC7002BF36C /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AC510420AC3007D418B /* Mouse.cpp */; }; - A946D73D10424AC7002BF36C /* wrap_Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6AC710420AC3007D418B /* wrap_Mouse.cpp */; }; A946D7DA10424E57002BF36C /* wrap_GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B5810420ACA007D418B /* wrap_GearJoint.cpp */; }; A946D7DC10424E57002BF36C /* wrap_Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6810420ACA007D418B /* wrap_Shape.cpp */; }; A946D7DD10424E57002BF36C /* wrap_PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B6010420ACA007D418B /* wrap_PolygonShape.cpp */; }; @@ -135,7 +133,6 @@ A946D83110424EE3002BF36C /* wrap_SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B8B10420ACB007D418B /* wrap_SoundData.cpp */; }; A946D83210424EE3002BF36C /* VorbisDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B8110420ACB007D418B /* VorbisDecoder.cpp */; }; A946D83310424EE3002BF36C /* SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B8510420ACB007D418B /* SoundData.cpp */; }; - A946D85510425002002BF36C /* wrap_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B9110420ACC007D418B /* wrap_Timer.cpp */; }; A946D85610425002002BF36C /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6B8F10420ACC007D418B /* Timer.cpp */; }; A95684F7125D3555001B276B /* b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A95684F5125D3555001B276B /* b64.cpp */; }; A958F911142D364C007F320F /* wrap_Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A958F910142D3627007F320F /* wrap_Fixture.cpp */; }; @@ -163,6 +160,9 @@ A96F419E1412BC0E0067FE9A /* wrap_PixelEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F419C1412BC0E0067FE9A /* wrap_PixelEffect.cpp */; }; A96F41A41412C91F0067FE9A /* EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41A21412C91E0067FE9A /* EdgeShape.cpp */; }; A96F41A71412C92B0067FE9A /* wrap_EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */; }; + A97E632514604BC200020E43 /* wrap_Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A97E632314604BC200020E43 /* wrap_Keyboard.cpp */; }; + A97E632814604BCF00020E43 /* wrap_Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A97E632614604BCF00020E43 /* wrap_Mouse.cpp */; }; + A97E632C14604BDF00020E43 /* wrap_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A97E632A14604BDF00020E43 /* wrap_Timer.cpp */; }; A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986ECAD132CEB9300F048C8 /* Fixture.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; A9B4BA9D1045937F001DBC80 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */; }; @@ -431,13 +431,9 @@ A93E6ABC10420AC3007D418B /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; A93E6ABE10420AC3007D418B /* Keyboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Keyboard.cpp; sourceTree = ""; }; A93E6ABF10420AC3007D418B /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; - A93E6AC010420AC3007D418B /* wrap_Keyboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Keyboard.cpp; sourceTree = ""; }; - A93E6AC110420AC3007D418B /* wrap_Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Keyboard.h; sourceTree = ""; }; A93E6AC310420AC3007D418B /* Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mouse.h; sourceTree = ""; }; A93E6AC510420AC3007D418B /* Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; A93E6AC610420AC3007D418B /* Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mouse.h; sourceTree = ""; }; - A93E6AC710420AC3007D418B /* wrap_Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Mouse.cpp; sourceTree = ""; }; - A93E6AC810420AC3007D418B /* wrap_Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Mouse.h; sourceTree = ""; }; A93E6AEB10420AC7007D418B /* Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Body.cpp; sourceTree = ""; }; A93E6AEC10420AC7007D418B /* Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Body.h; sourceTree = ""; }; A93E6AED10420AC7007D418B /* CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CircleShape.cpp; sourceTree = ""; }; @@ -521,8 +517,6 @@ A93E6B8C10420ACB007D418B /* wrap_SoundData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_SoundData.h; sourceTree = ""; }; A93E6B8F10420ACC007D418B /* Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timer.cpp; sourceTree = ""; }; A93E6B9010420ACC007D418B /* Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = ""; }; - A93E6B9110420ACC007D418B /* wrap_Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Timer.cpp; sourceTree = ""; }; - A93E6B9210420ACC007D418B /* wrap_Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Timer.h; sourceTree = ""; }; A93E6B9710420ACC007D418B /* boot.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.lua; path = boot.lua; sourceTree = ""; }; A93E6B9810420ACC007D418B /* boot.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = boot.lua.h; sourceTree = ""; }; A93E6B9910420ACC007D418B /* graphics.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.lua; path = graphics.lua; sourceTree = ""; }; @@ -590,6 +584,13 @@ A96F41A51412C92B0067FE9A /* wrap_EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_EdgeShape.cpp; sourceTree = ""; }; A96F41A61412C92B0067FE9A /* wrap_EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_EdgeShape.h; sourceTree = ""; }; A97E3842132A9EDE00198A2F /* love-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "love-Info.plist"; sourceTree = ""; }; + A97E632314604BC200020E43 /* wrap_Keyboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Keyboard.cpp; sourceTree = ""; }; + A97E632414604BC200020E43 /* wrap_Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Keyboard.h; sourceTree = ""; }; + A97E632614604BCF00020E43 /* wrap_Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Mouse.cpp; sourceTree = ""; }; + A97E632714604BCF00020E43 /* wrap_Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Mouse.h; sourceTree = ""; }; + A97E632914604BDF00020E43 /* Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = ""; }; + A97E632A14604BDF00020E43 /* wrap_Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Timer.cpp; sourceTree = ""; }; + A97E632B14604BDF00020E43 /* wrap_Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Timer.h; sourceTree = ""; }; A986ECAD132CEB9300F048C8 /* Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Fixture.cpp; sourceTree = ""; }; A986ECAE132CEB9B00F048C8 /* Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fixture.h; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; @@ -1186,6 +1187,8 @@ A968F0D61083A9F200A895AA /* Keyboard.cpp */, A93E6ABC10420AC3007D418B /* Keyboard.h */, A93E6ABD10420AC3007D418B /* sdl */, + A97E632314604BC200020E43 /* wrap_Keyboard.cpp */, + A97E632414604BC200020E43 /* wrap_Keyboard.h */, ); path = keyboard; sourceTree = ""; @@ -1195,8 +1198,6 @@ children = ( A93E6ABE10420AC3007D418B /* Keyboard.cpp */, A93E6ABF10420AC3007D418B /* Keyboard.h */, - A93E6AC010420AC3007D418B /* wrap_Keyboard.cpp */, - A93E6AC110420AC3007D418B /* wrap_Keyboard.h */, ); path = sdl; sourceTree = ""; @@ -1207,6 +1208,8 @@ A968F0D81083A9FC00A895AA /* Mouse.cpp */, A93E6AC310420AC3007D418B /* Mouse.h */, A93E6AC410420AC3007D418B /* sdl */, + A97E632614604BCF00020E43 /* wrap_Mouse.cpp */, + A97E632714604BCF00020E43 /* wrap_Mouse.h */, ); path = mouse; sourceTree = ""; @@ -1216,8 +1219,6 @@ children = ( A93E6AC510420AC3007D418B /* Mouse.cpp */, A93E6AC610420AC3007D418B /* Mouse.h */, - A93E6AC710420AC3007D418B /* wrap_Mouse.cpp */, - A93E6AC810420AC3007D418B /* wrap_Mouse.h */, ); path = sdl; sourceTree = ""; @@ -1369,6 +1370,9 @@ isa = PBXGroup; children = ( A93E6B8E10420ACB007D418B /* sdl */, + A97E632914604BDF00020E43 /* Timer.h */, + A97E632A14604BDF00020E43 /* wrap_Timer.cpp */, + A97E632B14604BDF00020E43 /* wrap_Timer.h */, ); path = timer; sourceTree = ""; @@ -1378,8 +1382,6 @@ children = ( A93E6B8F10420ACC007D418B /* Timer.cpp */, A93E6B9010420ACC007D418B /* Timer.h */, - A93E6B9110420ACC007D418B /* wrap_Timer.cpp */, - A93E6B9210420ACC007D418B /* wrap_Timer.h */, ); path = sdl; sourceTree = ""; @@ -1748,9 +1750,7 @@ A946D73410424AA4002BF36C /* wrap_Joystick.cpp in Sources */, A946D73510424AA4002BF36C /* Joystick.cpp in Sources */, A946D73910424AB8002BF36C /* Keyboard.cpp in Sources */, - A946D73A10424AB8002BF36C /* wrap_Keyboard.cpp in Sources */, A946D73C10424AC7002BF36C /* Mouse.cpp in Sources */, - A946D73D10424AC7002BF36C /* wrap_Mouse.cpp in Sources */, A946D7DA10424E57002BF36C /* wrap_GearJoint.cpp in Sources */, A946D7DC10424E57002BF36C /* wrap_Shape.cpp in Sources */, A946D7DD10424E57002BF36C /* wrap_PolygonShape.cpp in Sources */, @@ -1789,7 +1789,6 @@ A946D83110424EE3002BF36C /* wrap_SoundData.cpp in Sources */, A946D83210424EE3002BF36C /* VorbisDecoder.cpp in Sources */, A946D83310424EE3002BF36C /* SoundData.cpp in Sources */, - A946D85510425002002BF36C /* wrap_Timer.cpp in Sources */, A946D85610425002002BF36C /* Timer.cpp in Sources */, A9255DEC1043188D00BA1496 /* SDLMain.m in Sources */, A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */, @@ -1877,6 +1876,9 @@ A9D5C513142E5F7F0044ECF7 /* b2WeldJoint.cpp in Sources */, A9D5C514142E5F7F0044ECF7 /* b2WheelJoint.cpp in Sources */, A9D5C515142E5F7F0044ECF7 /* b2Rope.cpp in Sources */, + A97E632514604BC200020E43 /* wrap_Keyboard.cpp in Sources */, + A97E632814604BCF00020E43 /* wrap_Mouse.cpp in Sources */, + A97E632C14604BDF00020E43 /* wrap_Timer.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 9d63f08472fa199ea6bdf581c88f13d3adf43a3d Mon Sep 17 00:00:00 2001 From: vrld Date: Fri, 4 Nov 2011 19:08:37 +0100 Subject: [PATCH 285/384] Make GLSL compiler messages NULL-terminated strings, even if they already are. --- src/modules/graphics/opengl/PixelEffect.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/modules/graphics/opengl/PixelEffect.cpp b/src/modules/graphics/opengl/PixelEffect.cpp index 7f894b3a1..1a42bfd89 100644 --- a/src/modules/graphics/opengl/PixelEffect.cpp +++ b/src/modules/graphics/opengl/PixelEffect.cpp @@ -1,8 +1,5 @@ #include "PixelEffect.h" #include "GLee.h" -#include -#include -#include namespace { @@ -144,10 +141,13 @@ namespace opengl std::string PixelEffect::getWarnings() const { - GLint strlen; + GLint strlen, nullpos; glGetProgramiv(_program, GL_INFO_LOG_LENGTH, &strlen); - char *temp_str = new char[strlen]; - glGetProgramInfoLog(_program, strlen, NULL, temp_str); + char *temp_str = new char[strlen+1]; + // be extra sure that the error string will be 0-terminated + memset(temp_str, '\0', strlen+1); + glGetProgramInfoLog(_program, strlen, &nullpos, temp_str); + temp_str[nullpos] = '\0'; std::string warnings(temp_str); delete[] temp_str; From d8666202cd6b38457b12704d6bb9dae129c364e1 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 5 Nov 2011 22:07:15 +0100 Subject: [PATCH 286/384] Improve compatibility check (I still can't believe robin was right) --- src/modules/font/freetype/Font.h | 2 +- src/modules/font/freetype/TrueTypeRasterizer.cpp | 7 ++++++- src/modules/font/freetype/TrueTypeRasterizer.h | 5 ++++- src/modules/font/freetype/wrap_Font.cpp | 2 +- src/modules/graphics/opengl/Font.cpp | 9 ++++++--- src/modules/graphics/opengl/Font.h | 3 ++- src/scripts/boot.lua | 1 + src/scripts/boot.lua.h | 1 + 8 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/modules/font/freetype/Font.h b/src/modules/font/freetype/Font.h index f8dfa6231..b50469573 100644 --- a/src/modules/font/freetype/Font.h +++ b/src/modules/font/freetype/Font.h @@ -73,4 +73,4 @@ namespace freetype } // font } // love -#endif // LOVE_FONT_FREETYPE_FONT_H \ No newline at end of file +#endif // LOVE_FONT_FREETYPE_FONT_H diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index ce5a0e2a1..e00428a62 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -51,10 +51,15 @@ namespace freetype metrics.ascent = s.ascender >> 6; metrics.descent = s.descender >> 6; metrics.height = s.height >> 6; + + ref = WeakReference::obtain(this); } TrueTypeRasterizer::~TrueTypeRasterizer() { + ref->destroy(); + ref->release(); + FT_Done_Face(face); data->release(); } @@ -116,4 +121,4 @@ namespace freetype } // freetype } // font -} // love \ No newline at end of file +} // love diff --git a/src/modules/font/freetype/TrueTypeRasterizer.h b/src/modules/font/freetype/TrueTypeRasterizer.h index 6fc13db0b..d16e69ce5 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.h +++ b/src/modules/font/freetype/TrueTypeRasterizer.h @@ -24,6 +24,7 @@ // LOVE #include #include +#include // TrueType2 #include @@ -51,6 +52,8 @@ namespace freetype // File data Data * data; + + WeakReference * ref; public: TrueTypeRasterizer(FT_Library library, Data * data, int size); @@ -67,4 +70,4 @@ namespace freetype } // font } // love -#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H \ No newline at end of file +#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H diff --git a/src/modules/font/freetype/wrap_Font.cpp b/src/modules/font/freetype/wrap_Font.cpp index e04d52978..6bd88aeb1 100644 --- a/src/modules/font/freetype/wrap_Font.cpp +++ b/src/modules/font/freetype/wrap_Font.cpp @@ -49,7 +49,7 @@ namespace freetype int size = luaL_checkint(L, 2); t = instance->newRasterizer(d, size); } - + luax_newtype(L, "Rasterizer", FONT_RASTERIZER_T, t); return 1; } diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 10046413e..bfb50fe6a 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -40,9 +40,9 @@ namespace opengl { Font::Font(love::font::Rasterizer * r, const Image::Filter& filter) - : rasterizer(r), height(r->getHeight()), lineHeight(1), mSpacing(1), filter(filter) + : height(r->getHeight()), lineHeight(1), mSpacing(1), filter(filter) { - r->retain(); + rasterizer = WeakReference::obtain(r); love::font::GlyphData * gd = r->getGlyphData(32); type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA ? FONT_TRUETYPE : FONT_IMAGE); delete gd; @@ -51,6 +51,7 @@ namespace opengl Font::~Font() { + rasterizer->destroy(); rasterizer->release(); unloadVolatile(); } @@ -83,13 +84,15 @@ namespace opengl Font::Glyph * Font::addGlyph(int glyph) { + if (!rasterizer->isValid) return 0; + love::font::Rasterizer *r = (love::font::Rasterizer*) rasterizer->getData(); Glyph * g = new Glyph; g->list = glGenLists(1); if (g->list == 0) { // opengl failed to generate the list delete g; return NULL; } - love::font::GlyphData *gd = rasterizer->getGlyphData(glyph); + love::font::GlyphData *gd = r->getGlyphData(glyph); g->spacing = gd->getAdvance(); int w = gd->getWidth(); int h = gd->getHeight(); diff --git a/src/modules/graphics/opengl/Font.h b/src/modules/graphics/opengl/Font.h index ef4d44a8e..680efc0c1 100644 --- a/src/modules/graphics/opengl/Font.h +++ b/src/modules/graphics/opengl/Font.h @@ -28,6 +28,7 @@ // LOVE #include +#include #include #include @@ -56,7 +57,7 @@ namespace opengl int spacing; }; - love::font::Rasterizer * rasterizer; + WeakReference *rasterizer; int height; float lineHeight; diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index bd5e3286d..c91da091c 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -321,6 +321,7 @@ function love.init() for i, v in ipairs(love._version_compat) do if c.version == v then compat = true + break end end if not compat then diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 88ac8841c..0398c1e38 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -544,6 +544,7 @@ const unsigned char boot_lua[] = 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, From 49ec65dbf3dc9dc96c1e3ac10c564231972e9e13 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 5 Nov 2011 23:17:32 +0100 Subject: [PATCH 287/384] Oops, didn't have a clean tree --- src/modules/font/freetype/Font.h | 2 +- src/modules/font/freetype/TrueTypeRasterizer.cpp | 7 +------ src/modules/font/freetype/TrueTypeRasterizer.h | 5 +---- src/modules/font/freetype/wrap_Font.cpp | 2 +- src/modules/graphics/opengl/Font.cpp | 9 +++------ src/modules/graphics/opengl/Font.h | 3 +-- src/scripts/boot.lua | 1 - src/scripts/boot.lua.h | 1 - 8 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/modules/font/freetype/Font.h b/src/modules/font/freetype/Font.h index b50469573..f8dfa6231 100644 --- a/src/modules/font/freetype/Font.h +++ b/src/modules/font/freetype/Font.h @@ -73,4 +73,4 @@ namespace freetype } // font } // love -#endif // LOVE_FONT_FREETYPE_FONT_H +#endif // LOVE_FONT_FREETYPE_FONT_H \ No newline at end of file diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index e00428a62..ce5a0e2a1 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -51,15 +51,10 @@ namespace freetype metrics.ascent = s.ascender >> 6; metrics.descent = s.descender >> 6; metrics.height = s.height >> 6; - - ref = WeakReference::obtain(this); } TrueTypeRasterizer::~TrueTypeRasterizer() { - ref->destroy(); - ref->release(); - FT_Done_Face(face); data->release(); } @@ -121,4 +116,4 @@ namespace freetype } // freetype } // font -} // love +} // love \ No newline at end of file diff --git a/src/modules/font/freetype/TrueTypeRasterizer.h b/src/modules/font/freetype/TrueTypeRasterizer.h index d16e69ce5..6fc13db0b 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.h +++ b/src/modules/font/freetype/TrueTypeRasterizer.h @@ -24,7 +24,6 @@ // LOVE #include #include -#include // TrueType2 #include @@ -52,8 +51,6 @@ namespace freetype // File data Data * data; - - WeakReference * ref; public: TrueTypeRasterizer(FT_Library library, Data * data, int size); @@ -70,4 +67,4 @@ namespace freetype } // font } // love -#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H +#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H \ No newline at end of file diff --git a/src/modules/font/freetype/wrap_Font.cpp b/src/modules/font/freetype/wrap_Font.cpp index 6bd88aeb1..e04d52978 100644 --- a/src/modules/font/freetype/wrap_Font.cpp +++ b/src/modules/font/freetype/wrap_Font.cpp @@ -49,7 +49,7 @@ namespace freetype int size = luaL_checkint(L, 2); t = instance->newRasterizer(d, size); } - + luax_newtype(L, "Rasterizer", FONT_RASTERIZER_T, t); return 1; } diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index bfb50fe6a..10046413e 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -40,9 +40,9 @@ namespace opengl { Font::Font(love::font::Rasterizer * r, const Image::Filter& filter) - : height(r->getHeight()), lineHeight(1), mSpacing(1), filter(filter) + : rasterizer(r), height(r->getHeight()), lineHeight(1), mSpacing(1), filter(filter) { - rasterizer = WeakReference::obtain(r); + r->retain(); love::font::GlyphData * gd = r->getGlyphData(32); type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA ? FONT_TRUETYPE : FONT_IMAGE); delete gd; @@ -51,7 +51,6 @@ namespace opengl Font::~Font() { - rasterizer->destroy(); rasterizer->release(); unloadVolatile(); } @@ -84,15 +83,13 @@ namespace opengl Font::Glyph * Font::addGlyph(int glyph) { - if (!rasterizer->isValid) return 0; - love::font::Rasterizer *r = (love::font::Rasterizer*) rasterizer->getData(); Glyph * g = new Glyph; g->list = glGenLists(1); if (g->list == 0) { // opengl failed to generate the list delete g; return NULL; } - love::font::GlyphData *gd = r->getGlyphData(glyph); + love::font::GlyphData *gd = rasterizer->getGlyphData(glyph); g->spacing = gd->getAdvance(); int w = gd->getWidth(); int h = gd->getHeight(); diff --git a/src/modules/graphics/opengl/Font.h b/src/modules/graphics/opengl/Font.h index 680efc0c1..ef4d44a8e 100644 --- a/src/modules/graphics/opengl/Font.h +++ b/src/modules/graphics/opengl/Font.h @@ -28,7 +28,6 @@ // LOVE #include -#include #include #include @@ -57,7 +56,7 @@ namespace opengl int spacing; }; - WeakReference *rasterizer; + love::font::Rasterizer * rasterizer; int height; float lineHeight; diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index c91da091c..bd5e3286d 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -321,7 +321,6 @@ function love.init() for i, v in ipairs(love._version_compat) do if c.version == v then compat = true - break end end if not compat then diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 0398c1e38..88ac8841c 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -544,7 +544,6 @@ const unsigned char boot_lua[] = 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, From f0aa29f9a5cc317d364d8db4abfabbb48c68c07a Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 5 Nov 2011 23:18:30 +0100 Subject: [PATCH 288/384] The actual commit --- src/scripts/boot.lua | 1 + src/scripts/boot.lua.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index bd5e3286d..c91da091c 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -321,6 +321,7 @@ function love.init() for i, v in ipairs(love._version_compat) do if c.version == v then compat = true + break end end if not compat then diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 88ac8841c..0398c1e38 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -544,6 +544,7 @@ const unsigned char boot_lua[] = 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, From f9077ee1a6667f3dfc043ac741827943be5a82b9 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 8 Nov 2011 22:33:08 +0100 Subject: [PATCH 289/384] Store the vera font as file data, instead of doing that every time it is loaded --- src/scripts/graphics.lua | 8 ++++---- src/scripts/graphics.lua.h | 20 +++++++------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index 6354de039..ab7e2f7e1 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -20,7 +20,7 @@ misrepresented as being the original software. do - local vera_ttf_b64 = [[ + local vera_ttf = love.filesystem.newFileData([[ AAEAAAARAQAABAAQT1MvMrRf9GMAAOtwAAAAVlBDTFTRil6XAADryAAAADZjbWFwpMPooAAA sWwAAANYY3Z0IP/THTkAAB78AAAB/GZwZ23ntPHEAAAmYAAAAItnYXNwAAcABwABAUgAAAAM Z2x5Zgx0Qc8AACbsAACKfmhkbXg08CEOAADsAAAAFUhoZWFk3YSi0AABAVQAAAA2aGhlYRBF @@ -1242,12 +1242,12 @@ do DhwPDwkJFw4REQUSCwsSEg4JCQ8mExITEhIICAgIFhYWFRUVCA4ODg4ODg4ODg4QCBIPEw8J FhERERESFxcLCwsbGxsWEggSDxQPFA8SCgkSDg4ODg4OCw4OAAAAAAACAAgAAv//AAMAAQAA AAIAAAxQCuxfDzz1AB8IAAAAAAC6ufC4AAAAALrCZ5H+if4dCkwHbQAAAAgAAQAAAAAAAA== - ]] + ]], "Vera.ttf", "base64") love.graphics.newFont = function(font, size) if type(font) == "number" or not font then size = font - font = love.filesystem.newFileData(vera_ttf_b64, "Vera.ttf", "base64") + font = vera_ttf end return love.graphics.newFont1(font, size or 12) end @@ -1255,7 +1255,7 @@ do love.graphics.setFont = function(font, size) if type(font) == "number" or not font then size = font - font = love.filesystem.newFileData(vera_ttf_b64, "Vera.ttf", "base64") + font = vera_ttf end return love.graphics.setFont1(font, size or 12) end diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index ee24c94b0..eabc244c7 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -80,8 +80,9 @@ const unsigned char graphics_lua[] = 0x6e, 0x2e, 0x0a, 0x2d, 0x2d, 0x5d, 0x5d, 0x0a,0x0a, 0x64, 0x6f, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x5f, 0x62, 0x36, - 0x34, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 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, @@ -6187,7 +6188,8 @@ const unsigned char graphics_lua[] = 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, 0x0a,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,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, @@ -6195,11 +6197,7 @@ const unsigned char graphics_lua[] = 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, 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, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x5f, 0x62, 0x36, 0x34, 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, 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, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x28, 0x66, 0x6f, 0x6e, 0x74, @@ -6212,11 +6210,7 @@ const unsigned char graphics_lua[] = 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, 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, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x5f, 0x62, 0x36, 0x34, 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, 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, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x28, 0x66, 0x6f, 0x6e, 0x74, From aedf532cdc5645596fd04a8014260b019f2d768c Mon Sep 17 00:00:00 2001 From: vrld Date: Tue, 8 Nov 2011 23:22:48 +0100 Subject: [PATCH 290/384] Fix 3/4 of issue #327: memory allocation issues. --- src/common/utf8.cpp | 12 ++++++------ src/modules/graphics/opengl/PixelEffect.h | 2 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 9 ++++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/common/utf8.cpp b/src/common/utf8.cpp index df702fa2c..6bd0220cb 100644 --- a/src/common/utf8.cpp +++ b/src/common/utf8.cpp @@ -36,12 +36,12 @@ namespace love // Convert to UTF-8. int ok = WideCharToMultiByte(CP_UTF8, 0, wstr, wide_len, utf8_str, utf8_size, 0, 0); - if(!ok) - { - delete [] utf8_str; - } + std::string ret; + if (ok) + ret = utf8_str; - return ok ? std::string(utf8_str) : std::string(); + delete utf8_str; + return ret; } void replace_char(std::string & str, char find, char replace) @@ -57,4 +57,4 @@ namespace love } // love -#endif // LOVE_WINDOWS \ No newline at end of file +#endif // LOVE_WINDOWS diff --git a/src/modules/graphics/opengl/PixelEffect.h b/src/modules/graphics/opengl/PixelEffect.h index 79f6e8941..6e60df310 100644 --- a/src/modules/graphics/opengl/PixelEffect.h +++ b/src/modules/graphics/opengl/PixelEffect.h @@ -14,7 +14,7 @@ namespace graphics namespace opengl { // A fragment shader - class PixelEffect : public Volatile // Volatile? + class PixelEffect : public Volatile, public Object { public: PixelEffect(const std::string& code); diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 86f1c3261..883379878 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -245,6 +245,7 @@ namespace opengl int w_newFont1(lua_State * L) { + Data * font_data = NULL; // Convert to File, if necessary. if(lua_isstring(L, 1)) luax_convobj(L, 1, "filesystem", "newFile"); @@ -252,15 +253,14 @@ namespace opengl // Convert to Data, if necessary. if(luax_istype(L, 1, FILESYSTEM_FILE_T)) { love::filesystem::File * f = luax_checktype(L, 1, "File", FILESYSTEM_FILE_T); - Data * d; try { - d = f->read(); + font_data = f->read(); } catch (love::Exception & e) { return luaL_error(L, e.what()); } lua_remove(L, 1); // get rid of the file - luax_newtype(L, "Data", DATA_T, (void*)d); + luax_newtype(L, "Data", DATA_T, (void*)font_data); lua_insert(L, 1); // put it at the bottom of the stack } @@ -270,6 +270,9 @@ namespace opengl luax_convobj(L, idxs, 2, "font", "newRasterizer"); } + if (font_data) + font_data->release(); + love::font::Rasterizer * rasterizer = luax_checktype(L, 1, "Rasterizer", FONT_RASTERIZER_T); // Create the font. From cf2bfcc4a2372f9ba252c3c221a39e8739ab3a3e Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 12 Nov 2011 15:00:26 +0100 Subject: [PATCH 291/384] Fix more memory leaks (issue #327) --- src/modules/physics/box2d/World.cpp | 2 +- src/modules/thread/wrap_Thread.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 8e292d7c6..64c6dcd1b 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -77,7 +77,7 @@ namespace box2d Contact * c = new Contact(contact); - luax_newtype(L, "Contact", (PHYSICS_CONTACT_T), (void*)c, false); + luax_newtype(L, "Contact", (PHYSICS_CONTACT_T), (void*)c, true); int args = 3; if (impulse) { diff --git a/src/modules/thread/wrap_Thread.cpp b/src/modules/thread/wrap_Thread.cpp index 93a11bf32..6d1386264 100644 --- a/src/modules/thread/wrap_Thread.cpp +++ b/src/modules/thread/wrap_Thread.cpp @@ -262,8 +262,13 @@ namespace thread } } else + { data = luax_checktype(L, 2, "Data", DATA_T); + data->retain(); + } Thread *t = instance->newThread(name, data); + // do not worry, file->read() returns retained data + data->release(); if (!t) return luaL_error(L, "A thread with that name already exists."); luax_newtype(L, "Thread", THREAD_THREAD_T, (void*)t); From 03927f5207f493df749c1774f10d140e38a64ec6 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 12 Nov 2011 15:11:09 +0100 Subject: [PATCH 292/384] Use a fixed module loading order (bug #261) And yes, this means there won't be segfaults with jit builds, woo. --- src/scripts/boot.lua | 21 ++++++++++++++++++--- src/scripts/boot.lua.h | 28 ++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index c91da091c..ac1626d9b 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -222,6 +222,8 @@ 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", author = "Unnamed", @@ -280,9 +282,22 @@ function love.init() end -- Gets desired modules. - for k,v in pairs(c.modules) do - if v then - require("love." .. k) + for k,v in ipairs{ + "thread", + "timer", + "event", + "keyboard", + "joystick", + "mouse", + "sound", + "audio", + "image", + "font", + "graphics", + "physics", + } do + if c.modules[v] then + require("love." .. v) end end diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 0398c1e38..23b242421 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -372,6 +372,12 @@ const unsigned char boot_lua[] = 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, @@ -458,11 +464,25 @@ const unsigned char boot_lua[] = 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x63, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 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, 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, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 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, 0x6b, 0x29, 0x0a, + 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, From 7a513e1434a0b5ed5f6cb81ef0a900f4822bc764 Mon Sep 17 00:00:00 2001 From: vrld Date: Sat, 12 Nov 2011 21:11:41 +0100 Subject: [PATCH 293/384] Make love::Exception safe(r). Now allows exceptions of arbitrary length. Now allows catching a non-reference, i.e. catch(love::Exception e). --- src/common/Exception.cpp | 41 +++++++++++++------ src/common/Exception.h | 16 +++----- src/modules/graphics/opengl/Font.cpp | 4 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 2 +- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/common/Exception.cpp b/src/common/Exception.cpp index ca804345a..fc5bd222f 100644 --- a/src/common/Exception.cpp +++ b/src/common/Exception.cpp @@ -20,26 +20,43 @@ #include "Exception.h" #include +#include +using namespace std; namespace love { Exception::Exception(const char * fmt, ...) { va_list args; - va_start(args, fmt); - vsnprintf(buffer, BUFFER_SIZE, fmt, args); - va_end(args); - } + int size_buffer = 256, size_out; + char * buffer; + while (true) { + buffer = new char[size_buffer]; + memset(buffer, 0, size_buffer); - Exception::Exception(int unparsed, const char * str) - { - LOVE_UNUSED(unparsed); - strncpy(buffer, str, BUFFER_SIZE); - } + va_start(args, fmt); + size_out = vsnprintf(buffer, size_buffer, fmt, args); + va_end(args); - const char * Exception::what() const throw() - { - return (const char *)buffer; + // 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); + cerr << message << endl; + delete[] buffer; } } diff --git a/src/common/Exception.h b/src/common/Exception.h index 337ec9d36..c02a00eae 100644 --- a/src/common/Exception.h +++ b/src/common/Exception.h @@ -25,6 +25,7 @@ #include // vararg #include // vsnprintf #include // strncpy +#include namespace love { @@ -35,15 +36,7 @@ namespace love { private: - /** - * The vsnprintf operates on a buffer this large. - **/ - static const int BUFFER_SIZE = 256; - - /** - * The buffer for vsnprintf. - **/ - char buffer[BUFFER_SIZE]; + std::string message; public: @@ -55,13 +48,14 @@ namespace love * @param fmt The format string (see printf). **/ Exception(const char * fmt, ...); - Exception(int unparsed, const char * str); + virtual ~Exception() throw() {} /** * Returns a string containing reason for the exception. * @return A description of the exception. **/ - virtual const char * what() const throw(); + inline virtual const char * what() const throw() + { return message.c_str(); } }; // class diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 10046413e..139124cac 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -177,7 +177,7 @@ namespace opengl catch (utf8::exception & e) { glPopMatrix(); - throw love::Exception(1, e.what()); + throw love::Exception("%s", e.what()); } glPopMatrix(); } @@ -212,7 +212,7 @@ namespace opengl } catch (utf8::exception & e) { - throw love::Exception(1, e.what()); + throw love::Exception("%s", e.what()); } return temp; diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 883379878..436b492ec 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -388,7 +388,7 @@ namespace opengl const char* code = lua_tostring(L, -1); PixelEffect * effect = instance->newPixelEffect(code); luax_newtype(L, "PixelEffect", GRAPHICS_PIXELEFFECT_T, (void*)effect); - } catch (love::Exception& e) { + } catch (const love::Exception& e) { // memory is freed in Graphics::newPixelEffect luax_getfunction(L, "graphics", "_transformGLSLErrorMessages"); lua_pushstring(L, e.what()); From fec5b9ac916f11f48cd15d209e01800ed066cc33 Mon Sep 17 00:00:00 2001 From: vrld Date: Sat, 12 Nov 2011 21:13:38 +0100 Subject: [PATCH 294/384] Issue #327 again: w__gc's correctness depending on order of inheritance. --- src/modules/graphics/opengl/PixelEffect.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/graphics/opengl/PixelEffect.h b/src/modules/graphics/opengl/PixelEffect.h index 6e60df310..8ecb2307a 100644 --- a/src/modules/graphics/opengl/PixelEffect.h +++ b/src/modules/graphics/opengl/PixelEffect.h @@ -14,7 +14,7 @@ namespace graphics namespace opengl { // A fragment shader - class PixelEffect : public Volatile, public Object + class PixelEffect : public Object, public Volatile { public: PixelEffect(const std::string& code); From c208f4b08dc12c760c68bcd6e825a1978a52b71f Mon Sep 17 00:00:00 2001 From: vrld Date: Sat, 12 Nov 2011 21:19:35 +0100 Subject: [PATCH 295/384] Add missing license headers. --- src/modules/graphics/opengl/Canvas.cpp | 20 +++++++++++++++++++ src/modules/graphics/opengl/Canvas.h | 20 +++++++++++++++++++ src/modules/graphics/opengl/PixelEffect.cpp | 20 +++++++++++++++++++ src/modules/graphics/opengl/PixelEffect.h | 20 +++++++++++++++++++ src/modules/graphics/opengl/wrap_Canvas.cpp | 20 +++++++++++++++++++ src/modules/graphics/opengl/wrap_Canvas.h | 20 +++++++++++++++++++ .../graphics/opengl/wrap_PixelEffect.cpp | 20 +++++++++++++++++++ .../graphics/opengl/wrap_PixelEffect.h | 20 +++++++++++++++++++ 8 files changed, 160 insertions(+) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index 00fca68dd..d856701a0 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -1,3 +1,23 @@ +/** +* 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. +**/ + #include "Canvas.h" #include "Graphics.h" #include diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index 9ab5bb4ac..f55c09fca 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -1,3 +1,23 @@ +/** +* 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_OPENGL_CANVAS_H #define LOVE_GRAPHICS_OPENGL_CANVAS_H diff --git a/src/modules/graphics/opengl/PixelEffect.cpp b/src/modules/graphics/opengl/PixelEffect.cpp index 1a42bfd89..68283f59a 100644 --- a/src/modules/graphics/opengl/PixelEffect.cpp +++ b/src/modules/graphics/opengl/PixelEffect.cpp @@ -1,3 +1,23 @@ +/** +* 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. +**/ + #include "PixelEffect.h" #include "GLee.h" diff --git a/src/modules/graphics/opengl/PixelEffect.h b/src/modules/graphics/opengl/PixelEffect.h index 8ecb2307a..8f0fcbb13 100644 --- a/src/modules/graphics/opengl/PixelEffect.h +++ b/src/modules/graphics/opengl/PixelEffect.h @@ -1,3 +1,23 @@ +/** +* 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_EFFECT_H #define LOVE_GRAPHICS_EFFECT_H diff --git a/src/modules/graphics/opengl/wrap_Canvas.cpp b/src/modules/graphics/opengl/wrap_Canvas.cpp index 692f58b2c..30fdd20f8 100644 --- a/src/modules/graphics/opengl/wrap_Canvas.cpp +++ b/src/modules/graphics/opengl/wrap_Canvas.cpp @@ -1,3 +1,23 @@ +/** +* 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. +**/ + #include "Graphics.h" #include "wrap_Canvas.h" diff --git a/src/modules/graphics/opengl/wrap_Canvas.h b/src/modules/graphics/opengl/wrap_Canvas.h index 05f7ab5ad..b7847ed1d 100644 --- a/src/modules/graphics/opengl/wrap_Canvas.h +++ b/src/modules/graphics/opengl/wrap_Canvas.h @@ -1,3 +1,23 @@ +/** +* 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_OPENGL_WRAP_CANVAS_H #define LOVE_GRAPHICS_OPENGL_WRAP_CANVAS_H diff --git a/src/modules/graphics/opengl/wrap_PixelEffect.cpp b/src/modules/graphics/opengl/wrap_PixelEffect.cpp index 62a22af36..f431fc529 100644 --- a/src/modules/graphics/opengl/wrap_PixelEffect.cpp +++ b/src/modules/graphics/opengl/wrap_PixelEffect.cpp @@ -1,3 +1,23 @@ +/** +* 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. +**/ + #include "wrap_PixelEffect.h" #include "wrap_Image.h" #include "wrap_Canvas.h" diff --git a/src/modules/graphics/opengl/wrap_PixelEffect.h b/src/modules/graphics/opengl/wrap_PixelEffect.h index 06b15a928..2de0444e2 100644 --- a/src/modules/graphics/opengl/wrap_PixelEffect.h +++ b/src/modules/graphics/opengl/wrap_PixelEffect.h @@ -1,3 +1,23 @@ +/** +* 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_OPENGL_WRAP_PROGRAM_H #define LOVE_GRAPHICS_OPENGL_WRAP_PROGRAM_H From 7eef68f4ec33884d7f091ed82121ac45bb45d60c Mon Sep 17 00:00:00 2001 From: vrld Date: Sat, 12 Nov 2011 21:24:08 +0100 Subject: [PATCH 296/384] Remove printing exception message to stderr. --- src/common/Exception.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common/Exception.cpp b/src/common/Exception.cpp index fc5bd222f..9d3182a5b 100644 --- a/src/common/Exception.cpp +++ b/src/common/Exception.cpp @@ -55,7 +55,6 @@ namespace love delete[] buffer; } message = std::string(buffer); - cerr << message << endl; delete[] buffer; } From 983b00c5109b50488a7bad8eb1ac65954ad783bc Mon Sep 17 00:00:00 2001 From: vrld Date: Sat, 12 Nov 2011 22:09:56 +0100 Subject: [PATCH 297/384] Revert Canvas flipping (commits 9cb824e2fa84, e0234edd0026) in order to fix issue #324. --- src/modules/graphics/Quad.h | 5 +++ src/modules/graphics/opengl/Canvas.cpp | 28 +++++++++++----- src/modules/graphics/opengl/Quad.cpp | 44 ++++++++++++++++---------- src/modules/graphics/opengl/Quad.h | 18 ++++++----- 4 files changed, 62 insertions(+), 33 deletions(-) diff --git a/src/modules/graphics/Quad.h b/src/modules/graphics/Quad.h index a3487039f..6c3bad6f3 100644 --- a/src/modules/graphics/Quad.h +++ b/src/modules/graphics/Quad.h @@ -50,6 +50,11 @@ namespace graphics virtual void flip(bool x, bool y) = 0; + /** + * Mirror texture coordinates around 0.5 + */ + virtual void mirror(bool x, bool y) = 0; + /** * Gets a pointer to the vertices. **/ diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index d856701a0..bc1413da6 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -195,10 +195,10 @@ namespace opengl vertices[3].x = w; vertices[3].y = 0; // texture coordinates - 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; + vertices[0].s = 0; vertices[0].t = 1; + vertices[1].s = 0; vertices[1].t = 0; + vertices[2].s = 1; vertices[2].t = 0; + vertices[3].s = 1; vertices[3].t = 1; loadStrategy(); @@ -246,8 +246,8 @@ namespace opengl glPushMatrix(); glLoadIdentity(); - // Set up upside-down orthographic view (no depth) - glOrtho(0.0, width, 0.0, height, -1.0, 1.0); + // Set up orthographic view (no depth) + glOrtho(0.0, width, height, 0.0, -1.0, 1.0); // Switch back to modelview matrix glMatrixMode(GL_MODELVIEW); @@ -297,15 +297,20 @@ namespace opengl void Canvas::drawq(love::graphics::Quad * quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const { static Matrix t; + quad->mirror(false, true); const vertex * v = quad->getVertices(); t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); drawv(t, v); + quad->mirror(false, true); } love::image::ImageData * Canvas::getImageData(love::image::Image * image) { - GLubyte * pixels = new GLubyte[4*width*height]; + int row = 4 * width; + int size = row * height; + GLubyte* pixels = new GLubyte[size]; + GLubyte* screenshot = new GLubyte[size]; strategy->bindFBO( fbo ); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); @@ -314,8 +319,15 @@ namespace opengl else strategy->bindFBO( 0 ); - love::image::ImageData * img = image->newImageData(width, height, (void*)pixels); + GLubyte * src = pixels - row; // second line of source image + GLubyte * dst = screenshot + size; // last row of destination image + + for (int i = 0; i < height; ++i) + memcpy(dst -= row, src += row, row); + + love::image::ImageData* img = image->newImageData(width, height, (void*)screenshot); + delete[] screenshot; delete[] pixels; return img; diff --git a/src/modules/graphics/opengl/Quad.cpp b/src/modules/graphics/opengl/Quad.cpp index 635b2269a..8e079d9ed 100644 --- a/src/modules/graphics/opengl/Quad.cpp +++ b/src/modules/graphics/opengl/Quad.cpp @@ -1,14 +1,14 @@ /** * 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 @@ -36,7 +36,7 @@ namespace opengl Quad::Quad(const Viewport & v, float sw, float sh) : sw(sw), sh(sh) { - memset(vertices, 255, sizeof(vertex)*4); + memset(vertices, 255, sizeof(vertex)*NUM_VERTICES); refresh(v, sw, sh); } @@ -53,22 +53,22 @@ namespace opengl } viewport = v; - vertices[0].x = 0; + vertices[0].x = 0; vertices[0].y = 0; - vertices[1].x = 0; + vertices[1].x = 0; vertices[1].y = v.h; - vertices[2].x = v.w; + vertices[2].x = v.w; vertices[2].y = v.h; - vertices[3].x = v.w; + vertices[3].x = v.w; vertices[3].y = 0; - - vertices[0].s = v.x/sw; + + vertices[0].s = v.x/sw; vertices[0].t = v.y/sh; - vertices[1].s = v.x/sw; + vertices[1].s = v.x/sw; vertices[1].t = (v.y+v.h)/sh; - vertices[2].s = (v.x+v.w)/sw; + 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].s = (v.x+v.w)/sw; vertices[3].t = v.y/sh; } @@ -79,15 +79,15 @@ namespace opengl Quad::Viewport Quad::getViewport() const { - return viewport; + return viewport; } - + void Quad::flip(bool x, bool y) { vertex temp[4]; if (x) { - memcpy(temp, vertices, sizeof(vertex)*4); + memcpy(temp, vertices, sizeof(vertex)*NUM_VERTICES); vertices[0].s = temp[3].s; vertices[0].t = temp[3].t; vertices[1].s = temp[2].s; vertices[1].t = temp[2].t; vertices[2].s = temp[1].s; vertices[2].t = temp[1].t; @@ -95,7 +95,7 @@ namespace opengl } if (y) { - memcpy(temp, vertices, sizeof(vertex)*4); + memcpy(temp, vertices, sizeof(vertex)*NUM_VERTICES); vertices[0].s = temp[1].s; vertices[0].t = temp[1].t; vertices[1].s = temp[0].s; vertices[1].t = temp[0].t; vertices[2].s = temp[3].s; vertices[2].t = temp[3].t; @@ -103,6 +103,16 @@ namespace opengl } } + void Quad::mirror(bool x, bool y) + { + for (size_t i = 0; i < NUM_VERTICES; ++i) { + if (x) + vertices[i].s = 1.0 - vertices[i].s; + if (y) + vertices[i].s = 1.0 - vertices[i].s; + } + } + const vertex * Quad::getVertices() const { return vertices; diff --git a/src/modules/graphics/opengl/Quad.h b/src/modules/graphics/opengl/Quad.h index 10ff0bafc..720162245 100644 --- a/src/modules/graphics/opengl/Quad.h +++ b/src/modules/graphics/opengl/Quad.h @@ -1,14 +1,14 @@ /** * 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 @@ -33,11 +33,12 @@ namespace opengl { class Quad : public love::graphics::Quad { - + protected: - - vertex vertices[4]; - + + static const unsigned int NUM_VERTICES = 4; + vertex vertices[NUM_VERTICES]; + Viewport viewport; float sw, sh; @@ -47,7 +48,7 @@ namespace opengl * Creates a new Quad of size (w,h), using (x,y) as the top-left * anchor point in the source image. The size of the source image is * is specified by (sw,sh). - * + * * @param sw Width of the source image. * @param sh Height of the source image. **/ @@ -61,6 +62,7 @@ namespace opengl Viewport getViewport() const; void flip(bool x, bool y); + void mirror(bool x, bool y); /** * Gets a pointer to the vertices. From ec6b95d9925cfa77bd771fa4a7534cdebd324db9 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 13 Nov 2011 10:59:59 +0100 Subject: [PATCH 298/384] Obey to the LGPL and display the license text and used LGPL libraries in our license file --- license.txt | 864 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 863 insertions(+), 1 deletion(-) diff --git a/license.txt b/license.txt index 4d90789c9..4f5beac16 100644 --- a/license.txt +++ b/license.txt @@ -17,4 +17,866 @@ appreciated but is not required. 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 +distribution. + + + + +------- +LÖVE also uses the following LGPL libraries: + + - SDL + Website: http://libsdl.org + Source download: http://www.libsdl.org/release/SDL-1.2.14.tar.gz + - 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 +. From 2fafab9a0eee6988777aa088a2930292294ca6b5 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 15 Nov 2011 21:37:11 +0100 Subject: [PATCH 299/384] Add luax_checkstring/pushstring functions that handle inline \0 characters --- src/common/runtime.cpp | 12 ++++++++++++ src/common/runtime.h | 23 ++++++++++++++++++++--- src/modules/thread/wrap_Thread.cpp | 30 +++++++++--------------------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index 8408ae93b..11838ea45 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -117,6 +117,18 @@ namespace love return (lua_toboolean(L, idx) == 1 ? true : false); return b; } + + 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, std::string str) + { + lua_pushlstring(L, str.data(), str.size()); + } int luax_assert_argc(lua_State * L, int min) { diff --git a/src/common/runtime.h b/src/common/runtime.h index a4cca86dc..837943349 100644 --- a/src/common/runtime.h +++ b/src/common/runtime.h @@ -109,7 +109,7 @@ namespace love * 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 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); @@ -118,19 +118,36 @@ namespace love * Pushes a bool onto the stack. It's the same as lua_pushboolean, * but with bool instead of int. * @param L The Lua state. - * @paarm b The bool to push. + * @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 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_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, std::string str); + /** * Require at least 'min' number of items on the stack. * @param L The Lua state. diff --git a/src/modules/thread/wrap_Thread.cpp b/src/modules/thread/wrap_Thread.cpp index 6d1386264..7c7bd7f68 100644 --- a/src/modules/thread/wrap_Thread.cpp +++ b/src/modules/thread/wrap_Thread.cpp @@ -20,18 +20,6 @@ #include "wrap_Thread.h" -// anonymous namespace for getting an std::string from the stack -// that may contain embedded NULLs -namespace -{ - std::string luax_checklstring(lua_State *L, int idx) - { - size_t len; - const char* str = luaL_checklstring(L, idx, &len); - return std::string(str, len); - } -} - namespace love { namespace thread @@ -66,7 +54,7 @@ namespace thread { Thread *t = luax_checkthread(L, 1); // allow names containing \0 - lua_pushlstring(L, t->getName().c_str(), t->getName().length()); + luax_pushstring(L, t->getName()); return 1; } @@ -115,7 +103,7 @@ namespace thread int w_Thread_get(lua_State *L) { Thread *t = luax_checkthread(L, 1); - std::string name = luax_checklstring(L, 2); + std::string name = luax_checkstring(L, 2); t->lock(); ThreadVariant *v = t->get(name); t->clear(name); @@ -139,7 +127,7 @@ namespace thread for (std::vector::iterator it = keys.begin(); it != keys.end(); it++) { lua_pushnumber(L, i++); - lua_pushlstring(L, it->c_str(), it->length()); + luax_pushstring(L, *it); lua_settable(L, -3); } return 1; @@ -148,7 +136,7 @@ namespace thread int w_Thread_demand(lua_State *L) { Thread *t = luax_checkthread(L, 1); - std::string name = luax_checklstring(L, 2); + std::string name = luax_checkstring(L, 2); t->lock(); ThreadVariant *v = t->demand(name); t->clear(name); @@ -164,7 +152,7 @@ namespace thread int w_Thread_peek(lua_State *L) { Thread *t = luax_checkthread(L, 1); - std::string name = luax_checklstring(L, 2); + std::string name = luax_checkstring(L, 2); t->lock(); ThreadVariant *v = t->get(name); t->unlock(); @@ -195,7 +183,7 @@ namespace thread int w_Thread_set(lua_State *L) { Thread *t = luax_checkthread(L, 1); - std::string name = luax_checklstring(L, 2); + std::string name = luax_checkstring(L, 2); ThreadVariant *v; size_t len; const char *str; @@ -249,7 +237,7 @@ namespace thread int w_newThread(lua_State *L) { - std::string name = luax_checklstring(L, 1); + std::string name = luax_checkstring(L, 1); love::Data *data; if (lua_isstring(L, 2)) luax_convobj(L, 2, "filesystem", "newFile"); @@ -284,7 +272,7 @@ namespace thread for (unsigned int i = 0; igetName().c_str(), list[i]->getName().length()); + luax_pushstring(L, list[i]->getName()); luax_newtype(L, "Thread", THREAD_THREAD_T, (void*) list[i]); list[i]->lock(); list[i]->retain(); @@ -303,7 +291,7 @@ namespace thread lua_getfield(L, -1, "_curthread"); return 1; } - std::string name = luax_checklstring(L, 1); + std::string name = luax_checkstring(L, 1); Thread *t = instance->getThread(name); if (t) { From fafe47259528e9b613fa497916b77b8df1b5660c Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 16 Nov 2011 10:24:10 +0100 Subject: [PATCH 300/384] Prevent working with an invalid iterator (issue #331) --- src/modules/audio/openal/Pool.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index eda5a973f..46db72201 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -92,9 +92,10 @@ namespace openal i->first->rewindAtomic(); i->first->release(); available.push(i->second); - playing.erase(i); + playing.erase(i++); } - i++; + else + i++; } } From 0aae9684b3e2661b3cbe89e9c2d2b10c1fa1b318 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Wed, 16 Nov 2011 11:32:41 +0100 Subject: [PATCH 301/384] Automated formatting fix --- src/common/Data.h | 112 +- src/common/EnumMap.h | 20 +- src/common/Exception.cpp | 123 +- src/common/Exception.h | 128 +- src/common/Matrix.cpp | 392 +++--- src/common/Matrix.h | 332 ++--- src/common/Memoizer.cpp | 10 +- src/common/Memoizer.h | 10 +- src/common/Module.h | 12 +- src/common/Object.cpp | 2 +- src/common/Reference.cpp | 140 +- src/common/Reference.h | 12 +- src/common/StringMap.h | 32 +- src/common/Vector.cpp | 50 +- src/common/Vector.h | 620 ++++----- src/common/b64.cpp | 25 +- src/common/b64.h | 6 +- src/common/config.h | 6 +- src/common/math.h | 170 +-- src/common/runtime.cpp | 949 +++++++------- src/common/runtime.h | 10 +- src/common/types.h | 346 ++--- src/common/utf8.cpp | 10 +- src/common/utf8.h | 6 +- src/common/wrap_Data.cpp | 8 +- src/common/wrap_Data.h | 6 +- src/love.cpp | 23 +- src/modules/audio/Audio.h | 398 +++--- src/modules/audio/Source.cpp | 146 +-- src/modules/audio/Source.h | 214 +-- src/modules/audio/null/Audio.cpp | 14 +- src/modules/audio/null/Audio.h | 8 +- src/modules/audio/null/Source.cpp | 4 +- src/modules/audio/null/Source.h | 156 +-- src/modules/audio/openal/Audio.cpp | 58 +- src/modules/audio/openal/Audio.h | 10 +- src/modules/audio/openal/Pool.cpp | 36 +- src/modules/audio/openal/Pool.h | 6 +- src/modules/audio/openal/Source.cpp | 87 +- src/modules/audio/openal/Source.h | 2 +- src/modules/audio/wrap_Audio.cpp | 633 ++++----- src/modules/audio/wrap_Audio.h | 116 +- src/modules/audio/wrap_Source.cpp | 506 +++---- src/modules/audio/wrap_Source.h | 118 +- src/modules/event/sdl/Event.cpp | 13 +- src/modules/event/sdl/Event.h | 20 +- src/modules/event/sdl/wrap_Event.cpp | 466 +++---- src/modules/event/sdl/wrap_Event.h | 94 +- src/modules/filesystem/File.cpp | 8 +- src/modules/filesystem/File.h | 30 +- src/modules/filesystem/FileData.cpp | 10 +- src/modules/filesystem/FileData.h | 8 +- src/modules/filesystem/physfs/File.cpp | 48 +- src/modules/filesystem/physfs/File.h | 8 +- src/modules/filesystem/physfs/Filesystem.cpp | 113 +- src/modules/filesystem/physfs/wrap_File.cpp | 30 +- src/modules/filesystem/physfs/wrap_File.h | 6 +- .../filesystem/physfs/wrap_FileData.cpp | 8 +- src/modules/filesystem/physfs/wrap_FileData.h | 6 +- .../filesystem/physfs/wrap_Filesystem.cpp | 43 +- .../filesystem/physfs/wrap_Filesystem.h | 6 +- src/modules/font/Font.h | 6 +- src/modules/font/GlyphData.cpp | 5 +- src/modules/font/GlyphData.h | 20 +- src/modules/font/ImageRasterizer.cpp | 19 +- src/modules/font/ImageRasterizer.h | 14 +- src/modules/font/Rasterizer.cpp | 6 +- src/modules/font/Rasterizer.h | 10 +- src/modules/font/freetype/Font.cpp | 13 +- src/modules/font/freetype/Font.h | 12 +- .../font/freetype/TrueTypeRasterizer.cpp | 28 +- .../font/freetype/TrueTypeRasterizer.h | 8 +- src/modules/font/freetype/wrap_Font.cpp | 218 +-- src/modules/font/freetype/wrap_Font.h | 84 +- src/modules/font/wrap_GlyphData.cpp | 88 +- src/modules/font/wrap_GlyphData.h | 80 +- src/modules/font/wrap_Rasterizer.cpp | 88 +- src/modules/font/wrap_Rasterizer.h | 76 +- src/modules/graphics/DrawQable.cpp | 66 +- src/modules/graphics/DrawQable.h | 8 +- src/modules/graphics/Drawable.cpp | 66 +- src/modules/graphics/Drawable.h | 8 +- src/modules/graphics/Image.cpp | 28 +- src/modules/graphics/Image.h | 20 +- src/modules/graphics/Quad.cpp | 72 +- src/modules/graphics/Quad.h | 6 +- src/modules/graphics/Volatile.cpp | 12 +- src/modules/graphics/Volatile.h | 12 +- src/modules/graphics/opengl/Canvas.cpp | 39 +- src/modules/graphics/opengl/Canvas.h | 4 +- src/modules/graphics/opengl/Font.cpp | 73 +- src/modules/graphics/opengl/Font.h | 16 +- src/modules/graphics/opengl/Graphics.cpp | 118 +- src/modules/graphics/opengl/Graphics.h | 2 +- src/modules/graphics/opengl/Image.cpp | 14 +- .../graphics/opengl/ParticleSystem.cpp | 32 +- src/modules/graphics/opengl/ParticleSystem.h | 18 +- src/modules/graphics/opengl/PixelEffect.cpp | 21 +- src/modules/graphics/opengl/Quad.cpp | 247 ++-- src/modules/graphics/opengl/SpriteBatch.cpp | 14 +- src/modules/graphics/opengl/SpriteBatch.h | 276 ++-- src/modules/graphics/opengl/VertexBuffer.cpp | 11 +- src/modules/graphics/opengl/VertexBuffer.h | 542 ++++---- src/modules/graphics/opengl/wrap_Canvas.cpp | 14 +- src/modules/graphics/opengl/wrap_Font.cpp | 216 +-- src/modules/graphics/opengl/wrap_Font.h | 92 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 176 ++- src/modules/graphics/opengl/wrap_Graphics.h | 242 ++-- src/modules/graphics/opengl/wrap_Image.cpp | 268 ++-- src/modules/graphics/opengl/wrap_Image.h | 88 +- .../graphics/opengl/wrap_ParticleSystem.cpp | 31 +- .../graphics/opengl/wrap_ParticleSystem.h | 6 +- .../graphics/opengl/wrap_PixelEffect.cpp | 56 +- src/modules/graphics/opengl/wrap_Quad.cpp | 158 +-- src/modules/graphics/opengl/wrap_Quad.h | 88 +- .../graphics/opengl/wrap_SpriteBatch.cpp | 8 +- .../graphics/opengl/wrap_SpriteBatch.h | 98 +- src/modules/image/Image.h | 16 +- src/modules/image/ImageData.cpp | 20 +- src/modules/image/ImageData.h | 28 +- src/modules/image/devil/Image.cpp | 17 +- src/modules/image/devil/Image.h | 8 +- src/modules/image/devil/ImageData.cpp | 22 +- src/modules/image/wrap_Image.cpp | 33 +- src/modules/image/wrap_Image.h | 6 +- src/modules/image/wrap_ImageData.cpp | 391 +++--- src/modules/image/wrap_ImageData.h | 92 +- src/modules/joystick/Joystick.cpp | 8 +- src/modules/joystick/Joystick.h | 6 +- src/modules/joystick/sdl/Joystick.cpp | 504 +++---- src/modules/joystick/sdl/Joystick.h | 6 +- src/modules/joystick/sdl/wrap_Joystick.cpp | 386 +++--- src/modules/joystick/sdl/wrap_Joystick.h | 108 +- src/modules/keyboard/Keyboard.cpp | 8 +- src/modules/keyboard/sdl/Keyboard.cpp | 2 +- src/modules/keyboard/sdl/Keyboard.h | 6 +- src/modules/keyboard/wrap_Keyboard.cpp | 212 +-- src/modules/keyboard/wrap_Keyboard.h | 76 +- src/modules/mouse/Mouse.cpp | 8 +- src/modules/mouse/Mouse.h | 8 +- src/modules/mouse/sdl/Mouse.cpp | 6 +- src/modules/mouse/sdl/Mouse.h | 8 +- src/modules/mouse/wrap_Mouse.cpp | 296 ++--- src/modules/mouse/wrap_Mouse.h | 92 +- src/modules/physics/Body.cpp | 8 +- src/modules/physics/Body.h | 8 +- src/modules/physics/Joint.cpp | 116 +- src/modules/physics/Joint.h | 134 +- src/modules/physics/Shape.cpp | 104 +- src/modules/physics/Shape.h | 120 +- src/modules/physics/box2d/Body.cpp | 878 ++++++------- src/modules/physics/box2d/Body.h | 822 ++++++------ src/modules/physics/box2d/ChainShape.cpp | 32 +- src/modules/physics/box2d/ChainShape.h | 24 +- src/modules/physics/box2d/CircleShape.cpp | 120 +- src/modules/physics/box2d/CircleShape.h | 142 +- src/modules/physics/box2d/Contact.cpp | 231 ++-- src/modules/physics/box2d/Contact.h | 276 ++-- src/modules/physics/box2d/DistanceJoint.cpp | 164 +-- src/modules/physics/box2d/DistanceJoint.h | 178 +-- src/modules/physics/box2d/EdgeShape.cpp | 126 +- src/modules/physics/box2d/EdgeShape.h | 124 +- src/modules/physics/box2d/Fixture.cpp | 30 +- src/modules/physics/box2d/Fixture.h | 24 +- src/modules/physics/box2d/FrictionJoint.cpp | 14 +- src/modules/physics/box2d/FrictionJoint.h | 8 +- src/modules/physics/box2d/GearJoint.cpp | 130 +- src/modules/physics/box2d/GearJoint.h | 150 +-- src/modules/physics/box2d/Joint.cpp | 272 ++-- src/modules/physics/box2d/Joint.h | 262 ++-- src/modules/physics/box2d/MouseJoint.cpp | 192 +-- src/modules/physics/box2d/MouseJoint.h | 212 +-- src/modules/physics/box2d/Physics.cpp | 600 ++++----- src/modules/physics/box2d/Physics.h | 702 +++++----- src/modules/physics/box2d/PolygonShape.cpp | 128 +- src/modules/physics/box2d/PolygonShape.h | 134 +- src/modules/physics/box2d/PrismaticJoint.cpp | 288 ++-- src/modules/physics/box2d/PrismaticJoint.h | 294 ++--- src/modules/physics/box2d/PulleyJoint.cpp | 154 +-- src/modules/physics/box2d/PulleyJoint.h | 160 +-- src/modules/physics/box2d/RevoluteJoint.cpp | 280 ++-- src/modules/physics/box2d/RevoluteJoint.h | 294 ++--- src/modules/physics/box2d/RopeJoint.cpp | 6 +- src/modules/physics/box2d/RopeJoint.h | 16 +- src/modules/physics/box2d/Shape.cpp | 297 ++--- src/modules/physics/box2d/Shape.h | 162 +-- src/modules/physics/box2d/WeldJoint.cpp | 10 +- src/modules/physics/box2d/WeldJoint.h | 8 +- src/modules/physics/box2d/WheelJoint.cpp | 238 ++-- src/modules/physics/box2d/WheelJoint.h | 254 ++-- src/modules/physics/box2d/World.cpp | 886 ++++++------- src/modules/physics/box2d/World.h | 550 ++++---- src/modules/physics/box2d/wrap_Body.cpp | 1166 ++++++++--------- src/modules/physics/box2d/wrap_Body.h | 186 +-- src/modules/physics/box2d/wrap_ChainShape.cpp | 17 +- src/modules/physics/box2d/wrap_ChainShape.h | 10 +- .../physics/box2d/wrap_CircleShape.cpp | 142 +- src/modules/physics/box2d/wrap_CircleShape.h | 88 +- src/modules/physics/box2d/wrap_Contact.cpp | 270 ++-- src/modules/physics/box2d/wrap_Contact.h | 104 +- .../physics/box2d/wrap_DistanceJoint.cpp | 206 +-- .../physics/box2d/wrap_DistanceJoint.h | 96 +- src/modules/physics/box2d/wrap_EdgeShape.cpp | 124 +- src/modules/physics/box2d/wrap_EdgeShape.h | 86 +- src/modules/physics/box2d/wrap_Fixture.cpp | 8 +- .../physics/box2d/wrap_FrictionJoint.cpp | 12 +- .../physics/box2d/wrap_FrictionJoint.h | 6 +- src/modules/physics/box2d/wrap_GearJoint.cpp | 138 +- src/modules/physics/box2d/wrap_GearJoint.h | 88 +- src/modules/physics/box2d/wrap_Joint.cpp | 204 +-- src/modules/physics/box2d/wrap_Joint.h | 94 +- src/modules/physics/box2d/wrap_MouseJoint.cpp | 242 ++-- src/modules/physics/box2d/wrap_MouseJoint.h | 100 +- src/modules/physics/box2d/wrap_Physics.cpp | 67 +- src/modules/physics/box2d/wrap_Physics.h | 166 +-- .../physics/box2d/wrap_PolygonShape.cpp | 124 +- src/modules/physics/box2d/wrap_PolygonShape.h | 86 +- .../physics/box2d/wrap_PrismaticJoint.cpp | 394 +++--- .../physics/box2d/wrap_PrismaticJoint.h | 118 +- .../physics/box2d/wrap_PulleyJoint.cpp | 168 +-- src/modules/physics/box2d/wrap_PulleyJoint.h | 92 +- .../physics/box2d/wrap_RevoluteJoint.cpp | 394 +++--- .../physics/box2d/wrap_RevoluteJoint.h | 118 +- src/modules/physics/box2d/wrap_RopeJoint.cpp | 6 +- src/modules/physics/box2d/wrap_RopeJoint.h | 6 +- src/modules/physics/box2d/wrap_Shape.cpp | 248 ++-- src/modules/physics/box2d/wrap_Shape.h | 102 +- src/modules/physics/box2d/wrap_WeldJoint.cpp | 10 +- src/modules/physics/box2d/wrap_WeldJoint.h | 10 +- src/modules/physics/box2d/wrap_WheelJoint.cpp | 324 ++--- src/modules/physics/box2d/wrap_WheelJoint.h | 110 +- src/modules/physics/box2d/wrap_World.cpp | 388 +++--- src/modules/physics/box2d/wrap_World.h | 118 +- src/modules/sound/Decoder.h | 284 ++-- src/modules/sound/Sound.cpp | 6 +- src/modules/sound/Sound.h | 16 +- src/modules/sound/SoundData.cpp | 314 ++--- src/modules/sound/SoundData.h | 136 +- src/modules/sound/lullaby/Decoder.cpp | 138 +- src/modules/sound/lullaby/Decoder.h | 158 +-- src/modules/sound/lullaby/FLACDecoder.cpp | 4 +- src/modules/sound/lullaby/FLACDecoder.h | 12 +- src/modules/sound/lullaby/ModPlugDecoder.cpp | 280 ++-- src/modules/sound/lullaby/ModPlugDecoder.h | 130 +- src/modules/sound/lullaby/Mpg123Decoder.cpp | 22 +- src/modules/sound/lullaby/Sound.cpp | 16 +- src/modules/sound/lullaby/Sound.h | 14 +- src/modules/sound/lullaby/VorbisDecoder.cpp | 20 +- src/modules/sound/lullaby/VorbisDecoder.h | 8 +- src/modules/sound/wrap_Decoder.cpp | 132 +- src/modules/sound/wrap_Decoder.h | 82 +- src/modules/sound/wrap_Sound.cpp | 288 ++-- src/modules/sound/wrap_Sound.h | 82 +- src/modules/sound/wrap_SoundData.cpp | 184 +-- src/modules/sound/wrap_SoundData.h | 90 +- src/modules/thread/Thread.cpp | 5 +- src/modules/thread/posix/threads.cpp | 5 +- src/modules/thread/win32/threads.cpp | 2 +- src/modules/thread/wrap_Thread.cpp | 11 +- src/modules/timer/sdl/Timer.cpp | 264 ++-- src/modules/timer/wrap_Timer.cpp | 220 ++-- src/modules/timer/wrap_Timer.h | 84 +- 262 files changed, 16705 insertions(+), 16503 deletions(-) diff --git a/src/common/Data.h b/src/common/Data.h index 4d9f1fff3..9ceea9441 100644 --- a/src/common/Data.h +++ b/src/common/Data.h @@ -1,56 +1,56 @@ -/** -* 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_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 +/** +* 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_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/src/common/EnumMap.h b/src/common/EnumMap.h index c86f9fe33..9c3f104b5 100644 --- a/src/common/EnumMap.h +++ b/src/common/EnumMap.h @@ -1,14 +1,14 @@ /** * 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 @@ -41,7 +41,7 @@ namespace love Value values_u[PEAK]; public: - + struct Entry { T t; @@ -52,27 +52,27 @@ namespace love { unsigned n = size/sizeof(Entry); - for(unsigned i = 0; i -#include -using namespace std; - -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; - } - -} +/** +* 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. +**/ + +#include "Exception.h" +#include +#include +using namespace std; + +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/src/common/Exception.h b/src/common/Exception.h index c02a00eae..9101f40af 100644 --- a/src/common/Exception.h +++ b/src/common/Exception.h @@ -1,64 +1,64 @@ -/** -* 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_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 - { - private: - - std::string message; - - 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(); } - - }; // class - -} // love - -#endif // LOVE_EXCEPTION_H +/** +* 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_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 + { + private: + + std::string message; + + 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(); } + + }; // class + +} // love + +#endif // LOVE_EXCEPTION_H diff --git a/src/common/Matrix.cpp b/src/common/Matrix.cpp index e173fface..eef350325 100644 --- a/src/common/Matrix.cpp +++ b/src/common/Matrix.cpp @@ -1,196 +1,196 @@ -/** -* 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. -**/ - -#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 = cos(rad), s = sin(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 = cos(angle), s = sin(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 // 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 = cos(rad), s = sin(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 = cos(angle), s = sin(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;iL = L; - idx = luaL_ref(L, LUA_GLOBALSINDEX); - } - - void Reference::unref() - { - if(idx != LUA_REFNIL) - { - luaL_unref(L, LUA_GLOBALSINDEX, idx); - idx = LUA_REFNIL; - } - } - - void Reference::push() - { - if(idx != LUA_REFNIL) - lua_rawgeti(L, LUA_GLOBALSINDEX, idx); - else - lua_pushnil(L); - } - - lua_State * Reference::getL() - { - return L; - } - -} // love +/** +* 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. +**/ + +#include "Reference.h" + +namespace love +{ + Reference::Reference() + : L(0), idx(LUA_REFNIL) + { + } + + Reference::Reference(lua_State * L) + : L(0), idx(LUA_REFNIL) + { + ref(L); + } + + Reference::~Reference() + { + unref(); + } + + void Reference::ref(lua_State * L) + { + unref(); // Just to be safe. + this->L = L; + idx = luaL_ref(L, LUA_GLOBALSINDEX); + } + + void Reference::unref() + { + if (idx != LUA_REFNIL) + { + luaL_unref(L, LUA_GLOBALSINDEX, idx); + idx = LUA_REFNIL; + } + } + + void Reference::push() + { + if (idx != LUA_REFNIL) + lua_rawgeti(L, LUA_GLOBALSINDEX, idx); + else + lua_pushnil(L); + } + + lua_State * Reference::getL() + { + return L; + } + +} // love diff --git a/src/common/Reference.h b/src/common/Reference.h index 132e48aa3..acb704f1b 100644 --- a/src/common/Reference.h +++ b/src/common/Reference.h @@ -1,14 +1,14 @@ /** * 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 @@ -49,7 +49,7 @@ namespace love Reference(); /** - * Creates the object and a reference to the value + * Creates the object and a reference to the value * on the top of the stack. **/ Reference(lua_State * L); @@ -58,11 +58,11 @@ namespace love * Deletes the reference, if any. **/ virtual ~Reference(); - + /** * Creates a reference to the value on the * top of the stack. - **/ + **/ void ref(lua_State * L); /** diff --git a/src/common/StringMap.h b/src/common/StringMap.h index ff3f9e8a0..895fcf541 100644 --- a/src/common/StringMap.h +++ b/src/common/StringMap.h @@ -1,14 +1,14 @@ /** * 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 @@ -54,12 +54,12 @@ namespace love StringMap(Entry * entries, unsigned num) { - for(unsigned i = 0; i < SIZE; ++i) + for (unsigned i = 0; i < SIZE; ++i) reverse[i] = 0; unsigned n = num/sizeof(Entry); - for(unsigned i = 0; i < n; ++i) + for (unsigned i = 0; i < n; ++i) { add(entries[i].key, entries[i].value); } @@ -67,9 +67,9 @@ namespace love bool streq(const char * a, const char * b) { - while(*a != 0 && *b != 0) + while (*a != 0 && *b != 0) { - if(*a != *b) + if (*a != *b) return false; ++a; ++b; @@ -82,11 +82,11 @@ namespace love { //unsigned str_hash = djb2(key); - for(unsigned i = 0; i < MAX; ++i) + for (unsigned i = 0; i < MAX; ++i) { //unsigned str_i = (str_hash + i) % MAX; //this isn't used, is this intentional? - if(records[i].set && streq(records[i].key, key)) + if (records[i].set && streq(records[i].key, key)) { t = records[i].value; return true; @@ -100,10 +100,10 @@ namespace love { unsigned index = (unsigned)key; - if(index >= SIZE) + if (index >= SIZE) return false; - - if(reverse[index] != 0) + + if (reverse[index] != 0) { str = reverse[index]; return true; @@ -118,12 +118,12 @@ namespace love { unsigned str_hash = djb2(key); bool inserted = false; - - for(unsigned i = 0; i < MAX; ++i) + + for (unsigned i = 0; i < MAX; ++i) { unsigned str_i = (str_hash + i) % MAX; - if(!records[str_i].set) + if (!records[str_i].set) { inserted = true; records[str_i].set = true; @@ -135,7 +135,7 @@ namespace love unsigned index = (unsigned)value; - if(index >= SIZE) + if (index >= SIZE) { printf("\nConstant %s out of bounds with %i!\n", key, index); return false; diff --git a/src/common/Vector.cpp b/src/common/Vector.cpp index c2bce3558..20682d0f8 100644 --- a/src/common/Vector.cpp +++ b/src/common/Vector.cpp @@ -1,26 +1,26 @@ -/** -* 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. -**/ - -#include "Vector.h" - -namespace love -{ - // Implementation in header. +/** +* 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. +**/ + +#include "Vector.h" + +namespace love +{ + // Implementation in header. } \ No newline at end of file diff --git a/src/common/Vector.h b/src/common/Vector.h index 6638e5d3a..7d1d8adbb 100644 --- a/src/common/Vector.h +++ b/src/common/Vector.h @@ -1,310 +1,310 @@ -/** -* 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_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 sqrt() and should be used - * carefully. - **/ - float getLength() const; - - /** - * Normalizes the Vector. - * @return The old length of the Vector. - **/ - float normalize(); - - /** - * Gets a normal to the Vector. - * @return A normal to the Vector. - **/ - - Vector getNormal() 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 The x value of the Vector. - **/ - void setX(float x); - - /** - * Sets the x value of the Vector. - * @param The x value of the Vector. - **/ - void setY(float y); - - }; - - inline float Vector::getLength() const - { - return sqrt(x*x + y*y); - } - - inline Vector Vector::getNormal() const - { - return Vector(-y, x); - } - - inline float Vector::normalize() - { - - float len = getLength(); - - if(len > 0) - (*this) /= len; - - return len; - } - - /** - * 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 +/** +* 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_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 sqrt() and should be used + * carefully. + **/ + float getLength() const; + + /** + * Normalizes the Vector. + * @return The old length of the Vector. + **/ + float normalize(); + + /** + * Gets a normal to the Vector. + * @return A normal to the Vector. + **/ + + Vector getNormal() 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 The x value of the Vector. + **/ + void setX(float x); + + /** + * Sets the x value of the Vector. + * @param The x value of the Vector. + **/ + void setY(float y); + + }; + + inline float Vector::getLength() const + { + return sqrt(x*x + y*y); + } + + inline Vector Vector::getNormal() const + { + return Vector(-y, x); + } + + inline float Vector::normalize() + { + + float len = getLength(); + + if (len > 0) + (*this) /= len; + + return len; + } + + /** + * 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/src/common/b64.cpp b/src/common/b64.cpp index bf1dba11b..dadac9573 100644 --- a/src/common/b64.cpp +++ b/src/common/b64.cpp @@ -1,14 +1,14 @@ /** * 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 @@ -25,7 +25,7 @@ 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]); @@ -41,33 +41,34 @@ namespace love char in[4], out[3], v; int i, len, pos = 0; - while(pos <= slen) + while (pos <= slen) { - for(len = 0, i = 0; i < 4 && pos <= slen; i++ ) + for (len = 0, i = 0; i < 4 && pos <= slen; i++ ) { v = 0; - while(pos <= slen && v == 0 ) + while (pos <= slen && v == 0 ) { v = src[pos++]; v = (char)((v < 43 || v > 122) ? 0 : cd64[v - 43]); - if(v) + if (v) v = (char)((v == '$') ? 0 : v - 61); } - if(pos <= slen) + if (pos <= slen) { len++; - if(v) + if (v) in[i] = (char)(v - 1); } else in[i] = 0; } - if(len) { + if (len) + { b64_decode_block(in, out); - for(i = 0; i < len - 1; i++) + for (i = 0; i < len - 1; i++) *(d++) = out[i]; } } diff --git a/src/common/b64.h b/src/common/b64.h index 7ccd8c049..3c47fdf38 100644 --- a/src/common/b64.h +++ b/src/common/b64.h @@ -1,14 +1,14 @@ /** * 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 diff --git a/src/common/config.h b/src/common/config.h index ae35a6069..afb2d92ca 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -1,14 +1,14 @@ /** * 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 diff --git a/src/common/math.h b/src/common/math.h index 2ec22db5c..217d9cc48 100644 --- a/src/common/math.h +++ b/src/common/math.h @@ -1,85 +1,85 @@ -/** -* 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_MATH_H -#define LOVE_MATH_H - -#include // for CHAR_BIT - -/* 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 -{ - unsigned char r, g, b, a; - float x, y; - float s, t; -}; - -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 +/** +* 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_MATH_H +#define LOVE_MATH_H + +#include // for CHAR_BIT + +/* 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 +{ + unsigned char r, g, b, a; + float x, y; + float s, t; +}; + +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/src/common/runtime.cpp b/src/common/runtime.cpp index 11838ea45..3bb7f29c6 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -1,474 +1,475 @@ -/** -* 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. -**/ - -#include "runtime.h" - -// LOVE -#include "Module.h" -#include "Object.h" -#include "Reference.h" -#include "StringMap.h" -#include - -// STD -#include - - -namespace love -{ - static thread::Mutex *gcmutex = 0; - void *_gcmutex = 0; - unsigned int _gcthread = 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 = new thread::Mutex(); - _gcmutex = (void*) gcmutex; - } - Proxy * p = (Proxy *)lua_touserdata(L, 1); - Object * t = (Object *)p->data; - if(p->own) - { - thread::Lock lock(gcmutex); - _gcthread = thread::ThreadBase::threadId(); - t->release(); - } - 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_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, std::string str) - { - lua_pushlstring(L, str.data(), str.size()); - } - - 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 n) - { - if(!lua_isfunction(L, n)) - return luaL_error(L, "Argument must be of type \"function\"."); - return 0; - } - - int luax_register_module(lua_State * L, const WrappedModule & m) - { - // Put a reference to the C++ module in Lua. - luax_getregistry(L, REGISTRY_MODULES); - - Proxy * p = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); - p->own = true; - 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. - luaL_register(L, 0, m.functions); - - // Register types. - if(m.types != 0) - for(const lua_CFunction * t = m.types; *t != 0; t++) - (*t)(L); - - lua_setfield(L, -2, m.name); // love.graphics = table - lua_pop(L, 1); // love - - return 0; - } - - 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) - { - 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) - luaL_register(L, 0, 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"); - - 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_newtype(lua_State * L, const char * name, bits flags, void * data, bool own) - { - Proxy * u = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); - - u->data = data; - u->flags = flags; - u->own = own; - - luaL_newmetatable(L, name); - lua_setmetatable(L, -2); - } - - 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, 1); // Call the function, one arg, one return value. - 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, 1); // Call the function, n args, one return value. - lua_replace(L, idxs[0]); // Replace the initial argument with the new object. - return 0; - } - - int luax_strtofile(lua_State * L, int idx) - { - return luax_convobj(L, idx, "filesystem", "newFile"); - } - - int luax_filetodata(lua_State * L, int idx) - { - return luax_convobj(L, idx, "filesystem", "read"); - } - - int luax_insist(lua_State * L, int idx, const char * k) - { - 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, -3, k); // k[idx] = 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_getregistry(lua_State * L, Registry r) - { - switch(r) - { - case REGISTRY_GC: - return luax_insistlove(L, "_gc"); - case REGISTRY_MODULES: - return luax_insistlove(L, "_modules"); - default: - return luaL_error(L, "Attempted to use invalid registry."); - } - } - - 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}, - - // Image - {"ImageData", IMAGE_IMAGE_DATA_ID}, - - // Audio - {"Source", AUDIO_SOURCE_ID}, - - // Sound - {"SoundData", SOUND_SOUND_DATA_ID}, - {"Decoder", SOUND_DECODER_ID}, - - // Physics - {"World", PHYSICS_WORLD_ID}, - {"Contact", PHYSICS_CONTACT_ID}, - {"Body", PHYSICS_BODY_ID}, - {"Shape", PHYSICS_SHAPE_ID}, - {"CircleShape", PHYSICS_CIRCLE_SHAPE_ID}, - {"PolygonShape", PHYSICS_POLYGON_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}, - - // Thread - {"Thread", THREAD_THREAD_ID}, - - // The modules themselves. Only add abstracted modules here. - {"filesystem", MODULE_FILESYSTEM_ID}, - {"image", MODULE_IMAGE_ID}, - {"sound", MODULE_SOUND_ID}, - }; - - StringMap types(typeEntries, sizeof(typeEntries)); - - Type luax_type(lua_State * L, int idx) - { - Type t = INVALID_ID; - types.find(luaL_checkstring(L, idx), t); - return t; - } -} // love +/** +* 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. +**/ + +#include "runtime.h" + +// LOVE +#include "Module.h" +#include "Object.h" +#include "Reference.h" +#include "StringMap.h" +#include + +// STD +#include + + +namespace love +{ + static thread::Mutex *gcmutex = 0; + void *_gcmutex = 0; + unsigned int _gcthread = 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 = new thread::Mutex(); + _gcmutex = (void*) gcmutex; + } + Proxy * p = (Proxy *)lua_touserdata(L, 1); + Object * t = (Object *)p->data; + if (p->own) + { + thread::Lock lock(gcmutex); + _gcthread = thread::ThreadBase::threadId(); + t->release(); + } + 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_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, std::string str) + { + lua_pushlstring(L, str.data(), str.size()); + } + + 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 n) + { + if (!lua_isfunction(L, n)) + return luaL_error(L, "Argument must be of type \"function\"."); + return 0; + } + + int luax_register_module(lua_State * L, const WrappedModule & m) + { + // Put a reference to the C++ module in Lua. + luax_getregistry(L, REGISTRY_MODULES); + + Proxy * p = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); + p->own = true; + 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. + luaL_register(L, 0, m.functions); + + // Register types. + if (m.types != 0) + for (const lua_CFunction * t = m.types; *t != 0; t++) + (*t)(L); + + lua_setfield(L, -2, m.name); // love.graphics = table + lua_pop(L, 1); // love + + return 0; + } + + 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) + { + 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) + luaL_register(L, 0, 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"); + + 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_newtype(lua_State * L, const char * name, bits flags, void * data, bool own) + { + Proxy * u = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); + + u->data = data; + u->flags = flags; + u->own = own; + + luaL_newmetatable(L, name); + lua_setmetatable(L, -2); + } + + 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, 1); // Call the function, one arg, one return value. + 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, 1); // Call the function, n args, one return value. + lua_replace(L, idxs[0]); // Replace the initial argument with the new object. + return 0; + } + + int luax_strtofile(lua_State * L, int idx) + { + return luax_convobj(L, idx, "filesystem", "newFile"); + } + + int luax_filetodata(lua_State * L, int idx) + { + return luax_convobj(L, idx, "filesystem", "read"); + } + + int luax_insist(lua_State * L, int idx, const char * k) + { + 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, -3, k); // k[idx] = 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_getregistry(lua_State * L, Registry r) + { + switch(r) + { + case REGISTRY_GC: + return luax_insistlove(L, "_gc"); + case REGISTRY_MODULES: + return luax_insistlove(L, "_modules"); + default: + return luaL_error(L, "Attempted to use invalid registry."); + } + } + + 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}, + + // Image + {"ImageData", IMAGE_IMAGE_DATA_ID}, + + // Audio + {"Source", AUDIO_SOURCE_ID}, + + // Sound + {"SoundData", SOUND_SOUND_DATA_ID}, + {"Decoder", SOUND_DECODER_ID}, + + // Physics + {"World", PHYSICS_WORLD_ID}, + {"Contact", PHYSICS_CONTACT_ID}, + {"Body", PHYSICS_BODY_ID}, + {"Shape", PHYSICS_SHAPE_ID}, + {"CircleShape", PHYSICS_CIRCLE_SHAPE_ID}, + {"PolygonShape", PHYSICS_POLYGON_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}, + + // Thread + {"Thread", THREAD_THREAD_ID}, + + // The modules themselves. Only add abstracted modules here. + {"filesystem", MODULE_FILESYSTEM_ID}, + {"image", MODULE_IMAGE_ID}, + {"sound", MODULE_SOUND_ID}, + }; + + StringMap types(typeEntries, sizeof(typeEntries)); + + 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/src/common/runtime.h b/src/common/runtime.h index 837943349..33dcb9bdb 100644 --- a/src/common/runtime.h +++ b/src/common/runtime.h @@ -147,7 +147,7 @@ namespace love * @param str The string to push. **/ void luax_pushstring(lua_State * L, std::string str); - + /** * Require at least 'min' number of items on the stack. * @param L The Lua state. @@ -348,12 +348,12 @@ namespace love template T * luax_checktype(lua_State * L, int idx, const char * name, love::bits type) { - if(lua_isuserdata(L, idx) == 0) + if (lua_isuserdata(L, idx) == 0) luaL_error(L, "Incorrect parameter type: expected userdata."); Proxy * u = (Proxy *)lua_touserdata(L, idx); - if((u->flags & type) != type) + if ((u->flags & type) != type) luaL_error(L, "Incorrect parameter type: expected %s", name); return (T *)u->data; @@ -365,12 +365,12 @@ namespace love luax_getregistry(L, REGISTRY_MODULES); lua_getfield(L, -1, k); - if(!lua_isuserdata(L, -1)) + if (!lua_isuserdata(L, -1)) luaL_error(L, "Tried to get nonexisting module %s.", k); Proxy * u = (Proxy *)lua_touserdata(L, -1); - if((u->flags & type) != type) + if ((u->flags & type) != type) luaL_error(L, "Incorrect module %s", k); lua_pop(L, 2); diff --git a/src/common/types.h b/src/common/types.h index 446a0d5cb..208497c9d 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -1,173 +1,173 @@ -/** -* 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_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_PIXELEFFECT_ID, - - // Image - IMAGE_IMAGE_DATA_ID, - IMAGE_ENCODED_IMAGE_DATA_ID, - - // Audio - AUDIO_SOURCE_ID, - - // Sound - SOUND_SOUND_DATA_ID, - SOUND_DECODER_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, - - // Thread - THREAD_THREAD_ID, - - // The modules themselves. Only add abstracted modules here. - MODULE_FILESYSTEM_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_PIXELEFFECT_T = (bits(1) << GRAPHICS_PIXELEFFECT_ID) | OBJECT_T; - - // Image. - const bits IMAGE_IMAGE_DATA_T = (bits(1) << IMAGE_IMAGE_DATA_ID) | DATA_T; - const bits IMAGE_ENCODED_IMAGE_DATA_T = (bits(1) << IMAGE_ENCODED_IMAGE_DATA_ID) | DATA_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; - - // 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; - - // Thread. - const bits THREAD_THREAD_T = (bits(1) << THREAD_THREAD_ID) | OBJECT_T; - - // Modules. - const bits MODULE_FILESYSTEM_T = (bits(1) << MODULE_FILESYSTEM_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 +/** +* 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_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_PIXELEFFECT_ID, + + // Image + IMAGE_IMAGE_DATA_ID, + IMAGE_ENCODED_IMAGE_DATA_ID, + + // Audio + AUDIO_SOURCE_ID, + + // Sound + SOUND_SOUND_DATA_ID, + SOUND_DECODER_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, + + // Thread + THREAD_THREAD_ID, + + // The modules themselves. Only add abstracted modules here. + MODULE_FILESYSTEM_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_PIXELEFFECT_T = (bits(1) << GRAPHICS_PIXELEFFECT_ID) | OBJECT_T; + + // Image. + const bits IMAGE_IMAGE_DATA_T = (bits(1) << IMAGE_IMAGE_DATA_ID) | DATA_T; + const bits IMAGE_ENCODED_IMAGE_DATA_T = (bits(1) << IMAGE_ENCODED_IMAGE_DATA_ID) | DATA_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; + + // 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; + + // Thread. + const bits THREAD_THREAD_T = (bits(1) << THREAD_THREAD_ID) | OBJECT_T; + + // Modules. + const bits MODULE_FILESYSTEM_T = (bits(1) << MODULE_FILESYSTEM_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/src/common/utf8.cpp b/src/common/utf8.cpp index 6bd0220cb..8067195a2 100644 --- a/src/common/utf8.cpp +++ b/src/common/utf8.cpp @@ -1,14 +1,14 @@ /** * 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 @@ -48,9 +48,9 @@ namespace love { int length = str.length(); - for(int i = 0; i 1 && strcmp(argv[1],"--version") == 0) { + if (argc > 1 && strcmp(argv[1],"--version") == 0) + { printf("LOVE %s (%s)\n", love::VERSION, love::VERSION_CODENAME); return 0; } @@ -259,7 +260,7 @@ int main(int argc, char ** argv) { lua_newtable(L); - if(argc > 0) + if (argc > 0) { lua_pushstring(L, argv[0]); lua_rawseti(L, -2, -2); @@ -268,7 +269,7 @@ int main(int argc, char ** argv) lua_pushstring(L, "embedded boot.lua"); lua_rawseti(L, -2, -1); - for(int i = 1; i -#include "Source.h" - -namespace love -{ -namespace sound -{ - class Decoder; - class SoundData; -} -namespace audio -{ - /** - * The Audio module is responsible for playing back raw sound samples. - **/ - class Audio : public Module - { - public: - - /** - * 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 getNumSources() 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; - - }; // Audio - -} // audio -} // love - -#endif // LOVE_AUDIO_AUDIO_H +/** +* 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 = 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 +#include "Source.h" + +namespace love +{ +namespace sound +{ + class Decoder; + class SoundData; +} +namespace audio +{ + /** + * The Audio module is responsible for playing back raw sound samples. + **/ + class Audio : public Module + { + public: + + /** + * 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 getNumSources() 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; + + }; // Audio + +} // audio +} // love + +#endif // LOVE_AUDIO_AUDIO_H diff --git a/src/modules/audio/Source.cpp b/src/modules/audio/Source.cpp index 34bac0785..3dab230a4 100644 --- a/src/modules/audio/Source.cpp +++ b/src/modules/audio/Source.cpp @@ -1,73 +1,73 @@ -/** -* 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. -**/ - -#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 +/** +* 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. +**/ + +#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/src/modules/audio/Source.h b/src/modules/audio/Source.h index 45bc359d6..e03bc5212 100644 --- a/src/modules/audio/Source.h +++ b/src/modules/audio/Source.h @@ -1,107 +1,107 @@ -/** -* 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_AUDIO_SOURCE_H -#define LOVE_AUDIO_SOURCE_H - -// LOVE -#include -#include - -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 - }; - - protected: - Type type; - public: - - 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 setLooping(bool looping) = 0; - virtual bool isLooping() const = 0; - virtual bool isStatic() 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); - - private: - - static StringMap::Entry typeEntries[]; - static StringMap types; - static StringMap::Entry unitEntries[]; - static StringMap units; - - }; // Source - -} // audio -} // love - -#endif // LOVE_AUDIO_SOURCE_H +/** +* 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_AUDIO_SOURCE_H +#define LOVE_AUDIO_SOURCE_H + +// LOVE +#include +#include + +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 + }; + + protected: + Type type; + public: + + 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 setLooping(bool looping) = 0; + virtual bool isLooping() const = 0; + virtual bool isStatic() 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); + + 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/src/modules/audio/null/Audio.cpp b/src/modules/audio/null/Audio.cpp index 6e4805846..f14d3f1da 100644 --- a/src/modules/audio/null/Audio.cpp +++ b/src/modules/audio/null/Audio.cpp @@ -1,14 +1,14 @@ /** * 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 @@ -132,21 +132,21 @@ namespace null 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; diff --git a/src/modules/audio/null/Audio.h b/src/modules/audio/null/Audio.h index 663d9029e..3ccc75689 100644 --- a/src/modules/audio/null/Audio.h +++ b/src/modules/audio/null/Audio.h @@ -1,14 +1,14 @@ /** * 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 @@ -68,7 +68,7 @@ namespace null 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); diff --git a/src/modules/audio/null/Source.cpp b/src/modules/audio/null/Source.cpp index e2ea14a2c..731262bc2 100644 --- a/src/modules/audio/null/Source.cpp +++ b/src/modules/audio/null/Source.cpp @@ -101,11 +101,11 @@ namespace null { return volume; } - + void Source::seek(float, Source::Unit) { } - + float Source::tell(Source::Unit) { return 0.0f; diff --git a/src/modules/audio/null/Source.h b/src/modules/audio/null/Source.h index 51e0f9cd8..e8ec211a1 100644 --- a/src/modules/audio/null/Source.h +++ b/src/modules/audio/null/Source.h @@ -1,78 +1,78 @@ -/** -* 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_AUDIO_NULL_SOURCE_H -#define LOVE_AUDIO_NULL_SOURCE_H - -// LOVE -#include -#include @@ -267,6 +270,7 @@ + @@ -451,6 +455,8 @@ + + diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index ab9c93a59..1853cc290 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -130,6 +130,12 @@ {9282b1b4-0df5-4180-8840-ea58561dc7b8} + + {d3e343d0-39a3-4144-884b-dc37d5f12c6c} + + + {240a0dac-971b-43f6-829c-b06e54bddd7a} + @@ -727,6 +733,15 @@ modules\keyboard\sdl + + common + + + modules\window + + + modules\window\sdl + @@ -1302,6 +1317,15 @@ modules\keyboard\sdl + + common + + + modules\window + + + modules\window\sdl + From 9682ebecf9c3ebd35a2702dad96fa6fe37af4af8 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 13 Dec 2011 18:51:24 +0100 Subject: [PATCH 313/384] Remove love.graphics.setFont([,] ) shorthand, idiom is now love.graphics.newFont([,] ):set() This makes sure that setFont doesn't create any fonts. --- src/modules/graphics/opengl/wrap_Font.cpp | 11 ++++ src/modules/graphics/opengl/wrap_Font.h | 1 + src/modules/graphics/opengl/wrap_Graphics.cpp | 57 ++----------------- src/modules/graphics/opengl/wrap_Graphics.h | 2 +- src/scripts/graphics.lua | 12 +--- src/scripts/graphics.lua.h | 21 ++----- 6 files changed, 23 insertions(+), 81 deletions(-) diff --git a/src/modules/graphics/opengl/wrap_Font.cpp b/src/modules/graphics/opengl/wrap_Font.cpp index b5ef28403..8dd532880 100644 --- a/src/modules/graphics/opengl/wrap_Font.cpp +++ b/src/modules/graphics/opengl/wrap_Font.cpp @@ -19,6 +19,7 @@ **/ // LOVE +#include "Graphics.h" #include "wrap_Font.h" namespace love @@ -27,6 +28,8 @@ namespace graphics { namespace opengl { + extern Graphics * instance; + Font * luax_checkfont(lua_State * L, int idx) { return luax_checktype(L, idx, "Font", GRAPHICS_FONT_T); @@ -89,12 +92,20 @@ namespace opengl return 1; } + int w_Font_set(lua_State * L) + { + Font * t = luax_checkfont(L, 1); + instance->setFont(t); + return 0; + } + 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 }, + { "set", w_Font_set }, { 0, 0 } }; diff --git a/src/modules/graphics/opengl/wrap_Font.h b/src/modules/graphics/opengl/wrap_Font.h index 85e2a6b5f..a289c9d4a 100644 --- a/src/modules/graphics/opengl/wrap_Font.h +++ b/src/modules/graphics/opengl/wrap_Font.h @@ -37,6 +37,7 @@ namespace opengl int w_Font_getWrap(lua_State * L); int w_Font_setLineHeight(lua_State * L); int w_Font_getLineHeight(lua_State * L); + int w_Font_set(lua_State * L); int luaopen_font(lua_State * L); } // opengl diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 4d84544dd..81f889c14 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -32,7 +32,7 @@ namespace graphics { namespace opengl { - static Graphics * instance = 0; + Graphics * instance = 0; int w_checkMode(lua_State * L) { @@ -505,62 +505,13 @@ namespace opengl return 4; } - int w_setFont1(lua_State * L) + int w_setFont(lua_State * L) { // The second parameter is an optional int. int size = luaL_optint(L, 2, 12); - Font * font; - - bool created = false; - - // If the first parameter isn't a Font, create a new one - if (!luax_istype(L, 1, GRAPHICS_FONT_T)) - { - created = true; - lua_pushinteger(L, size); // push the size - lua_insert(L, 2); // move it to its proper place - // Convert to File, if necessary. - if (lua_isstring(L, 1)) - luax_convobj(L, 1, "filesystem", "newFile"); - - // Convert to Data, if necessary. - if (luax_istype(L, 1, FILESYSTEM_FILE_T)) - { - love::filesystem::File * f = luax_checktype(L, 1, "File", FILESYSTEM_FILE_T); - Data * d; - try - { - d = f->read(); - } - catch (love::Exception & e) - { - return luaL_error(L, e.what()); - } - lua_remove(L, 1); // get rid of the file - luax_newtype(L, "Data", DATA_T, (void*)d); - lua_insert(L, 1); // put it at the bottom of the stack - } - - // Convert to Rasterizer, if necessary. - if (luax_istype(L, 1, 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); - - // Create the font. - font = instance->newFont(rasterizer); - - if (font == 0) - return luaL_error(L, "Could not load font."); - } - else font = luax_checktype(L, 1, "Font", GRAPHICS_FONT_T); + Font * font = luax_checktype(L, 1, "Font", GRAPHICS_FONT_T); instance->setFont(font); - if (created) - font->release(); return 0; } @@ -1232,7 +1183,7 @@ namespace opengl { "setBackgroundColor", w_setBackgroundColor }, { "getBackgroundColor", w_getBackgroundColor }, - { "setFont1", w_setFont1 }, + { "setFont", w_setFont }, { "getFont", w_getFont }, { "setBlendMode", w_setBlendMode }, diff --git a/src/modules/graphics/opengl/wrap_Graphics.h b/src/modules/graphics/opengl/wrap_Graphics.h index 4e0b8b2d0..6721056c4 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.h +++ b/src/modules/graphics/opengl/wrap_Graphics.h @@ -67,7 +67,7 @@ namespace opengl int w_getColor(lua_State * L); int w_setBackgroundColor(lua_State * L); int w_getBackgroundColor(lua_State * L); - int w_setFont1(lua_State * L); + int w_setFont(lua_State * L); int w_getFont(lua_State * L); int w_setBlendMode(lua_State * L); int w_setColorMode(lua_State * L); diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index ab7e2f7e1..0d2cc4781 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -1252,17 +1252,9 @@ do return love.graphics.newFont1(font, size or 12) end - love.graphics.setFont = function(font, size) - if type(font) == "number" or not font then - size = font - font = vera_ttf - end - return love.graphics.setFont1(font, size or 12) - end - love.graphics.print = function (...) if not love.graphics.getFont() then - love.graphics.setFont(12) + love.graphics.newFont(12):set() end love.graphics.print1(...) love.graphics.print = love.graphics.print1 @@ -1270,7 +1262,7 @@ do love.graphics.printf = function (...) if not love.graphics.getFont() then - love.graphics.setFont(12) + love.graphics.newFont(12):set() end love.graphics.printf1(...) love.graphics.printf = love.graphics.printf1 diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index eabc244c7..9e4c0f5f4 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -6203,27 +6203,14 @@ const unsigned char graphics_lua[] = 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x28, 0x66, 0x6f, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x32, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, - 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, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x28, 0x66, 0x6f, 0x6e, 0x74, - 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x32, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a,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, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 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, 0x73, - 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x31, 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, + 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x31, 0x32, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x31, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, @@ -6237,8 +6224,8 @@ const unsigned char graphics_lua[] = 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 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, 0x73, - 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x31, 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, + 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x31, 0x32, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x31, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, From e37470f54db7fd0779c3c12ee33c5c2e35964b77 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 13 Dec 2011 19:22:59 +0100 Subject: [PATCH 314/384] No more Font:set(), instead love.graphics.setNewFont --- src/modules/graphics/opengl/wrap_Font.cpp | 11 ----------- src/modules/graphics/opengl/wrap_Font.h | 1 - src/modules/graphics/opengl/wrap_Graphics.cpp | 2 +- src/scripts/graphics.lua | 10 ++++++++-- src/scripts/graphics.lua.h | 18 ++++++++++++++---- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/modules/graphics/opengl/wrap_Font.cpp b/src/modules/graphics/opengl/wrap_Font.cpp index 8dd532880..b5ef28403 100644 --- a/src/modules/graphics/opengl/wrap_Font.cpp +++ b/src/modules/graphics/opengl/wrap_Font.cpp @@ -19,7 +19,6 @@ **/ // LOVE -#include "Graphics.h" #include "wrap_Font.h" namespace love @@ -28,8 +27,6 @@ namespace graphics { namespace opengl { - extern Graphics * instance; - Font * luax_checkfont(lua_State * L, int idx) { return luax_checktype(L, idx, "Font", GRAPHICS_FONT_T); @@ -92,20 +89,12 @@ namespace opengl return 1; } - int w_Font_set(lua_State * L) - { - Font * t = luax_checkfont(L, 1); - instance->setFont(t); - return 0; - } - 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 }, - { "set", w_Font_set }, { 0, 0 } }; diff --git a/src/modules/graphics/opengl/wrap_Font.h b/src/modules/graphics/opengl/wrap_Font.h index a289c9d4a..85e2a6b5f 100644 --- a/src/modules/graphics/opengl/wrap_Font.h +++ b/src/modules/graphics/opengl/wrap_Font.h @@ -37,7 +37,6 @@ namespace opengl int w_Font_getWrap(lua_State * L); int w_Font_setLineHeight(lua_State * L); int w_Font_getLineHeight(lua_State * L); - int w_Font_set(lua_State * L); int luaopen_font(lua_State * L); } // opengl diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 81f889c14..efeef4116 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -32,7 +32,7 @@ namespace graphics { namespace opengl { - Graphics * instance = 0; + static Graphics * instance = 0; int w_checkMode(lua_State * L) { diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index 0d2cc4781..ebdd9bea8 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -1252,9 +1252,15 @@ do return love.graphics.newFont1(font, size or 12) end + love.graphics.setNewFont = function(...) + local font = love.graphics.newFont(...) + love.graphics.setFont(font) + return font + end + love.graphics.print = function (...) if not love.graphics.getFont() then - love.graphics.newFont(12):set() + love.graphics.setNewFont(12) end love.graphics.print1(...) love.graphics.print = love.graphics.print1 @@ -1262,7 +1268,7 @@ do love.graphics.printf = function (...) if not love.graphics.getFont() then - love.graphics.newFont(12):set() + love.graphics.setNewFont(12) end love.graphics.printf1(...) love.graphics.printf = love.graphics.printf1 diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index 9e4c0f5f4..dd881cfa7 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -6203,14 +6203,24 @@ const unsigned char graphics_lua[] = 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x28, 0x66, 0x6f, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x32, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,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,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, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 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, 0x6e, - 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x31, 0x32, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 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, 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, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x31, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, @@ -6224,8 +6234,8 @@ const unsigned char graphics_lua[] = 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 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, 0x6e, - 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x31, 0x32, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 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, 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, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x31, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, From 735260d4d8ec3dc5c5e2f1b04f1e7d113c54eb00 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 13 Dec 2011 19:24:10 +0100 Subject: [PATCH 315/384] Thread:kill()? What Thread:kill()? --- src/modules/thread/wrap_Thread.cpp | 8 -------- src/modules/thread/wrap_Thread.h | 1 - 2 files changed, 9 deletions(-) diff --git a/src/modules/thread/wrap_Thread.cpp b/src/modules/thread/wrap_Thread.cpp index c30143813..831367de1 100644 --- a/src/modules/thread/wrap_Thread.cpp +++ b/src/modules/thread/wrap_Thread.cpp @@ -36,13 +36,6 @@ namespace thread return 0; } - int w_Thread_kill(lua_State *L) - { - Thread *t = luax_checkthread(L, 1); - t->kill(); - return 0; - } - int w_Thread_wait(lua_State *L) { Thread *t = luax_checkthread(L, 1); @@ -152,7 +145,6 @@ namespace thread static const luaL_Reg type_functions[] = { { "start", w_Thread_start }, - { "kill", w_Thread_kill }, { "wait", w_Thread_wait }, { "getName", w_Thread_getName }, { "get", w_Thread_get }, diff --git a/src/modules/thread/wrap_Thread.h b/src/modules/thread/wrap_Thread.h index c7b05c402..1e2c70e79 100644 --- a/src/modules/thread/wrap_Thread.h +++ b/src/modules/thread/wrap_Thread.h @@ -31,7 +31,6 @@ namespace thread { Thread *luax_checkthread(lua_State *L, int idx); int w_Thread_start(lua_State *L); - int w_Thread_kill(lua_State *L); int w_Thread_wait(lua_State *L); int w_Thread_getName(lua_State *L); int w_Thread_get(lua_State *L); From 36a93e46c73e7531ad22d4d9f7d04bcf74a6c4a8 Mon Sep 17 00:00:00 2001 From: Jonathan Giroux Date: Wed, 14 Dec 2011 00:32:18 +0100 Subject: [PATCH 316/384] Add control to the sound attenuation by distance. --- platform/msvc2010/love.vcxproj | 6 ++ platform/msvc2010/love.vcxproj.filters | 24 ++++- src/modules/audio/Audio.cpp | 51 ++++++++++ src/modules/audio/Audio.h | 35 +++++++ src/modules/audio/Source.h | 12 +++ src/modules/audio/null/Audio.cpp | 12 ++- src/modules/audio/null/Audio.h | 4 + src/modules/audio/null/Source.cpp | 50 +++++++++ src/modules/audio/null/Source.h | 15 +++ src/modules/audio/openal/Audio.cpp | 45 +++++++- src/modules/audio/openal/Audio.h | 6 +- src/modules/audio/openal/Source.cpp | 136 ++++++++++++++++++++++++- src/modules/audio/openal/Source.h | 15 +++ src/modules/audio/wrap_Audio.cpp | 19 ++++ src/modules/audio/wrap_Audio.h | 2 + src/modules/audio/wrap_Source.cpp | 85 +++++++++++++++- src/modules/audio/wrap_Source.h | 10 ++ 17 files changed, 516 insertions(+), 11 deletions(-) create mode 100644 src/modules/audio/Audio.cpp diff --git a/platform/msvc2010/love.vcxproj b/platform/msvc2010/love.vcxproj index 573b0f3e4..9cb5a6a8d 100644 --- a/platform/msvc2010/love.vcxproj +++ b/platform/msvc2010/love.vcxproj @@ -110,6 +110,7 @@ false + @@ -249,6 +250,8 @@ + + @@ -451,6 +454,8 @@ + + @@ -530,6 +535,7 @@ opengl32.lib;glu32.lib;DevIL.lib;freetype244MT.lib;libmpg123.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua.lib;modplug.lib;OpenAL32.lib;physfs.lib;SDL.lib;SDLmain.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) lib Windows + /FORCE:MULTIPLE %(AdditionalOptions) diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index ab9c93a59..89e3a6acd 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -130,6 +130,9 @@ {9282b1b4-0df5-4180-8840-ea58561dc7b8} + + {1ef7f9ba-1fc3-4d88-b3fd-8ff0f34a0cc6} + @@ -286,9 +289,6 @@ modules\joystick\sdl - - modules\sound - modules\sound @@ -727,6 +727,18 @@ modules\keyboard\sdl + + modules\sound + + + modules\window + + + modules\window + + + modules\audio + @@ -1302,6 +1314,12 @@ modules\keyboard\sdl + + modules\window + + + modules\window + diff --git a/src/modules/audio/Audio.cpp b/src/modules/audio/Audio.cpp new file mode 100644 index 000000000..14a658592 --- /dev/null +++ b/src/modules/audio/Audio.cpp @@ -0,0 +1,51 @@ +/** +* 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 Audio versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any Audio distribution. +**/ + +#include "Audio.h" + +namespace love +{ +namespace audio +{ + StringMap::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}, + {"exponent", Audio::DISTANCE_EXPONENT}, + {"exponent clamped", Audio::DISTANCE_EXPONENT} + }; + + 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/src/modules/audio/Audio.h b/src/modules/audio/Audio.h index 22dcbfe7f..32e881337 100644 --- a/src/modules/audio/Audio.h +++ b/src/modules/audio/Audio.h @@ -22,6 +22,7 @@ #define LOVE_AUDIO_AUDIO_H #include +#include #include "Source.h" namespace love @@ -40,6 +41,24 @@ namespace audio { 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. **/ @@ -191,6 +210,22 @@ namespace audio **/ 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 diff --git a/src/modules/audio/Source.h b/src/modules/audio/Source.h index e03bc5212..d9446492d 100644 --- a/src/modules/audio/Source.h +++ b/src/modules/audio/Source.h @@ -86,6 +86,18 @@ namespace audio 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; static bool getConstant(const char * in, Type & out); static bool getConstant(Type in, const char *& out); diff --git a/src/modules/audio/null/Audio.cpp b/src/modules/audio/null/Audio.cpp index f14d3f1da..26278e039 100644 --- a/src/modules/audio/null/Audio.cpp +++ b/src/modules/audio/null/Audio.cpp @@ -26,7 +26,7 @@ namespace audio { namespace null { - Audio::Audio() + Audio::Audio() : distanceModel(DISTANCE_NONE) { } @@ -151,6 +151,16 @@ namespace null { return false; } + + Audio::DistanceModel Audio::getDistanceModel() const + { + return this->distanceModel; + } + + void Audio::setDistanceModel(DistanceModel distanceModel) + { + this->distanceModel = distanceModel; + } } // null } // audio diff --git a/src/modules/audio/null/Audio.h b/src/modules/audio/null/Audio.h index 3ccc75689..f573f6595 100644 --- a/src/modules/audio/null/Audio.h +++ b/src/modules/audio/null/Audio.h @@ -36,6 +36,7 @@ namespace null { private: float volume; + DistanceModel distanceModel; public: Audio(); @@ -74,6 +75,9 @@ namespace null love::sound::SoundData * stopRecording(bool returnData); bool canRecord(); + DistanceModel getDistanceModel() const; + void setDistanceModel(DistanceModel distanceModel); + }; // Audio } // null diff --git a/src/modules/audio/null/Source.cpp b/src/modules/audio/null/Source.cpp index 731262bc2..866ea79cf 100644 --- a/src/modules/audio/null/Source.cpp +++ b/src/modules/audio/null/Source.cpp @@ -149,6 +149,56 @@ namespace null { 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; + } } // null } // audio diff --git a/src/modules/audio/null/Source.h b/src/modules/audio/null/Source.h index e8ec211a1..04e1b4535 100644 --- a/src/modules/audio/null/Source.h +++ b/src/modules/audio/null/Source.h @@ -38,6 +38,11 @@ namespace null float pitch; float volume; bool looping; + float minVolume; + float maxVolume; + float referenceDistance; + float rolloffFactor; + float maxDistance; public: Source(); @@ -68,6 +73,16 @@ namespace null 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; }; // Source diff --git a/src/modules/audio/openal/Audio.cpp b/src/modules/audio/openal/Audio.cpp index f40be6bf7..0b11b6dc8 100644 --- a/src/modules/audio/openal/Audio.cpp +++ b/src/modules/audio/openal/Audio.cpp @@ -58,7 +58,7 @@ namespace openal } - Audio::Audio() + Audio::Audio() : distanceModel(DISTANCE_INVERSE_CLAMPED) { // Passing zero for default device. device = alcOpenDevice(0); @@ -267,7 +267,50 @@ namespace openal { 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/src/modules/audio/openal/Audio.h b/src/modules/audio/openal/Audio.h index e4cfa3da2..4c063d20a 100644 --- a/src/modules/audio/openal/Audio.h +++ b/src/modules/audio/openal/Audio.h @@ -89,6 +89,8 @@ namespace openal PoolThread* poolThread; + DistanceModel distanceModel; + public: Audio(); @@ -126,7 +128,9 @@ namespace openal love::sound::SoundData * getRecordedData(); love::sound::SoundData * stopRecording(bool returnData); bool canRecord(); - + + DistanceModel getDistanceModel() const; + void setDistanceModel(DistanceModel distanceModel); }; // Audio } // openal diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 923420f7f..842c52464 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -24,6 +24,7 @@ // STD #include +#include namespace love { @@ -34,8 +35,9 @@ 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), looping(false), paused(false), offsetSamples(0), - offsetSeconds(0), decoder(0), toLoop(0) + pitch(1.0f), volume(1.0f), looping(false), paused(false), minVolume(0.0f), + maxVolume(1.0f), referenceDistance(1.0f), rolloffFactor(1.0f), maxDistance(FLT_MAX), + offsetSamples(0), offsetSeconds(0), decoder(0), toLoop(0) { alGenBuffers(1, buffers); ALenum fmt = getFormat(soundData->getChannels(), soundData->getBits()); @@ -50,8 +52,9 @@ namespace openal Source::Source(Pool * pool, love::sound::Decoder * decoder) : love::audio::Source(Source::TYPE_STREAM), pool(pool), valid(false), - pitch(1.0f), volume(1.0f), looping(false), paused(false), offsetSamples(0), - offsetSeconds(0), decoder(decoder), toLoop(0) + pitch(1.0f), volume(1.0f), looping(false), paused(false), minVolume(0.0f), + maxVolume(1.0f), referenceDistance(1.0f), rolloffFactor(1.0f), maxDistance(FLT_MAX), + offsetSamples(0), offsetSeconds(0), decoder(decoder), toLoop(0) { decoder->retain(); alGenBuffers(MAX_BUFFERS, buffers); @@ -415,6 +418,11 @@ namespace openal // been without an AL source. 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); alSourcePlay(source); @@ -503,6 +511,11 @@ namespace openal 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); } void Source::setFloatv(float * dst, const float * src) const @@ -564,6 +577,121 @@ namespace openal { 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; + } } // openal } // audio diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index c819d1033..3df084dcf 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -63,6 +63,11 @@ namespace openal float direction[3]; bool looping; bool paused; + float minVolume; + float maxVolume; + float referenceDistance; + float rolloffFactor; + float maxDistance; float offsetSamples; float offsetSeconds; @@ -103,6 +108,16 @@ namespace openal 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; void playAtomic(); void stopAtomic(); diff --git a/src/modules/audio/wrap_Audio.cpp b/src/modules/audio/wrap_Audio.cpp index 4e44c6dc0..677262691 100644 --- a/src/modules/audio/wrap_Audio.cpp +++ b/src/modules/audio/wrap_Audio.cpp @@ -236,7 +236,24 @@ namespace audio luax_pushboolean(L, instance->canRecord()); return 1; } + + int w_setDistanceModel(lua_State * L) + { + const char *modelStr = luaL_checkstring(L, 1); + Audio::DistanceModel distanceModel; + Audio::getConstant(modelStr, distanceModel); + instance->setDistanceModel(distanceModel); + return 0; + } + int w_getDistanceModel(lua_State * L) + { + Audio::DistanceModel distanceModel = instance->getDistanceModel(); + const char *modelStr; + Audio::getConstant(distanceModel, modelStr); + lua_pushstring(L, modelStr); + return 1; + } // List of functions to wrap. static const luaL_Reg functions[] = { @@ -258,6 +275,8 @@ namespace audio /*{ "record", w_record }, { "getRecordedData", w_getRecordedData }, { "stopRecording", w_stopRecording },*/ + { "setDistanceModel", w_setDistanceModel }, + { "getDistanceModel", w_getDistanceModel }, { 0, 0 } }; diff --git a/src/modules/audio/wrap_Audio.h b/src/modules/audio/wrap_Audio.h index 437018c1d..b26409c1c 100644 --- a/src/modules/audio/wrap_Audio.h +++ b/src/modules/audio/wrap_Audio.h @@ -50,6 +50,8 @@ namespace audio 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 diff --git a/src/modules/audio/wrap_Source.cpp b/src/modules/audio/wrap_Source.cpp index c32607a86..f1235aa7c 100644 --- a/src/modules/audio/wrap_Source.cpp +++ b/src/modules/audio/wrap_Source.cpp @@ -211,11 +211,82 @@ namespace audio int w_Source_isStatic(lua_State * L) { - Source * t= luax_checksource(L, 1); + Source * t = luax_checksource(L, 1); luax_pushboolean(L, t->isStatic()); return 1; } + int w_Source_setMinVolume(lua_State * L) + { + Source * t = luax_checksource(L, 1); + t->setMinVolume((float)luaL_checknumber(L, 2)); + return 0; + } + + int w_Source_getMinVolume(lua_State * L) + { + Source * t = luax_checksource(L, 1); + lua_pushnumber(L, t->getMinVolume()); + return 1; + } + + int w_Source_setMaxVolume(lua_State * L) + { + Source * t = luax_checksource(L, 1); + t->setMaxVolume((float)luaL_checknumber(L, 2)); + return 0; + } + + int w_Source_getMaxVolume(lua_State * L) + { + Source * t = luax_checksource(L, 1); + lua_pushnumber(L, t->getMaxVolume()); + return 1; + } + + int w_Source_setReferenceDistance(lua_State * L) + { + Source * t = luax_checksource(L, 1); + t->setReferenceDistance((float)luaL_checknumber(L, 2)); + return 0; + } + + int w_Source_getReferenceDistance(lua_State * L) + { + Source * t = luax_checksource(L, 1); + lua_pushnumber(L, t->getReferenceDistance()); + return 1; + } + + int w_Source_setRolloffFactor(lua_State * L) + { + Source * t = luax_checksource(L, 1); + t->setRolloffFactor((float)luaL_checknumber(L, 2)); + return 0; + } + + int w_Source_getRolloffFactor(lua_State * L) + { + Source * t = luax_checksource(L, 1); + lua_pushnumber(L, t->getRolloffFactor()); + return 1; + } + + int w_Source_setMaxDistance(lua_State * L) + { + Source * t = luax_checksource(L, 1); + t->setMaxDistance((float)luaL_checknumber(L, 2)); + return 0; + } + + int w_Source_getMaxDistance(lua_State * L) + { + Source * t = luax_checksource(L, 1); + lua_pushnumber(L, t->getMaxDistance()); + return 1; + } + + static const luaL_Reg functions[] = { { "play", w_Source_play }, { "stop", w_Source_stop }, @@ -241,6 +312,18 @@ namespace audio { "isStopped", w_Source_isStopped }, { "isPaused", w_Source_isPaused }, { "isStatic", w_Source_isStatic }, + + { "setMinVolume", w_Source_setMinVolume }, + { "getMinVolume", w_Source_getMinVolume }, + { "setMaxVolume", w_Source_setMaxVolume }, + { "getMaxVolume", w_Source_getMaxVolume }, + { "setReferenceDistance", w_Source_setReferenceDistance }, + { "getReferenceDistance", w_Source_getReferenceDistance }, + { "setRolloffFactor", w_Source_setRolloffFactor }, + { "getRolloffFactor", w_Source_getRolloffFactor }, + { "setMaxDistance", w_Source_setMaxDistance }, + { "getMaxDistance", w_Source_getMaxDistance }, + { 0, 0 } }; diff --git a/src/modules/audio/wrap_Source.h b/src/modules/audio/wrap_Source.h index 1349f4e95..fea5ce605 100644 --- a/src/modules/audio/wrap_Source.h +++ b/src/modules/audio/wrap_Source.h @@ -51,6 +51,16 @@ namespace audio int w_Source_isStopped(lua_State * L); int w_Source_isPaused(lua_State * L); int w_Source_isStatic(lua_State * L); + int w_Source_setMinVolume(lua_State * L); + int w_Source_getMinVolume(lua_State * L); + int w_Source_setMaxVolume(lua_State * L); + int w_Source_getMinVolume(lua_State * L); + int w_Source_setReferenceDistance(lua_State * L); + int w_Source_getReferenceDistance(lua_State * L); + int w_Source_setRolloffFactor(lua_State * L); + int w_Source_getRolloffFactor(lua_State * L); + int w_Source_setMaxDistance(lua_State * L); + int w_Source_getMaxDistance(lua_State * L); int luaopen_source(lua_State * L); } // audio From c9ed6d3c83d90f12233a031dcaf1b8aafa3b06c3 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 19 Dec 2011 00:17:17 -0600 Subject: [PATCH 317/384] update Xcode project to include love.window and Variant --- .../macosx/love.xcodeproj/project.pbxproj | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 728ab0ecd..45756e67a 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -164,6 +164,9 @@ A97E632814604BCF00020E43 /* wrap_Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A97E632614604BCF00020E43 /* wrap_Mouse.cpp */; }; A97E632C14604BDF00020E43 /* wrap_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A97E632A14604BDF00020E43 /* wrap_Timer.cpp */; }; A986ECAF132CEBB000F048C8 /* Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A986ECAD132CEB9300F048C8 /* Fixture.cpp */; }; + A9A5BE47149F0ACB00D9931C /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9A5BE43149F0ACB00D9931C /* Window.cpp */; }; + A9A5BE48149F0ACB00D9931C /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9A5BE45149F0ACB00D9931C /* Window.cpp */; }; + A9A5BE4B149F0B0200D9931C /* Variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9A5BE49149F0B0200D9931C /* Variant.cpp */; }; A9B4BA9C1045937F001DBC80 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9A1045937F001DBC80 /* ParticleSystem.cpp */; }; A9B4BA9D1045937F001DBC80 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B4BA9B1045937F001DBC80 /* wrap_ParticleSystem.cpp */; }; A9B6432C13BF83AB00DC3C7E /* FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9B6432A13BF833900DC3C7E /* FrictionJoint.cpp */; }; @@ -593,6 +596,12 @@ A97E632B14604BDF00020E43 /* wrap_Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Timer.h; sourceTree = ""; }; A986ECAD132CEB9300F048C8 /* Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Fixture.cpp; sourceTree = ""; }; A986ECAE132CEB9B00F048C8 /* Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fixture.h; sourceTree = ""; }; + A9A5BE43149F0ACB00D9931C /* Window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Window.cpp; sourceTree = ""; }; + A9A5BE44149F0ACB00D9931C /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = ""; }; + A9A5BE45149F0ACB00D9931C /* Window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Window.cpp; sourceTree = ""; }; + A9A5BE46149F0ACB00D9931C /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = ""; }; + A9A5BE49149F0B0200D9931C /* Variant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Variant.cpp; sourceTree = ""; }; + A9A5BE4A149F0B0200D9931C /* Variant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Variant.h; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; A9B4BA981045937F001DBC80 /* ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleSystem.h; sourceTree = ""; }; A9B4BA991045937F001DBC80 /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = ""; }; @@ -847,6 +856,8 @@ A93E69EE10420ABF007D418B /* types.h */, A9CF0E8510B9EB1000E6F37E /* utf8.cpp */, A9CF0E8410B9EB1000E6F37E /* utf8.h */, + A9A5BE49149F0B0200D9931C /* Variant.cpp */, + A9A5BE4A149F0B0200D9931C /* Variant.h */, A93E69EF10420ABF007D418B /* Vector.cpp */, A93E69F010420ABF007D418B /* Vector.h */, A93E69F110420ABF007D418B /* version.h */, @@ -945,6 +956,7 @@ A93E6B7410420ACB007D418B /* sound */, A96E253C13B9892100456DEA /* thread */, A93E6B8D10420ACB007D418B /* timer */, + A9A5BE41149F0ACB00D9931C /* window */, ); path = modules; sourceTree = ""; @@ -1461,6 +1473,25 @@ path = win32; sourceTree = ""; }; + A9A5BE41149F0ACB00D9931C /* window */ = { + isa = PBXGroup; + children = ( + A9A5BE42149F0ACB00D9931C /* sdl */, + A9A5BE45149F0ACB00D9931C /* Window.cpp */, + A9A5BE46149F0ACB00D9931C /* Window.h */, + ); + path = window; + sourceTree = ""; + }; + A9A5BE42149F0ACB00D9931C /* sdl */ = { + isa = PBXGroup; + children = ( + A9A5BE43149F0ACB00D9931C /* Window.cpp */, + A9A5BE44149F0ACB00D9931C /* Window.h */, + ); + path = sdl; + sourceTree = ""; + }; A9D5C484142E5F7F0044ECF7 /* Box2D */ = { isa = PBXGroup; children = ( @@ -1879,6 +1910,9 @@ A97E632514604BC200020E43 /* wrap_Keyboard.cpp in Sources */, A97E632814604BCF00020E43 /* wrap_Mouse.cpp in Sources */, A97E632C14604BDF00020E43 /* wrap_Timer.cpp in Sources */, + A9A5BE47149F0ACB00D9931C /* Window.cpp in Sources */, + A9A5BE48149F0ACB00D9931C /* Window.cpp in Sources */, + A9A5BE4B149F0B0200D9931C /* Variant.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 969c53e592953c7abad3209081abc041d01de3c6 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 19 Dec 2011 00:28:45 -0600 Subject: [PATCH 318/384] make love build on OS X again - there's no need to include gl.h directly, GLee.h does that for us in a cross-platform way --- src/modules/graphics/opengl/ParticleSystem.cpp | 2 +- src/modules/graphics/opengl/SpriteBatch.h | 1 - src/modules/graphics/opengl/VertexBuffer.h | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/modules/graphics/opengl/ParticleSystem.cpp b/src/modules/graphics/opengl/ParticleSystem.cpp index 0387689ee..061ee1657 100644 --- a/src/modules/graphics/opengl/ParticleSystem.cpp +++ b/src/modules/graphics/opengl/ParticleSystem.cpp @@ -22,7 +22,7 @@ #include -#include +#include "GLee.h" #include #include diff --git a/src/modules/graphics/opengl/SpriteBatch.h b/src/modules/graphics/opengl/SpriteBatch.h index c6300ef5b..7737ebcef 100644 --- a/src/modules/graphics/opengl/SpriteBatch.h +++ b/src/modules/graphics/opengl/SpriteBatch.h @@ -36,7 +36,6 @@ // OpenGL #include "GLee.h" -#include namespace love { diff --git a/src/modules/graphics/opengl/VertexBuffer.h b/src/modules/graphics/opengl/VertexBuffer.h index 6657ac15c..23919280b 100644 --- a/src/modules/graphics/opengl/VertexBuffer.h +++ b/src/modules/graphics/opengl/VertexBuffer.h @@ -27,7 +27,6 @@ // OpenGL #include "GLee.h" -#include namespace love { From 6277f4c75bad384d8f1f7da29360bbd2ae40bf2d Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Mon, 19 Dec 2011 01:42:34 -0600 Subject: [PATCH 319/384] lua libraries, even on mac, almost never come in .dylib form, but rather .so - change love.filesystem.require accordingly --- src/modules/filesystem/physfs/wrap_Filesystem.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index b075801ef..d1d8e842b 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -304,8 +304,6 @@ namespace physfs { #ifdef LOVE_WINDOWS return ".dll"; -#elif defined(LOVE_MACOSX) || defined(LOVE_MACOS) - return ".dylib"; #else return ".so"; #endif From adf25991e8ae05a51a20b8da5997a84a1f6d719b Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Mon, 19 Dec 2011 14:15:48 +0100 Subject: [PATCH 320/384] Fix the joystick event handler names, to match the new event names --- src/scripts/boot.lua | 4 ++-- src/scripts/boot.lua.h | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 7ad76f900..fc667047f 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -166,10 +166,10 @@ function love.createhandlers() mousereleased = function (x,y,b) if love.mousereleased then love.mousereleased(x,y,b) end end, - joypressed = function (j,b) + joystickpressed = function (j,b) if love.joystickpressed then love.joystickpressed(j,b) end end, - joyrreleased = function (j,b) + joystickreleased = function (j,b) if love.joystickreleased then love.joystickreleased(j,b) end end, focus = function (f) diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 60f597e18..e46069be6 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -284,15 +284,15 @@ const unsigned char boot_lua[] = 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, 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, 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, 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, 0x72, 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, 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, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, From d3bd9b1156d5e3516bf9cc82d44593315207b2fd Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 20 Dec 2011 19:17:26 +0100 Subject: [PATCH 321/384] Events now have 4 arguments (or less) --- src/modules/event/Event.cpp | 31 ++++++++++++++++------------ src/modules/event/Event.h | 4 ++-- src/modules/event/sdl/Event.cpp | 12 +++++------ src/modules/event/sdl/wrap_Event.cpp | 2 +- src/scripts/boot.lua | 4 ++-- src/scripts/boot.lua.h | 8 +++---- 6 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/modules/event/Event.cpp b/src/modules/event/Event.cpp index ffa25807f..684683558 100644 --- a/src/modules/event/Event.cpp +++ b/src/modules/event/Event.cpp @@ -24,18 +24,20 @@ namespace love { namespace event { - Message::Message(std::string name, int nargs, ...) - : name(name), nargs(nargs) + Message::Message(std::string name, Variant *a, Variant *b, Variant *c, Variant *d) + : name(name), nargs(0) { - args = new Variant*[nargs]; - va_list arg; - va_start(arg, nargs); - for (int i = 0; i < nargs; i++) + args[0] = a; + args[1] = b; + args[2] = c; + args[3] = d; + for (int i = 0; i < 4; i++) { - args[i] = va_arg(arg, Variant*); + if (!args[i]) + continue; args[i]->retain(); + nargs++; } - va_end(arg); } Message::~Message() @@ -55,13 +57,16 @@ namespace event Message *Message::fromLua(lua_State *L, int n) { std::string name = luaL_checkstring(L, n); - Message *m = new Message(name, 0); - int nargs = lua_gettop(L)-n; - delete[] m->args; - m->args = new Variant*[nargs]; - for (int i = 0; i < nargs; i++) + 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]) + break; + m->nargs++; } return m; } diff --git a/src/modules/event/Event.h b/src/modules/event/Event.h index 77dc8a931..789f99b87 100644 --- a/src/modules/event/Event.h +++ b/src/modules/event/Event.h @@ -39,11 +39,11 @@ namespace event { private: std::string name; - Variant **args; + Variant *args[4]; int nargs; public: - Message(std::string name, int nargs, ...); + Message(std::string name, Variant *a = NULL, Variant *b = NULL, Variant *c = NULL, Variant *d = NULL); ~Message(); int toLua(lua_State *L); diff --git a/src/modules/event/sdl/Event.cpp b/src/modules/event/sdl/Event.cpp index 8c65db7b1..4c4472689 100644 --- a/src/modules/event/sdl/Event.cpp +++ b/src/modules/event/sdl/Event.cpp @@ -98,7 +98,7 @@ namespace sdl { arg1 = new Variant(txt, strlen(txt)); arg2 = new Variant((double) e.key.keysym.unicode); - msg = new Message("keypressed", 2, arg1, arg2); + msg = new Message("keypressed", arg1, arg2); arg1->release(); arg2->release(); } @@ -107,7 +107,7 @@ namespace sdl if (keys.find(e.key.keysym.sym, key) && love::event::Event::keys.find(key, txt)) { arg1 = new Variant(txt, strlen(txt)); - msg = new Message("keyreleased", 1, arg1); + msg = new Message("keyreleased", arg1); arg1->release(); } break; @@ -119,7 +119,7 @@ namespace sdl arg2 = new Variant((double) e.button.y); arg3 = new Variant(txt, strlen(txt)); msg = new Message((e.type == SDL_MOUSEBUTTONDOWN) ? - "mousepressed" : "mousereleased", 3, + "mousepressed" : "mousereleased", arg1, arg2, arg3); arg1->release(); arg2->release(); @@ -131,7 +131,7 @@ namespace sdl arg1 = new Variant((double) (e.jbutton.which+1)); arg2 = new Variant((double) (e.jbutton.button+1)); msg = new Message((e.type == SDL_JOYBUTTONDOWN) ? - "joystickpressed" : "joystickreleased", 2, + "joystickpressed" : "joystickreleased", arg1, arg2); arg1->release(); arg2->release(); @@ -139,11 +139,11 @@ namespace sdl case SDL_ACTIVEEVENT: arg1 = new Variant(e.active.gain != 0); if (e.active.state & SDL_APPINPUTFOCUS) - msg = new Message("focus", 1, arg1); + msg = new Message("focus", arg1); arg1->release(); break; case SDL_QUIT: - msg = new Message("quit", 0); + msg = new Message("quit"); break; } diff --git a/src/modules/event/sdl/wrap_Event.cpp b/src/modules/event/sdl/wrap_Event.cpp index 028f24eaa..fef631723 100644 --- a/src/modules/event/sdl/wrap_Event.cpp +++ b/src/modules/event/sdl/wrap_Event.cpp @@ -99,7 +99,7 @@ namespace sdl int w_quit(lua_State * L) { - Message *m = new Message("quit", 0); + Message *m = new Message("quit"); instance->push(m); return 1; } diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index fc667047f..7ba51de0d 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -380,7 +380,7 @@ function love.run() -- Process events. if love.event then love.event.pump() - for e,a,b,c in love.event.poll() do + 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 @@ -389,7 +389,7 @@ function love.run() return end end - love.handlers[e](a,b,c) + love.handlers[e](a,b,c,d) end end diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index e46069be6..2a622be90 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -652,9 +652,9 @@ const unsigned char boot_lua[] = 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, 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, 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, @@ -669,7 +669,7 @@ const unsigned char boot_lua[] = 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, 0x29, 0x0a, + 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,0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x64, 0x74, 0x2c, 0x20, 0x61, 0x73, From 9fb63dc4b8890e68d3b3345eb8fb9478af9e1e56 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 20 Dec 2011 19:51:50 +0100 Subject: [PATCH 322/384] Make the new event sink thread-safe (hopefully) and make small usability fixes --- src/modules/event/Event.cpp | 15 ++++++++++++--- src/modules/event/Event.h | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/modules/event/Event.cpp b/src/modules/event/Event.cpp index 684683558..0ba1c1e48 100644 --- a/src/modules/event/Event.cpp +++ b/src/modules/event/Event.cpp @@ -20,6 +20,9 @@ #include "Event.h" +using love::thread::Mutex; +using love::thread::Lock; + namespace love { namespace event @@ -48,7 +51,7 @@ namespace event int Message::toLua(lua_State *L) { - lua_pushstring(L, name.c_str()); + luax_pushstring(L, name); for (int i = 0; i < nargs; i++) args[i]->toLua(L); return nargs+1; @@ -56,7 +59,7 @@ namespace event Message *Message::fromLua(lua_State *L, int n) { - std::string name = luaL_checkstring(L, n); + std::string name = luax_checkstring(L, n); n++; Message *m = new Message(name); for (int i = 0; i < 4; i++) @@ -65,7 +68,11 @@ namespace event break; m->args[i] = Variant::fromLua(L, n+i); if (!m->args[i]) - break; + { + 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; @@ -77,12 +84,14 @@ namespace event 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(); diff --git a/src/modules/event/Event.h b/src/modules/event/Event.h index 789f99b87..7a738195b 100644 --- a/src/modules/event/Event.h +++ b/src/modules/event/Event.h @@ -27,6 +27,7 @@ #include #include #include +#include // STL #include @@ -66,6 +67,7 @@ namespace event static bool getConstant(love::keyboard::Keyboard::Key in, const char *& out); protected: + thread::Mutex mutex; std::queue queue; static StringMap::Entry buttonEntries[]; static StringMap buttons; From 53e010a83269cfd469fffd836d28ec1eff7a0683 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 20 Dec 2011 20:26:17 +0100 Subject: [PATCH 323/384] Remove all uses of LOVE_UNUSED, and simply not name the arguments instead --- src/modules/graphics/opengl/Graphics.cpp | 3 +-- src/modules/graphics/opengl/VertexBuffer.cpp | 3 +-- src/modules/thread/sdl/threads.h | 6 +++--- src/modules/thread/threads.h | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 9a70a0f66..dcce08386 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -587,7 +587,7 @@ namespace opengl lineWidth = width; } - void Graphics::setLineStyle(Graphics::LineStyle style ) + void Graphics::setLineStyle(Graphics::LineStyle/* style*/ ) { //// XXX: actually enables antialiasing for _all_ polygons. //// may need investigation if wanted or not @@ -599,7 +599,6 @@ namespace opengl // glEnable (GL_POLYGON_SMOOTH); // glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST); //} - LOVE_UNUSED(style); } void Graphics::setLine( float width, Graphics::LineStyle style ) diff --git a/src/modules/graphics/opengl/VertexBuffer.cpp b/src/modules/graphics/opengl/VertexBuffer.cpp index 00893b5a0..12992d20b 100644 --- a/src/modules/graphics/opengl/VertexBuffer.cpp +++ b/src/modules/graphics/opengl/VertexBuffer.cpp @@ -88,9 +88,8 @@ namespace opengl delete [] buf; } - void *VertexArray::map(GLenum access) + void *VertexArray::map(GLenum/* access*/) { - LOVE_UNUSED(access); return buf; } diff --git a/src/modules/thread/sdl/threads.h b/src/modules/thread/sdl/threads.h index 693a21b1e..fd1697f5a 100644 --- a/src/modules/thread/sdl/threads.h +++ b/src/modules/thread/sdl/threads.h @@ -32,7 +32,7 @@ namespace thread class Mutex { private: SDL_mutex* mutex; - Mutex(const Mutex& mutex) {LOVE_UNUSED(mutex);} + Mutex(const Mutex&/* mutex*/) {} friend class Conditional; @@ -49,7 +49,7 @@ namespace thread class ThreadBase { private: SDL_Thread* thread; - ThreadBase(ThreadBase& thread) {LOVE_UNUSED(thread);} + ThreadBase(ThreadBase&/* thread*/) {} bool running; static int thread_runner(void* param); @@ -71,7 +71,7 @@ namespace thread class Semaphore { private: - Semaphore(const Semaphore& sem) {LOVE_UNUSED(sem);} + Semaphore(const Semaphore&/* sem*/) {} SDL_sem* semaphore; public: diff --git a/src/modules/thread/threads.h b/src/modules/thread/threads.h index eb431e484..73dcd408d 100644 --- a/src/modules/thread/threads.h +++ b/src/modules/thread/threads.h @@ -63,7 +63,7 @@ namespace thread private: Mutex* mutex; - Lock(Lock& lock) {LOVE_UNUSED(lock);} + Lock(Lock&/* lock*/) {} public: Lock(Mutex* m): mutex(m) { From 47561e8b14067094883a41358186ee32b280d17d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 20 Dec 2011 20:53:26 +0100 Subject: [PATCH 324/384] Hopefully add cross-platform (u)int types:q --- src/common/int.h | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/common/int.h diff --git a/src/common/int.h b/src/common/int.h new file mode 100644 index 000000000..536856780 --- /dev/null +++ b/src/common/int.h @@ -0,0 +1,53 @@ +/** +* 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_INT_H +#define LOVE_INT_H + +#ifndef LOVE_WINDOWS +#include +#endif + +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 + 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 + +#endif // LOVE_INT_H From 951d420db74048bdfdbb36131e4c6d08a0b33986 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 20 Dec 2011 21:02:59 +0100 Subject: [PATCH 325/384] Eliminate more warnings --- src/modules/event/sdl/wrap_Event.cpp | 2 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/modules/event/sdl/wrap_Event.cpp b/src/modules/event/sdl/wrap_Event.cpp index fef631723..0a01bc1b4 100644 --- a/src/modules/event/sdl/wrap_Event.cpp +++ b/src/modules/event/sdl/wrap_Event.cpp @@ -97,7 +97,7 @@ namespace sdl return 0; } - int w_quit(lua_State * L) + int w_quit(lua_State *) { Message *m = new Message("quit"); instance->push(m); diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index efeef4116..a9691471e 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -507,9 +507,6 @@ namespace opengl int w_setFont(lua_State * L) { - // The second parameter is an optional int. - int size = luaL_optint(L, 2, 12); - Font * font = luax_checktype(L, 1, "Font", GRAPHICS_FONT_T); instance->setFont(font); return 0; From 25c5bbea675132dd9ecd8f2c24b392c2aecdd90d Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 22 Dec 2011 01:54:17 -0600 Subject: [PATCH 326/384] Add int.h to the Xcode project --- platform/macosx/love.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index 45756e67a..82b089c4e 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -602,6 +602,7 @@ A9A5BE46149F0ACB00D9931C /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = ""; }; A9A5BE49149F0B0200D9931C /* Variant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Variant.cpp; sourceTree = ""; }; A9A5BE4A149F0B0200D9931C /* Variant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Variant.h; sourceTree = ""; }; + A9A5BE4C14A2D2D000D9931C /* int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int.h; sourceTree = ""; }; A9B1AE451197293000D496EB /* love_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love_Prefix.pch; sourceTree = ""; }; A9B4BA981045937F001DBC80 /* ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleSystem.h; sourceTree = ""; }; A9B4BA991045937F001DBC80 /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = ""; }; @@ -840,6 +841,7 @@ A968F0C61083A07B00A895AA /* EnumMap.h */, A93E69E010420ABF007D418B /* Exception.cpp */, A93E69E110420ABF007D418B /* Exception.h */, + A9A5BE4C14A2D2D000D9931C /* int.h */, A93E69E210420ABF007D418B /* math.h */, A93E69E310420ABF007D418B /* Matrix.cpp */, A93E69E410420ABF007D418B /* Matrix.h */, From ce682a45c668f40a26d7c02ad64a12b8e18d30c5 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 22 Dec 2011 02:43:58 -0600 Subject: [PATCH 327/384] add config.h #include to int.h --- src/common/int.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/int.h b/src/common/int.h index 536856780..0d0304efc 100644 --- a/src/common/int.h +++ b/src/common/int.h @@ -21,6 +21,8 @@ #ifndef LOVE_INT_H #define LOVE_INT_H +#include + #ifndef LOVE_WINDOWS #include #endif From 7378a90101ca55aad9dcdfe3df250818e2cdac82 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 22 Dec 2011 02:45:11 -0600 Subject: [PATCH 328/384] Upgrade love.filesystem to use 64-bit numbers for dealing with file sizes, thus (hopefully) enabling lovers to work with very large files (based on Boolsheet's patch in issue #179) --- src/modules/filesystem/File.h | 17 +++++---- src/modules/filesystem/FileData.cpp | 2 +- src/modules/filesystem/FileData.h | 4 +- src/modules/filesystem/physfs/File.cpp | 28 +++++++------- src/modules/filesystem/physfs/File.h | 14 +++---- src/modules/filesystem/physfs/Filesystem.cpp | 4 +- src/modules/filesystem/physfs/Filesystem.h | 5 ++- src/modules/filesystem/physfs/wrap_File.cpp | 40 +++++++++++++------- 8 files changed, 65 insertions(+), 49 deletions(-) diff --git a/src/modules/filesystem/File.h b/src/modules/filesystem/File.h index a4b3948da..46e70dfca 100644 --- a/src/modules/filesystem/File.h +++ b/src/modules/filesystem/File.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace love { @@ -56,7 +57,7 @@ namespace filesystem /** * Used to indicate ALL data in a file. **/ - static const int ALL = -1; + static const int64 ALL = -1; /** * Destructor. @@ -83,7 +84,7 @@ namespace filesystem * * @return The size of the file. **/ - virtual unsigned int getSize() = 0; + virtual int64 getSize() = 0; /** * Reads data from the file and allocates a Data object. @@ -91,7 +92,7 @@ namespace filesystem * @param size The number of bytes to attempt reading, or -1 for EOF. * @return A newly allocated Data object. **/ - virtual Data * read(int size = ALL) = 0; + virtual Data * read(int64 size = ALL) = 0; /** * Reads data into the destination buffer. @@ -100,7 +101,7 @@ namespace filesystem * @param size The number of bytes to attempt reading. * @return The number of bytes actually read. **/ - virtual int read(void * dst, int size) = 0; + virtual int64 read(void * dst, int64 size) = 0; /** * Writes data into the File. @@ -109,7 +110,7 @@ namespace filesystem * @param size The size of the buffer. * @return True of success, false otherwise. **/ - virtual bool write(const void * data, int size) = 0; + virtual bool write(const void * data, int64 size) = 0; /** * Writes a Data object into the File. @@ -118,7 +119,7 @@ namespace filesystem * @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, int size = ALL) = 0; + virtual bool write(const Data * data, int64 size = ALL) = 0; /** * Checks whether we are currently at end-of-file. @@ -132,7 +133,7 @@ namespace filesystem * * @return The current byte position in the File. **/ - virtual int tell() = 0; + virtual int64 tell() = 0; /** * Seeks to a certain position in the File. @@ -140,7 +141,7 @@ namespace filesystem * @param pos The byte position in the file. * @return True on success, false otherwise. **/ - virtual bool seek(int pos) = 0; + virtual bool seek(uint64 pos) = 0; /** * Gets the current mode of the File. diff --git a/src/modules/filesystem/FileData.cpp b/src/modules/filesystem/FileData.cpp index 33e31301f..32466aa85 100644 --- a/src/modules/filesystem/FileData.cpp +++ b/src/modules/filesystem/FileData.cpp @@ -27,7 +27,7 @@ namespace love { namespace filesystem { - FileData::FileData(int size, const std::string & filename) + FileData::FileData(unsigned int size, const std::string & filename) : data(new char[size]), size(size), filename(filename) { if (filename.rfind('.') != std::string::npos) diff --git a/src/modules/filesystem/FileData.h b/src/modules/filesystem/FileData.h index 938cc76aa..67160e8c8 100644 --- a/src/modules/filesystem/FileData.h +++ b/src/modules/filesystem/FileData.h @@ -38,7 +38,7 @@ namespace filesystem char * data; // Size of the data. - int size; + unsigned int size; // The filename used for error purposes. std::string filename; @@ -55,7 +55,7 @@ namespace filesystem DECODE_MAX_ENUM }; // Decoder - FileData(int size, const std::string & filename); + FileData(unsigned int size, const std::string & filename); virtual ~FileData(); diff --git a/src/modules/filesystem/physfs/File.cpp b/src/modules/filesystem/physfs/File.cpp index dc148435a..2561164c3 100644 --- a/src/modules/filesystem/physfs/File.cpp +++ b/src/modules/filesystem/physfs/File.cpp @@ -92,30 +92,30 @@ namespace physfs return true; } - unsigned int File::getSize() + int64 File::getSize() { // If the file is closed, open it to // check the size. if (file == 0) { open(READ); - unsigned int size = (unsigned int)PHYSFS_fileLength(file); + int64 size = (int64)PHYSFS_fileLength(file); close(); return size; } - return (unsigned int)PHYSFS_fileLength(file); + return (int64)PHYSFS_fileLength(file); } - Data * File::read(int size) + Data * File::read(int64 size) { bool isOpen = (file != 0); if (!isOpen && !open(READ)) throw love::Exception("Could not read file %s.", filename.c_str()); - int max = (int)PHYSFS_fileLength(file); + int64 max = (int64)PHYSFS_fileLength(file); size = (size == ALL) ? max : size; size = (size > max) ? max : size; @@ -129,18 +129,18 @@ namespace physfs return fileData; } - int File::read(void * dst, int size) + int64 File::read(void * dst, int64 size) { bool isOpen = (file != 0); if (!isOpen) open(READ); - int max = (int)PHYSFS_fileLength(file); + int64 max = (int64)PHYSFS_fileLength(file); size = (size == ALL) ? max : size; size = (size > max) ? max : size; - int read = (int)PHYSFS_read(file, dst, 1, size); + int64 read = (int64)PHYSFS_read(file, dst, 1, size); if (!isOpen) close(); @@ -148,13 +148,13 @@ namespace physfs return read; } - bool File::write(const void * data, int size) + bool File::write(const void * data, int64 size) { if (file == 0) throw love::Exception("Could not write to file. File not open."); // Try to write. - int written = static_cast(PHYSFS_write(file, data, 1, size)); + int written = static_cast(PHYSFS_write(file, data, 1, size)); // Check that correct amount of data was written. if (written != size) @@ -163,7 +163,7 @@ namespace physfs return true; } - bool File::write(const Data * data, int size) + bool File::write(const Data * data, int64 size) { return write(data->getData(), (size == ALL) ? data->getSize() : size); } @@ -192,15 +192,15 @@ namespace physfs return false; } - int File::tell() + int64 File::tell() { if (file == 0) return -1; - return (int)PHYSFS_tell(file); + return (int64)PHYSFS_tell(file); } - bool File::seek(int pos) + bool File::seek(uint64 pos) { if (file == 0) return false; diff --git a/src/modules/filesystem/physfs/File.h b/src/modules/filesystem/physfs/File.h index aa6c682f2..59a3a0ffb 100644 --- a/src/modules/filesystem/physfs/File.h +++ b/src/modules/filesystem/physfs/File.h @@ -67,14 +67,14 @@ namespace physfs // Implements love::filesystem::File. bool open(Mode mode); bool close(); - unsigned int getSize(); - Data * read(int size = ALL); - int read(void * dst, int size); - bool write(const void * data, int size); - bool write(const Data * data, int size = ALL); + int64 getSize(); + Data * 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 eof(); - int tell(); - bool seek(int pos); + int64 tell(); + bool seek(uint64 pos); Mode getMode(); std::string getFilename() const; std::string getExtension() const; diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index f96d7f017..25068fe57 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -169,7 +169,7 @@ namespace physfs return new File(filename); } - FileData * Filesystem::newFileData(void * data, int size, const char * filename) + FileData * Filesystem::newFileData(void * data, unsigned int size, const char * filename) { FileData * fd = new FileData(size, std::string(filename)); @@ -315,7 +315,7 @@ namespace physfs // Optionally, the caller can specify whether to read // the whole file, or just a part of it. - int count = luaL_optint(L, 2, file->getSize()); + int count = luaL_optint(L, 2, (lua_Integer)file->getSize()); // FIXME // Read the data. Data * data = file->read(count); diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index d87881059..92cd83e3d 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -30,6 +30,7 @@ // LOVE #include #include +#include #include #include "File.h" @@ -153,7 +154,7 @@ namespace physfs * @param size The size of the data. * @param filename The full filename used to file type identification. **/ - FileData * newFileData(void * data, int size, const char * filename); + FileData * newFileData(void * data, unsigned int size, const char * filename); /** * Creates a new FileData object from base64 data. @@ -261,7 +262,7 @@ namespace physfs * Seek to a position within a file. * @param pos The position to seek to. **/ - bool seek(File * file, int pos); + bool seek(File * file, uint64 pos); /** * This "native" method returns a table of all diff --git a/src/modules/filesystem/physfs/wrap_File.cpp b/src/modules/filesystem/physfs/wrap_File.cpp index 77c69786b..430c2860d 100644 --- a/src/modules/filesystem/physfs/wrap_File.cpp +++ b/src/modules/filesystem/physfs/wrap_File.cpp @@ -22,6 +22,7 @@ #include #include +#include namespace love { @@ -37,14 +38,14 @@ namespace physfs int w_File_getSize(lua_State * L) { File * t = luax_checkfile(L, 1); - try - { - lua_pushinteger(L, t->getSize()); - } - catch (Exception & e) - { - return luaL_error(L, e.what()); - } + int64 size = t->getSize(); + + // Push nil on failure or if size does not fit into a double precision floating-point number. + if (size == -1 || size >= 0x20000000000000LL) + lua_pushnil(L); + else + lua_pushnumber(L, (lua_Number)size); + return 1; } @@ -79,10 +80,12 @@ namespace physfs { File * file = luax_checkfile(L, 1); Data * d = 0; + + int64 size = (int64)luaL_optnumber(L, 2, file->getSize()); try { - d = file->read(luaL_optint(L, 2, file->getSize())); + d = file->read(size); } catch (Exception e) { @@ -136,22 +139,33 @@ namespace physfs int w_File_eof(lua_State * L) { File * file = luax_checkfile(L, 1); - lua_pushboolean(L, file->eof() ? 1 : 0); + luax_pushboolean(L, file->eof()); return 1; } int w_File_tell(lua_State * L) { File * file = luax_checkfile(L, 1); - lua_pushinteger(L, file->tell()); + int64 pos = file->tell(); + // Push nil on failure or if pos does not fit into a double precision floating-point number. + if (pos == -1 || pos >= 0x20000000000000LL) + lua_pushnil(L); + else + lua_pushnumber(L, (lua_Number)pos); return 1; } int w_File_seek(lua_State * L) { File * file = luax_checkfile(L, 1); - int pos = luaL_checkinteger(L, 2); - lua_pushboolean(L, file->seek(pos) ? 1 : 0); + 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; } From bc278cf2b8092226c12d19961db925edb21a3059 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Thu, 22 Dec 2011 03:37:34 -0600 Subject: [PATCH 329/384] love.graphics.arc is now better and actually draws in the right direction --- src/modules/graphics/opengl/Graphics.cpp | 54 ++++++++++--------- src/modules/graphics/opengl/wrap_Graphics.cpp | 14 +++-- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index dcce08386..f2aea4504 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -834,44 +834,48 @@ namespace opengl void Graphics::arc(DrawMode mode, float x, float y, float radius, float angle1, float angle2, int points) { - angle1 = fmod(angle1, 2.0f * (float)LOVE_M_PI); - angle2 = fmod(angle2, 2.0f * (float)LOVE_M_PI); - if (angle1 == angle2) + // Nothing to display with no points or equal angles. (Or is there with line mode?) + if (points <= 0 || angle1 == angle2) return; - else if (angle1 > angle2) - angle2 += (float)LOVE_M_PI * 2.0f; + // 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; - if (points <= 0) points = 1; - float angle_shift = ((angle2 - angle1) / points); 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 * cos(phi); + coords[2 * (i+1) + 1] = y + radius * sin(phi); + } // GL_POLYGON can only fill-draw convex polygons, so we need to do stuff manually here if (mode == DRAW_LINE) - { - float *coords = new float[(points + 3) * 2]; - coords[0] = coords[2 * points + 4] = x; - coords[1] = coords[2 * points + 5] = y; - for (int i = 0; i <= points; ++i, phi += angle_shift) - { - coords[2 * (i+1)] = x + radius * cos(phi); - coords[2 * (i+1) + 1] = y - radius * sin(phi); - } - polyline(coords, (points + 3) * 2); // artifacts at sharp angles if set to looping - - delete[] coords; - } + polyline(coords, num_coords); // Artifacts at sharp angles if set to looping. else { glDisable(GL_TEXTURE_2D); - glBegin(GL_TRIANGLE_FAN); - glVertex2f(x, y); - for (int i = 0; i <= points; ++i, phi += angle_shift) - glVertex2f(x + radius * cos(phi), y - radius * sin(phi)); - glEnd(); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, (const GLvoid *) coords); + glDrawArrays(GL_TRIANGLE_FAN, 0, points + 2); + glDisableClientState(GL_VERTEX_ARRAY); glEnable(GL_TEXTURE_2D); } + delete[] coords; } /// @param mode the draw mode diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index a9691471e..a73ee6022 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -1018,10 +1018,11 @@ namespace opengl float y = (float)luaL_checknumber(L, 3); float radius = (float)luaL_checknumber(L, 4); int points; - if (lua_gettop(L) > 4) - points = lua_tointeger(L, 5); - else + if (lua_isnoneornil(L, 5)) points = radius > 10 ? radius : 10; + else + points = luaL_checkint(L, 5); + instance->circle(mode, x, y, radius, points); return 0; } @@ -1038,7 +1039,12 @@ namespace opengl float radius = (float)luaL_checknumber(L, 4); float angle1 = (float)luaL_checknumber(L, 5); float angle2 = (float)luaL_checknumber(L, 6); - int points = luaL_optint(L, 7, 10); + int points; + if (lua_isnoneornil(L, 7)) + points = radius > 10 ? radius : 10; + else + points = luaL_checkint(L, 7); + instance->arc(mode, x, y, radius, angle1, angle2, points); return 0; } From e0dcf5570387566a77152426639574a4cc7df6fb Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Fri, 23 Dec 2011 12:16:36 +0100 Subject: [PATCH 330/384] Make love.event.clear thread-safe, though it's only callable from the main thread (with SDL backend, anyway) --- src/modules/event/Event.cpp | 10 ++++++++++ src/modules/event/Event.h | 1 + src/modules/event/sdl/Event.cpp | 6 +----- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/modules/event/Event.cpp b/src/modules/event/Event.cpp index 0ba1c1e48..61f7c972d 100644 --- a/src/modules/event/Event.cpp +++ b/src/modules/event/Event.cpp @@ -99,6 +99,16 @@ namespace event return true; } + void Event::clear() + { + Lock lock(mutex); + while (!queue.empty()) + { + queue.back()->release(); + queue.pop(); + } + } + bool Event::getConstant(const char * in, love::mouse::Mouse::Button & out) { return buttons.find(in, out); diff --git a/src/modules/event/Event.h b/src/modules/event/Event.h index 7a738195b..feff4b509 100644 --- a/src/modules/event/Event.h +++ b/src/modules/event/Event.h @@ -58,6 +58,7 @@ namespace event void push(Message *msg); bool poll(Message *&msg); + virtual void clear(); virtual void pump() = 0; diff --git a/src/modules/event/sdl/Event.cpp b/src/modules/event/sdl/Event.cpp index 4c4472689..d92eafa2e 100644 --- a/src/modules/event/sdl/Event.cpp +++ b/src/modules/event/sdl/Event.cpp @@ -77,11 +77,7 @@ namespace sdl // Do nothing with 'e' ... } - while (!queue.empty()) - { - queue.back()->release(); - queue.pop(); - } + love::event::Event::clear(); } Message *Event::convert(SDL_Event & e) From c707a4ca456154eb104fcb752804776f0311ea2c Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 24 Dec 2011 01:10:40 +0100 Subject: [PATCH 331/384] Properly export all lua-facing functions and use those for initialization (love.cpp no longer explicitly mentions implementations) --- src/love.cpp | 61 ++++++++++--------- src/modules/audio/wrap_Audio.cpp | 2 +- src/modules/audio/wrap_Source.cpp | 2 +- src/modules/audio/wrap_Source.h | 2 +- src/modules/event/sdl/wrap_Event.cpp | 2 +- src/modules/filesystem/physfs/wrap_File.cpp | 2 +- src/modules/filesystem/physfs/wrap_File.h | 2 +- .../filesystem/physfs/wrap_FileData.cpp | 2 +- src/modules/filesystem/physfs/wrap_FileData.h | 2 +- .../filesystem/physfs/wrap_Filesystem.cpp | 2 +- src/modules/font/freetype/wrap_Font.cpp | 2 +- src/modules/font/wrap_GlyphData.cpp | 2 +- src/modules/font/wrap_GlyphData.h | 2 +- src/modules/font/wrap_Rasterizer.cpp | 2 +- src/modules/font/wrap_Rasterizer.h | 2 +- src/modules/graphics/opengl/wrap_Canvas.cpp | 2 +- src/modules/graphics/opengl/wrap_Canvas.h | 2 +- src/modules/graphics/opengl/wrap_Font.cpp | 2 +- src/modules/graphics/opengl/wrap_Font.h | 2 +- src/modules/graphics/opengl/wrap_Graphics.cpp | 2 +- src/modules/graphics/opengl/wrap_Image.cpp | 2 +- src/modules/graphics/opengl/wrap_Image.h | 2 +- .../graphics/opengl/wrap_ParticleSystem.cpp | 2 +- .../graphics/opengl/wrap_ParticleSystem.h | 2 +- .../graphics/opengl/wrap_PixelEffect.cpp | 2 +- .../graphics/opengl/wrap_PixelEffect.h | 2 +- src/modules/graphics/opengl/wrap_Quad.cpp | 2 +- src/modules/graphics/opengl/wrap_Quad.h | 2 +- .../graphics/opengl/wrap_SpriteBatch.cpp | 2 +- .../graphics/opengl/wrap_SpriteBatch.h | 2 +- src/modules/image/wrap_Image.cpp | 2 +- src/modules/image/wrap_ImageData.cpp | 2 +- src/modules/image/wrap_ImageData.h | 2 +- src/modules/joystick/sdl/wrap_Joystick.cpp | 2 +- src/modules/keyboard/wrap_Keyboard.cpp | 2 +- src/modules/mouse/wrap_Mouse.cpp | 2 +- src/modules/physics/box2d/wrap_Body.cpp | 2 +- src/modules/physics/box2d/wrap_Body.h | 2 +- src/modules/physics/box2d/wrap_ChainShape.cpp | 2 +- src/modules/physics/box2d/wrap_ChainShape.h | 2 +- .../physics/box2d/wrap_CircleShape.cpp | 4 +- src/modules/physics/box2d/wrap_CircleShape.h | 2 +- src/modules/physics/box2d/wrap_Contact.cpp | 2 +- src/modules/physics/box2d/wrap_Contact.h | 2 +- .../physics/box2d/wrap_DistanceJoint.cpp | 2 +- .../physics/box2d/wrap_DistanceJoint.h | 2 +- src/modules/physics/box2d/wrap_EdgeShape.cpp | 2 +- src/modules/physics/box2d/wrap_EdgeShape.h | 2 +- src/modules/physics/box2d/wrap_Fixture.cpp | 2 +- src/modules/physics/box2d/wrap_Fixture.h | 2 +- .../physics/box2d/wrap_FrictionJoint.cpp | 2 +- .../physics/box2d/wrap_FrictionJoint.h | 2 +- src/modules/physics/box2d/wrap_GearJoint.cpp | 2 +- src/modules/physics/box2d/wrap_GearJoint.h | 2 +- src/modules/physics/box2d/wrap_Joint.cpp | 2 +- src/modules/physics/box2d/wrap_Joint.h | 2 +- src/modules/physics/box2d/wrap_MouseJoint.cpp | 2 +- src/modules/physics/box2d/wrap_MouseJoint.h | 2 +- src/modules/physics/box2d/wrap_Physics.cpp | 2 +- .../physics/box2d/wrap_PolygonShape.cpp | 2 +- src/modules/physics/box2d/wrap_PolygonShape.h | 2 +- .../physics/box2d/wrap_PrismaticJoint.cpp | 2 +- .../physics/box2d/wrap_PrismaticJoint.h | 2 +- .../physics/box2d/wrap_PulleyJoint.cpp | 2 +- src/modules/physics/box2d/wrap_PulleyJoint.h | 2 +- .../physics/box2d/wrap_RevoluteJoint.cpp | 2 +- .../physics/box2d/wrap_RevoluteJoint.h | 2 +- src/modules/physics/box2d/wrap_RopeJoint.cpp | 2 +- src/modules/physics/box2d/wrap_RopeJoint.h | 2 +- src/modules/physics/box2d/wrap_Shape.cpp | 2 +- src/modules/physics/box2d/wrap_Shape.h | 2 +- src/modules/physics/box2d/wrap_WeldJoint.cpp | 2 +- src/modules/physics/box2d/wrap_WeldJoint.h | 2 +- src/modules/physics/box2d/wrap_WheelJoint.cpp | 2 +- src/modules/physics/box2d/wrap_WheelJoint.h | 2 +- src/modules/physics/box2d/wrap_World.cpp | 2 +- src/modules/physics/box2d/wrap_World.h | 2 +- src/modules/sound/wrap_Decoder.cpp | 2 +- src/modules/sound/wrap_Decoder.h | 2 +- src/modules/sound/wrap_Sound.cpp | 2 +- src/modules/sound/wrap_SoundData.cpp | 2 +- src/modules/sound/wrap_SoundData.h | 2 +- src/modules/thread/wrap_Thread.cpp | 4 +- src/modules/thread/wrap_Thread.h | 2 +- src/modules/timer/wrap_Timer.cpp | 2 +- 85 files changed, 119 insertions(+), 114 deletions(-) diff --git a/src/love.cpp b/src/love.cpp index 7360d3e59..5cb9d5766 100644 --- a/src/love.cpp +++ b/src/love.cpp @@ -39,21 +39,6 @@ // SDL #include -// Modules -#include + @@ -363,6 +364,7 @@ + diff --git a/platform/msvc2010/love.vcxproj.filters b/platform/msvc2010/love.vcxproj.filters index 10195ac16..10a05a456 100644 --- a/platform/msvc2010/love.vcxproj.filters +++ b/platform/msvc2010/love.vcxproj.filters @@ -745,6 +745,9 @@ modules\audio + + modules\graphics\opengl + @@ -1329,6 +1332,9 @@ modules\window\sdl + + modules\graphics\opengl + @@ -1336,4 +1342,4 @@ - + \ No newline at end of file From 86abc9323b578d4a113199379a43c86323d5c194 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 4 Feb 2012 11:31:07 -0500 Subject: [PATCH 384/384] Add ParticleSystem:getPosition (issue #368) --- src/modules/graphics/opengl/ParticleSystem.cpp | 5 +++++ src/modules/graphics/opengl/ParticleSystem.h | 5 +++++ src/modules/graphics/opengl/wrap_ParticleSystem.cpp | 12 ++++++++++++ src/modules/graphics/opengl/wrap_ParticleSystem.h | 1 + 4 files changed, 23 insertions(+) diff --git a/src/modules/graphics/opengl/ParticleSystem.cpp b/src/modules/graphics/opengl/ParticleSystem.cpp index ab0da26c3..156f109cf 100644 --- a/src/modules/graphics/opengl/ParticleSystem.cpp +++ b/src/modules/graphics/opengl/ParticleSystem.cpp @@ -320,6 +320,11 @@ namespace opengl { return position.getY(); } + + const love::Vector& ParticleSystem::getPosition() const + { + return position; + } float ParticleSystem::getDirection() const { diff --git a/src/modules/graphics/opengl/ParticleSystem.h b/src/modules/graphics/opengl/ParticleSystem.h index 4bd8e06af..7237bcc04 100644 --- a/src/modules/graphics/opengl/ParticleSystem.h +++ b/src/modules/graphics/opengl/ParticleSystem.h @@ -363,6 +363,11 @@ namespace opengl **/ float getY() const; + /** + * Returns the position of the emitter. + **/ + const love::Vector& getPosition() const; + /** * Returns the direction of the emitter (in degrees). **/ diff --git a/src/modules/graphics/opengl/wrap_ParticleSystem.cpp b/src/modules/graphics/opengl/wrap_ParticleSystem.cpp index 884f46af4..c81e42239 100644 --- a/src/modules/graphics/opengl/wrap_ParticleSystem.cpp +++ b/src/modules/graphics/opengl/wrap_ParticleSystem.cpp @@ -20,6 +20,8 @@ #include "wrap_ParticleSystem.h" +#include + #include namespace love @@ -260,6 +262,15 @@ namespace opengl lua_pushnumber(L, t->getY()); return 1; } + + int w_ParticleSystem_getPosition(lua_State * L) + { + ParticleSystem * t = luax_checkparticlesystem(L, 1); + const love::Vector& p = t->getPosition(); + lua_pushnumber(L, p.x); + lua_pushnumber(L, p.y); + return 2; + } int w_ParticleSystem_getDirection(lua_State * L) { @@ -376,6 +387,7 @@ namespace opengl { "setOffset", w_ParticleSystem_setOffset }, { "getX", w_ParticleSystem_getX }, { "getY", w_ParticleSystem_getY }, + { "getPosition", w_ParticleSystem_getPosition }, { "getDirection", w_ParticleSystem_getDirection }, { "getSpread", w_ParticleSystem_getSpread }, { "getOffsetX", w_ParticleSystem_getOffsetX }, diff --git a/src/modules/graphics/opengl/wrap_ParticleSystem.h b/src/modules/graphics/opengl/wrap_ParticleSystem.h index 980794f6e..7fb0f17b5 100644 --- a/src/modules/graphics/opengl/wrap_ParticleSystem.h +++ b/src/modules/graphics/opengl/wrap_ParticleSystem.h @@ -55,6 +55,7 @@ namespace opengl int w_ParticleSystem_setOffset(lua_State * L); int w_ParticleSystem_getX(lua_State * L); int w_ParticleSystem_getY(lua_State * L); + int w_ParticleSystem_getPosition(lua_State * L); int w_ParticleSystem_getDirection(lua_State * L); int w_ParticleSystem_getSpread(lua_State * L); int w_ParticleSystem_getOffsetX(lua_State * L);