From e21a0876b6b308df3e280f853a8f8df6f8de034a Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 14 Aug 2014 00:59:07 -0700 Subject: [PATCH 01/75] GuiTreeView bug in buildVisibleTree There was a bug in buildVisibleTree, it should be setting the RebuildVisible flag, not clearing it. The clip rectangle did not appear to be updating when expanding items or calling scrollVisible, which expands all the items to make a particular item visible. This would cause part of the tree to be cut off. Setting the RebuildVisible flag made the problem go away. --- Engine/source/gui/controls/guiTreeViewCtrl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/gui/controls/guiTreeViewCtrl.cpp b/Engine/source/gui/controls/guiTreeViewCtrl.cpp index 7f36a5903..bbace92dc 100644 --- a/Engine/source/gui/controls/guiTreeViewCtrl.cpp +++ b/Engine/source/gui/controls/guiTreeViewCtrl.cpp @@ -1237,7 +1237,7 @@ void GuiTreeViewCtrl::buildVisibleTree(bool bForceFullUpdate) bForceFullUpdate = true; // Update the flags. - mFlags.clear(RebuildVisible); + mFlags.set(RebuildVisible); // build the root items Item *traverse = mRoot; From 2987681220c75a8fe1b21ddf5a3f0237a4665c20 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 14 Aug 2014 21:52:48 -0700 Subject: [PATCH 02/75] Alternate fix for GuiTreeView Adding `mFlags.set(RebuildVisible)` to `GuiTreeView::onWake()` fixes the problem where the tree is not drawn correctly when nodes are expanded in the TorqueScript `GuiTreeView::onWake()` callback function. --- Engine/source/gui/controls/guiTreeViewCtrl.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Engine/source/gui/controls/guiTreeViewCtrl.cpp b/Engine/source/gui/controls/guiTreeViewCtrl.cpp index bbace92dc..191160372 100644 --- a/Engine/source/gui/controls/guiTreeViewCtrl.cpp +++ b/Engine/source/gui/controls/guiTreeViewCtrl.cpp @@ -1237,7 +1237,7 @@ void GuiTreeViewCtrl::buildVisibleTree(bool bForceFullUpdate) bForceFullUpdate = true; // Update the flags. - mFlags.set(RebuildVisible); + mFlags.clear(RebuildVisible); // build the root items Item *traverse = mRoot; @@ -1785,6 +1785,8 @@ bool GuiTreeViewCtrl::onWake() // make sure it's big enough for both bitmap AND font... mItemHeight = getMax((S32)mFont->getHeight(), (S32)mProfile->mBitmapArrayRects[0].extent.y); } + + mFlags.set(RebuildVisible); return true; } From 2ec5af703c313a384950f569963f92b7cdc3af3a Mon Sep 17 00:00:00 2001 From: Vincent Gee Date: Tue, 4 Nov 2014 07:13:07 -0500 Subject: [PATCH 03/75] Fixed Return value from false to 0 (which is U32) --- Engine/source/math/mPlaneSet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/math/mPlaneSet.h b/Engine/source/math/mPlaneSet.h index abeebd4dc..8d0a919bb 100644 --- a/Engine/source/math/mPlaneSet.h +++ b/Engine/source/math/mPlaneSet.h @@ -458,7 +458,7 @@ U32 PlaneSet< T >::clipPolygon( const Point3F* inVertices, U32 inNumVertices, Po // to indicate we haven't clipped anything. if( !numClippedPolygonVertices ) - return false; + return 0; // On first iteration, replace the inVertices with the // outVertices buffer. From ad4b06f2bcd0ffc96fc9360855e5ce3bdc4c0d3c Mon Sep 17 00:00:00 2001 From: Vincent Gee Date: Tue, 4 Nov 2014 07:15:36 -0500 Subject: [PATCH 04/75] Cleaned up Enum to set init value to 0 --- Engine/source/platform/nativeDialogs/msgBox.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/source/platform/nativeDialogs/msgBox.h b/Engine/source/platform/nativeDialogs/msgBox.h index 9c210a417..06c5e27c2 100644 --- a/Engine/source/platform/nativeDialogs/msgBox.h +++ b/Engine/source/platform/nativeDialogs/msgBox.h @@ -32,7 +32,7 @@ enum MBButtons { - MBOk, + MBOk = 0, MBOkCancel, MBRetryCancel, MBSaveDontSave, @@ -41,7 +41,7 @@ enum MBButtons enum MBIcons { - MIWarning, + MIWarning = 0, MIInformation, MIQuestion, MIStop, From 8538b5fdbfad8b9509339c925c8541bc0ef09e6a Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Wed, 5 Nov 2014 21:17:12 +1100 Subject: [PATCH 05/75] Little optimization in mPlane, originally by Winterleaf --- Engine/source/math/mPlane.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Engine/source/math/mPlane.h b/Engine/source/math/mPlane.h index cb83788e1..a67d5c60b 100644 --- a/Engine/source/math/mPlane.h +++ b/Engine/source/math/mPlane.h @@ -383,9 +383,10 @@ inline PlaneF::Side PlaneF::whichSide( const OrientedBox3F& obb ) const // Project the box onto the line defined by the plane center and normal. // See "3D Game Engine Design" chapter 4.3.2. - const F32 r = obb.getHalfExtents().x * mFabs( mDot( obb.getAxis( 0 ), *this ) ) + - obb.getHalfExtents().y * mFabs( mDot( obb.getAxis( 1 ), *this ) ) + - obb.getHalfExtents().z * mFabs( mDot( obb.getAxis( 2 ), *this ) ); + Point3F mObbHalf = obb.getHalfExtents(); + const F32 r = mObbHalf.x * mFabs( mDot( obb.getAxis( 0 ), *this ) ) + + mObbHalf.y * mFabs( mDot( obb.getAxis( 1 ), *this ) ) + + mObbHalf.z * mFabs( mDot( obb.getAxis( 2 ), *this ) ); const F32 dist = distToPlane( obb.getCenter() ); if( dist > r ) From 22b8fe894fae9b4325e3f59e87d2e32619351166 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Mon, 18 Aug 2014 08:19:45 +1000 Subject: [PATCH 06/75] Implemented physics collision for MeshRoad. According to deepscratch's post in the forum: http://www.garagegames.com/community/forums/viewthread/130181/1#comment-826897 --- Engine/source/environment/meshRoad.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Engine/source/environment/meshRoad.cpp b/Engine/source/environment/meshRoad.cpp index 6a5e3fbd1..453250568 100644 --- a/Engine/source/environment/meshRoad.cpp +++ b/Engine/source/environment/meshRoad.cpp @@ -49,6 +49,7 @@ #include "collision/concretePolyList.h" #include "T3D/physics/physicsPlugin.h" #include "T3D/physics/physicsBody.h" +#include "T3D/physics/physicsCollision.h" #include "environment/nodeListManager.h" #define MIN_METERS_PER_SEGMENT 1.0f @@ -1722,6 +1723,8 @@ void MeshRoad::_generateSlices() void MeshRoad::_generateSegments() { + SAFE_DELETE( mPhysicsRep ); + mSegments.clear(); for ( U32 i = 0; i < mSlices.size() - 1; i++ ) @@ -1736,8 +1739,22 @@ void MeshRoad::_generateSegments() if ( PHYSICSMGR ) { - SAFE_DELETE( mPhysicsRep ); - //mPhysicsRep = PHYSICSMGR->createBody(); + ConcretePolyList polylist; + if ( buildPolyList( PLC_Collision, &polylist, getWorldBox(), getWorldSphere() ) ) + { + polylist.triangulate(); + + PhysicsCollision *colShape = PHYSICSMGR->createCollision(); + colShape->addTriangleMesh( polylist.mVertexList.address(), + polylist.mVertexList.size(), + polylist.mIndexList.address(), + polylist.mIndexList.size() / 3, + MatrixF::Identity ); + + PhysicsWorld *world = PHYSICSMGR->getWorld( isServerObject() ? "server" : "client" ); + mPhysicsRep = PHYSICSMGR->createBody(); + mPhysicsRep->init( colShape, 0, 0, this, world ); + } } } From 11c70262c4d846451eb08d37f765a0b4503af51f Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Wed, 26 Nov 2014 14:20:11 +1100 Subject: [PATCH 07/75] Fix #741 Local variable was used incorrectly. Did not result in any bugs, just a small amount of unnecessary network traffic. --- Engine/source/T3D/fx/explosion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/T3D/fx/explosion.cpp b/Engine/source/T3D/fx/explosion.cpp index f23400232..2468dd181 100644 --- a/Engine/source/T3D/fx/explosion.cpp +++ b/Engine/source/T3D/fx/explosion.cpp @@ -606,7 +606,7 @@ void ExplosionData::packData(BitStream* stream) } U32 count; for(count = 0; count < EC_NUM_TIME_KEYS; count++) - if(times[i] >= 1) + if(times[count] >= 1) break; count++; if(count > EC_NUM_TIME_KEYS) From 0213fc4a34125539d372dcdf2593fa0a795bdf62 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Wed, 26 Nov 2014 14:48:29 +1100 Subject: [PATCH 08/75] Fix #258 No harm in it, and we can close the issue now. --- Engine/source/T3D/gameFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/T3D/gameFunctions.cpp b/Engine/source/T3D/gameFunctions.cpp index e16acf1ec..d92a0259e 100644 --- a/Engine/source/T3D/gameFunctions.cpp +++ b/Engine/source/T3D/gameFunctions.cpp @@ -239,7 +239,7 @@ void GameUpdateCameraFov() F32 delta = time - sLastCameraUpdateTime; // snap zoom? - if((sZoomSpeed == 0) || (delta <= 0.f)) + if((sZoomSpeed == 0) || (delta <= 0.0f)) sCameraFov = sTargetFov; else { From 911aaddf7d7a86f2d8677632b0d838c273af8880 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Fri, 28 Nov 2014 01:51:46 -0600 Subject: [PATCH 09/75] firstPersonShadows: follows up on https://github.com/GarageGames/Torque3D/commit/88bb577c82cd55be15b5db481558b3df7daa8066#diff-b8335f02a980665dd7dc953db7a637ca from way back when, and adds the script to turn on first person showing player shadows --- Templates/Full/game/art/datablocks/player.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Templates/Full/game/art/datablocks/player.cs b/Templates/Full/game/art/datablocks/player.cs index 27933628c..e920b3cce 100644 --- a/Templates/Full/game/art/datablocks/player.cs +++ b/Templates/Full/game/art/datablocks/player.cs @@ -482,7 +482,7 @@ datablock DebrisData( PlayerDebris ) datablock PlayerData(DefaultPlayerData) { renderFirstPerson = false; - + firstPersonShadows = true; computeCRC = false; // Third person shape From c00bca8ba044c0d0fd283c96838702de19122980 Mon Sep 17 00:00:00 2001 From: Vincent Gee Date: Mon, 1 Dec 2014 13:06:27 -0500 Subject: [PATCH 10/75] Z Offset for Scattersky to fix the rendering issue at high altitudes. --- Engine/source/environment/scatterSky.cpp | 24 ++++++++++++++++-------- Engine/source/environment/scatterSky.h | 1 + 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Engine/source/environment/scatterSky.cpp b/Engine/source/environment/scatterSky.cpp index ed5f8d3ad..68ff65341 100644 --- a/Engine/source/environment/scatterSky.cpp +++ b/Engine/source/environment/scatterSky.cpp @@ -136,6 +136,7 @@ ScatterSky::ScatterSky() mExposure = 1.0f; mNightInterpolant = 0; + mZOffset = 0.0f; mShader = NULL; @@ -313,7 +314,7 @@ void ScatterSky::setElevation( F32 elevation ) void ScatterSky::inspectPostApply() { mDirty = true; - setMaskBits( 0xFFFFFFFF ); + setMaskBits( 0xFFFFFFFF ); } void ScatterSky::initPersistFields() @@ -327,10 +328,10 @@ void ScatterSky::initPersistFields() addField( "sunSize", TypeF32, Offset( mSunSize, ScatterSky ), "Affects the size of the sun's disk." ); - addField( "colorizeAmount", TypeF32, Offset( mColorizeAmt, ScatterSky ), + addField( "colorizeAmount", TypeF32, Offset( mColorizeAmt, ScatterSky ), "Controls how much the the alpha component of colorize brigthens the sky. Setting to 0 returns default behavior." ); - addField( "colorize", TypeColorF, Offset( mColorize, ScatterSky ), + addField( "colorize", TypeColorF, Offset( mColorize, ScatterSky ), "Tints the sky the color specified, the alpha controls the brigthness. The brightness is multipled by the value of colorizeAmt." ); addField( "rayleighScattering", TypeF32, Offset( mRayleighScattering, ScatterSky ), @@ -350,6 +351,9 @@ void ScatterSky::initPersistFields() addField( "exposure", TypeF32, Offset( mExposure, ScatterSky ), "Controls the contrast of the sky and sun during daytime." ); + addField( "zOffset", TypeF32, Offset( mZOffset, ScatterSky ), + "Offsets the scatterSky to avoid canvas rendering. Use 5000 or greater for the initial adjustment" ); + endGroup( "ScatterSky" ); addGroup( "Orbit" ); @@ -473,11 +477,13 @@ U32 ScatterSky::packUpdate(NetConnection *con, U32 mask, BitStream *stream) stream->write( mAmbientScale ); stream->write( mSunScale ); stream->write( mFogScale ); - stream->write( mColorizeAmt ); + stream->write( mColorizeAmt ); stream->write( mColorize ); stream->write( mExposure ); + stream->write( mZOffset ); + stream->write( mBrightness ); stream->writeFlag( mCastShadows ); @@ -556,7 +562,7 @@ void ScatterSky::unpackUpdate(NetConnection *con, BitStream *stream) stream->read( &mAmbientScale ); stream->read( &mSunScale ); stream->read( &mFogScale ); - F32 colorizeAmt; + F32 colorizeAmt; stream->read( &colorizeAmt ); if(mColorizeAmt != colorizeAmt) { @@ -577,6 +583,8 @@ void ScatterSky::unpackUpdate(NetConnection *con, BitStream *stream) stream->read( &mExposure ); + stream->read( &mZOffset ); + stream->read( &mBrightness ); mCastShadows = stream->readFlag(); @@ -706,7 +714,7 @@ bool ScatterSky::_initShader() Con::warnf( "ScatterSky::_initShader - failed to locate ScatterSkySBData!" ); else mStateBlock = GFX->createStateBlock( data->getState() ); - } + } if ( !mStateBlock ) return false; @@ -937,7 +945,7 @@ void ScatterSky::_render( ObjectRenderInst *ri, SceneRenderState *state, BaseMat Point3F camPos2 = state->getCameraPosition(); MatrixF xfm(true); - xfm.setPosition(camPos2);//-Point3F( 0, 0, 200000.0f)); + xfm.setPosition(camPos2 - Point3F( 0, 0, mZOffset)); GFX->multWorld(xfm); MatrixF xform(proj);//GFX->getProjectionMatrix()); xform *= GFX->getViewMatrix(); @@ -979,7 +987,7 @@ void ScatterSky::_render( ObjectRenderInst *ri, SceneRenderState *state, BaseMat mShaderConsts->setSafe( mUseCubemapSC, 0.0f ); } - GFX->setPrimitiveBuffer( mPrimBuffer ); + GFX->setPrimitiveBuffer( mPrimBuffer ); GFX->setVertexBuffer( mVB ); GFX->drawIndexedPrimitive( GFXTriangleList, 0, 0, mVertCount, 0, mPrimCount ); diff --git a/Engine/source/environment/scatterSky.h b/Engine/source/environment/scatterSky.h index 2ce581ad3..66177851d 100644 --- a/Engine/source/environment/scatterSky.h +++ b/Engine/source/environment/scatterSky.h @@ -179,6 +179,7 @@ protected: F32 mExposure; F32 mNightInterpolant; + F32 mZOffset; VectorF mLightDir; VectorF mSunDir; From e71c64e56404f877decc452a460f2e93fb36e2c1 Mon Sep 17 00:00:00 2001 From: Vincent Gee Date: Mon, 1 Dec 2014 17:21:17 -0500 Subject: [PATCH 11/75] fixed spacing --- Engine/source/environment/scatterSky.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Engine/source/environment/scatterSky.cpp b/Engine/source/environment/scatterSky.cpp index 68ff65341..425c356cc 100644 --- a/Engine/source/environment/scatterSky.cpp +++ b/Engine/source/environment/scatterSky.cpp @@ -325,13 +325,13 @@ void ScatterSky::initPersistFields() addField( "skyBrightness", TypeF32, Offset( mSkyBrightness, ScatterSky ), "Global brightness and intensity applied to the sky and objects in the level." ); - addField( "sunSize", TypeF32, Offset( mSunSize, ScatterSky ), + addField( "sunSize", TypeF32, Offset( mSunSize, ScatterSky ), "Affects the size of the sun's disk." ); - addField( "colorizeAmount", TypeF32, Offset( mColorizeAmt, ScatterSky ), + addField( "colorizeAmount", TypeF32, Offset( mColorizeAmt, ScatterSky ), "Controls how much the the alpha component of colorize brigthens the sky. Setting to 0 returns default behavior." ); - addField( "colorize", TypeColorF, Offset( mColorize, ScatterSky ), + addField( "colorize", TypeColorF, Offset( mColorize, ScatterSky ), "Tints the sky the color specified, the alpha controls the brigthness. The brightness is multipled by the value of colorizeAmt." ); addField( "rayleighScattering", TypeF32, Offset( mRayleighScattering, ScatterSky ), @@ -351,7 +351,7 @@ void ScatterSky::initPersistFields() addField( "exposure", TypeF32, Offset( mExposure, ScatterSky ), "Controls the contrast of the sky and sun during daytime." ); - addField( "zOffset", TypeF32, Offset( mZOffset, ScatterSky ), + addField( "zOffset", TypeF32, Offset( mZOffset, ScatterSky ), "Offsets the scatterSky to avoid canvas rendering. Use 5000 or greater for the initial adjustment" ); endGroup( "ScatterSky" ); @@ -477,12 +477,12 @@ U32 ScatterSky::packUpdate(NetConnection *con, U32 mask, BitStream *stream) stream->write( mAmbientScale ); stream->write( mSunScale ); stream->write( mFogScale ); - stream->write( mColorizeAmt ); + stream->write( mColorizeAmt ); stream->write( mColorize ); stream->write( mExposure ); - stream->write( mZOffset ); + stream->write( mZOffset ); stream->write( mBrightness ); @@ -562,7 +562,7 @@ void ScatterSky::unpackUpdate(NetConnection *con, BitStream *stream) stream->read( &mAmbientScale ); stream->read( &mSunScale ); stream->read( &mFogScale ); - F32 colorizeAmt; + F32 colorizeAmt; stream->read( &colorizeAmt ); if(mColorizeAmt != colorizeAmt) { @@ -583,7 +583,7 @@ void ScatterSky::unpackUpdate(NetConnection *con, BitStream *stream) stream->read( &mExposure ); - stream->read( &mZOffset ); + stream->read( &mZOffset ); stream->read( &mBrightness ); From 8c5d5f9f0610ddb0d102b510581170f147397950 Mon Sep 17 00:00:00 2001 From: Vincent Gee Date: Mon, 1 Dec 2014 17:22:35 -0500 Subject: [PATCH 12/75] more spacing --- Engine/source/environment/scatterSky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/environment/scatterSky.cpp b/Engine/source/environment/scatterSky.cpp index 425c356cc..4155ce7ac 100644 --- a/Engine/source/environment/scatterSky.cpp +++ b/Engine/source/environment/scatterSky.cpp @@ -351,7 +351,7 @@ void ScatterSky::initPersistFields() addField( "exposure", TypeF32, Offset( mExposure, ScatterSky ), "Controls the contrast of the sky and sun during daytime." ); - addField( "zOffset", TypeF32, Offset( mZOffset, ScatterSky ), + addField( "zOffset", TypeF32, Offset( mZOffset, ScatterSky ), "Offsets the scatterSky to avoid canvas rendering. Use 5000 or greater for the initial adjustment" ); endGroup( "ScatterSky" ); From 8ac10e42b0d07ccdd0be81a96517632aaf72c9f9 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Fri, 5 Dec 2014 05:00:09 -0600 Subject: [PATCH 13/75] checkInFoV correction requested: https://github.com/GarageGames/Torque3D/issues/1009 crosscheck vs https://github.com/GarageGames/Torque3D/blob/69838bdc8c9bc055b9b1ae76f42b0f28d2a33909/Engine/source/T3D/fps/guiShapeNameHud.cpp#L177-L240 upon which that was based. --- Engine/source/T3D/aiPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/T3D/aiPlayer.cpp b/Engine/source/T3D/aiPlayer.cpp index 31ada9970..9b7fd775a 100644 --- a/Engine/source/T3D/aiPlayer.cpp +++ b/Engine/source/T3D/aiPlayer.cpp @@ -703,7 +703,7 @@ bool AIPlayer::checkInFoV(GameBase* target, F32 camFov, bool _checkEnabled) // projection and box test. shapeDir.normalize(); F32 dot = mDot(shapeDir, camDir); - return (dot > camFov); + return (dot > mCos(camFov)); } DefineEngineMethod(AIPlayer, checkInFoV, bool, (ShapeBase* obj, F32 fov, bool checkEnabled), (NULL, 45.0f, false), From ac58fa96b0791e3251973dc28c67cf48629effad Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Sat, 6 Dec 2014 12:03:32 +1100 Subject: [PATCH 14/75] Look for datablock property, and provide a default. --- Templates/Full/game/scripts/server/aiPlayer.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Templates/Full/game/scripts/server/aiPlayer.cs b/Templates/Full/game/scripts/server/aiPlayer.cs index b9f5a66a6..70d7a2453 100644 --- a/Templates/Full/game/scripts/server/aiPlayer.cs +++ b/Templates/Full/game/scripts/server/aiPlayer.cs @@ -212,7 +212,10 @@ function AIPlayer::singleShot(%this) // The shooting delay is used to pulse the trigger %this.setImageTrigger(0, true); %this.setImageTrigger(0, false); - %this.trigger = %this.schedule(%this.shootingDelay, singleShot); + %delay = %this.getDataBlock().shootingDelay; + if (%delay $= "") + %delay = 1000; + %this.trigger = %this.schedule(%delay, singleShot); } //----------------------------------------------------------------------------- From 04df62ebe55354a4f6cdb822033ed5320e7e025e Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Sun, 7 Dec 2014 17:14:37 +1100 Subject: [PATCH 15/75] AIPlayer trigger fix as in #1007. --- Engine/source/T3D/aiPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/T3D/aiPlayer.cpp b/Engine/source/T3D/aiPlayer.cpp index 31ada9970..884096693 100644 --- a/Engine/source/T3D/aiPlayer.cpp +++ b/Engine/source/T3D/aiPlayer.cpp @@ -438,7 +438,7 @@ bool AIPlayer::getAIMove(Move *movePtr) // Replicate the trigger state into the move so that // triggers can be controlled from scripts. - for( S32 i = 0; i < MaxTriggerKeys; i++ ) + for( U32 i = 0; i < MaxMountedImages; i++ ) movePtr->trigger[i] = getImageTriggerState(i); mLastLocation = location; From 9622f93d05a599cab47142a0b7f7e0bca2b5c3d9 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Sun, 7 Dec 2014 20:59:17 +1100 Subject: [PATCH 16/75] Fix weapon image camera shake. --- Engine/source/T3D/shapeBase.cpp | 43 +--------- Engine/source/T3D/shapeBase.h | 9 +- Engine/source/T3D/shapeImage.cpp | 85 +++++++++++++++++-- .../Full/game/art/datablocks/weapons/Ryder.cs | 7 +- 4 files changed, 90 insertions(+), 54 deletions(-) diff --git a/Engine/source/T3D/shapeBase.cpp b/Engine/source/T3D/shapeBase.cpp index fc0f76998..b6ba1d96a 100644 --- a/Engine/source/T3D/shapeBase.cpp +++ b/Engine/source/T3D/shapeBase.cpp @@ -940,8 +940,6 @@ ShapeBase::ShapeBase() for (i = 0; i < MaxTriggerKeys; i++) mTrigger[i] = false; - - mWeaponCamShake = NULL; } @@ -1063,15 +1061,7 @@ void ShapeBase::onRemove() if ( isClientObject() ) { - mCubeReflector.unregisterReflector(); - - if ( mWeaponCamShake ) - { - if ( mWeaponCamShake->isAdded ) - gCamFXMgr.removeFX( mWeaponCamShake ); - - SAFE_DELETE( mWeaponCamShake ); - } + mCubeReflector.unregisterReflector(); } } @@ -3161,40 +3151,9 @@ void ShapeBase::unpackUpdate(NetConnection *con, BitStream *stream) { if ( imageData->lightType == ShapeBaseImageData::WeaponFireLight ) image.lightStart = Sim::getCurrentTime(); - - // HACK: Only works properly if you are in control - // of the one and only shapeBase object in the scene - // which fires an image that uses camera shake. - if ( imageData->shakeCamera ) - { - if ( !mWeaponCamShake ) - { - mWeaponCamShake = new CameraShake(); - mWeaponCamShake->remoteControlled = true; - } - - mWeaponCamShake->init(); - mWeaponCamShake->setFrequency( imageData->camShakeFreq ); - mWeaponCamShake->setAmplitude( imageData->camShakeAmp ); - - if ( !mWeaponCamShake->isAdded ) - { - gCamFXMgr.addFX( mWeaponCamShake ); - mWeaponCamShake->isAdded = true; - } - } } updateImageState(i,0); - - if ( !image.triggerDown && !image.altTriggerDown ) - { - if ( mWeaponCamShake && mWeaponCamShake->isAdded ) - { - gCamFXMgr.removeFX( mWeaponCamShake ); - mWeaponCamShake->isAdded = false; - } - } } else { diff --git a/Engine/source/T3D/shapeBase.h b/Engine/source/T3D/shapeBase.h index a46a41580..55499a8e7 100644 --- a/Engine/source/T3D/shapeBase.h +++ b/Engine/source/T3D/shapeBase.h @@ -324,7 +324,10 @@ struct ShapeBaseImageData: public GameBaseData { /// @{ bool shakeCamera; VectorF camShakeFreq; - VectorF camShakeAmp; + VectorF camShakeAmp; + F32 camShakeDuration; + F32 camShakeRadius; + F32 camShakeFalloff; /// @} /// Maximum number of sounds this image can play at a time. @@ -903,9 +906,6 @@ protected: bool mFlipFadeVal; - /// Camera shake caused by weapon fire. - CameraShake *mWeaponCamShake; - public: /// @name Collision Notification @@ -1101,6 +1101,7 @@ protected: virtual void onImageAnimThreadChange(U32 imageSlot, S32 imageShapeIndex, ShapeBaseImageData::StateData* lastState, const char* anim, F32 pos, F32 timeScale, bool reset=false); virtual void onImageAnimThreadUpdate(U32 imageSlot, S32 imageShapeIndex, F32 dt); virtual void ejectShellCasing( U32 imageSlot ); + virtual void shakeCamera( U32 imageSlot ); virtual void updateDamageLevel(); virtual void updateDamageState(); virtual void onImpact(SceneObject* obj, VectorF vec); diff --git a/Engine/source/T3D/shapeImage.cpp b/Engine/source/T3D/shapeImage.cpp index 548984ca8..e9859e3de 100644 --- a/Engine/source/T3D/shapeImage.cpp +++ b/Engine/source/T3D/shapeImage.cpp @@ -44,6 +44,7 @@ #include "sfx/sfxTypes.h" #include "scene/sceneManager.h" #include "core/stream/fileStream.h" +#include "T3D/fx/cameraFXMgr.h" //---------------------------------------------------------------------------- @@ -297,6 +298,9 @@ ShapeBaseImageData::ShapeBaseImageData() shakeCamera = false; camShakeFreq = Point3F::Zero; camShakeAmp = Point3F::Zero; + camShakeDuration = 1.5f; + camShakeRadius = 3.0f; + camShakeFalloff = 10.0f; } ShapeBaseImageData::~ShapeBaseImageData() @@ -739,10 +743,7 @@ void ShapeBaseImageData::initPersistFields() "@see lightType"); addField( "shakeCamera", TypeBool, Offset(shakeCamera, ShapeBaseImageData), - "@brief Flag indicating whether the camera should shake when this Image fires.\n\n" - "@note Camera shake only works properly if the player is in control of " - "the one and only shapeBase object in the scene which fires an Image that " - "uses camera shake." ); + "@brief Flag indicating whether the camera should shake when this Image fires.\n\n" ); addField( "camShakeFreq", TypePoint3F, Offset(camShakeFreq, ShapeBaseImageData), "@brief Frequency of the camera shaking effect.\n\n" @@ -752,6 +753,16 @@ void ShapeBaseImageData::initPersistFields() "@brief Amplitude of the camera shaking effect.\n\n" "@see shakeCamera" ); + addField( "camShakeDuration", TypeF32, Offset(camShakeDuration, ShapeBaseImageData), + "Duration (in seconds) to shake the camera." ); + + addField( "camShakeRadius", TypeF32, Offset(camShakeRadius, ShapeBaseImageData), + "Radial distance that a camera's position must be within relative to the " + "center of the explosion to be shaken." ); + + addField( "camShakeFalloff", TypeF32, Offset(camShakeFalloff, ShapeBaseImageData), + "Falloff value for the camera shake." ); + addField( "casing", TYPEID< DebrisData >(), Offset(casing, ShapeBaseImageData), "@brief DebrisData datablock to use for ejected casings.\n\n" "@see stateEjectShell" ); @@ -1028,6 +1039,9 @@ void ShapeBaseImageData::packData(BitStream* stream) { mathWrite( *stream, camShakeFreq ); mathWrite( *stream, camShakeAmp ); + stream->write( camShakeDuration ); + stream->write( camShakeRadius ); + stream->write( camShakeFalloff ); } mathWrite( *stream, shellExitDir ); @@ -1208,7 +1222,10 @@ void ShapeBaseImageData::unpackData(BitStream* stream) if ( shakeCamera ) { mathRead( *stream, &camShakeFreq ); - mathRead( *stream, &camShakeAmp ); + mathRead( *stream, &camShakeAmp ); + stream->read( &camShakeDuration ); + stream->read( &camShakeRadius ); + stream->read( &camShakeFalloff ); } mathRead( *stream, &shellExitDir ); @@ -2596,6 +2613,10 @@ void ShapeBase::setImageState(U32 imageSlot, U32 newState,bool force) ejectShellCasing( imageSlot ); } + // Shake camera on client. + if (isGhost() && nextStateData.fire && image.dataBlock->shakeCamera) { + shakeCamera( imageSlot ); + } // Server must animate the shape if it is a firestate... if (isServerObject() && (image.dataBlock->state[newState].fire || image.dataBlock->state[newState].altFire)) @@ -3342,3 +3363,57 @@ void ShapeBase::ejectShellCasing( U32 imageSlot ) casing->init( shellPos, shellVel ); } + +void ShapeBase::shakeCamera( U32 imageSlot ) +{ + MountedImage& image = mMountedImageList[imageSlot]; + ShapeBaseImageData* imageData = image.dataBlock; + + if (!imageData->shakeCamera) + return; + + // Warning: this logic was duplicated from Explosion. + + // first check if explosion is near camera + GameConnection* connection = GameConnection::getConnectionToServer(); + ShapeBase *obj = dynamic_cast(connection->getControlObject()); + + bool applyShake = true; + + if (obj) + { + ShapeBase* cObj = obj; + while ((cObj = cObj->getControlObject()) != 0) + { + if (cObj->useObjsEyePoint()) + { + applyShake = false; + break; + } + } + } + + if (applyShake && obj) + { + VectorF diff; + getMuzzlePoint(imageSlot, &diff); + diff = obj->getPosition() - diff; + F32 dist = diff.len(); + if (dist < imageData->camShakeRadius) + { + CameraShake *camShake = new CameraShake; + camShake->setDuration(imageData->camShakeDuration); + camShake->setFrequency(imageData->camShakeFreq); + + F32 falloff = dist / imageData->camShakeRadius; + falloff = 1.0f + falloff * 10.0f; + falloff = 1.0f / (falloff * falloff); + + VectorF shakeAmp = imageData->camShakeAmp * falloff; + camShake->setAmplitude(shakeAmp); + camShake->setFalloff(imageData->camShakeFalloff); + camShake->init(); + gCamFXMgr.addFX(camShake); + } + } +} \ No newline at end of file diff --git a/Templates/Full/game/art/datablocks/weapons/Ryder.cs b/Templates/Full/game/art/datablocks/weapons/Ryder.cs index a94bfa8d6..7e0436aa0 100644 --- a/Templates/Full/game/art/datablocks/weapons/Ryder.cs +++ b/Templates/Full/game/art/datablocks/weapons/Ryder.cs @@ -192,9 +192,9 @@ datablock ShapeBaseImageData(RyderWeaponImage) lightBrightness = 2; // Shake camera while firing. - shakeCamera = false; - camShakeFreq = "0 0 0"; - camShakeAmp = "0 0 0"; + shakeCamera = "1"; + camShakeFreq = "10 10 10"; + camShakeAmp = "5 5 5"; // Images have a state system which controls how the animations // are run, which sounds are played, script callbacks, etc. This @@ -361,4 +361,5 @@ datablock ShapeBaseImageData(RyderWeaponImage) stateSequenceTransitionOut[13] = true; stateAllowImageChange[13] = false; stateSequence[13] = "sprint"; + camShakeDuration = "0.2"; }; From 190f68b998415bf57fb0008821d3cbfce83d67d6 Mon Sep 17 00:00:00 2001 From: LuisAntonRebollo Date: Mon, 8 Dec 2014 23:31:22 +0100 Subject: [PATCH 17/75] Fix SkatterSky flare occlusion. --- Engine/source/T3D/lightFlareData.cpp | 64 ++++++++---------- Engine/source/T3D/lightFlareData.h | 8 ++- Engine/source/environment/scatterSky.cpp | 5 ++ .../source/gfx/D3D9/gfxD3D9OcclusionQuery.cpp | 1 + Engine/source/gfx/gfxOcclusionQuery.h | 67 +++++++++++++++++++ 5 files changed, 105 insertions(+), 40 deletions(-) diff --git a/Engine/source/T3D/lightFlareData.cpp b/Engine/source/T3D/lightFlareData.cpp index 8cbad24fc..50c2b069b 100644 --- a/Engine/source/T3D/lightFlareData.cpp +++ b/Engine/source/T3D/lightFlareData.cpp @@ -26,16 +26,18 @@ #include "core/stream/bitStream.h" #include "console/engineAPI.h" #include "lighting/lightInfo.h" +#include "lighting/lightQuery.h" #include "math/mathUtils.h" #include "math/mathIO.h" #include "scene/sceneRenderState.h" #include "gfx/gfxOcclusionQuery.h" #include "gfx/gfxDrawUtil.h" +#include "gfx/gfxTextureManager.h" #include "renderInstance/renderPassManager.h" #include "T3D/gameBase/gameConnection.h" #include "T3D/gameBase/processList.h" #include "collision/collision.h" - +#include "lighting/lightManager.h" const U32 LightFlareData::LosMask = STATIC_COLLISION_TYPEMASK | ShapeBaseObjectType | @@ -45,8 +47,6 @@ const U32 LightFlareData::LosMask = STATIC_COLLISION_TYPEMASK | LightFlareState::~LightFlareState() { - delete occlusionQuery; - delete fullPixelQuery; } void LightFlareState::clear() @@ -59,8 +59,6 @@ void LightFlareState::clear() lightInfo = NULL; worldRadius = -1.0f; occlusion = -1.0f; - occlusionQuery = NULL; - fullPixelQuery = NULL; } Point3F LightFlareData::sBasePoints[] = @@ -296,47 +294,39 @@ bool LightFlareData::_testVisibility(const SceneRenderState *state, LightFlareSt // for one-shot initialization of LightFlareState if ( useOcclusionQuery ) { - if ( flareState->occlusionQuery == NULL ) - flareState->occlusionQuery = GFX->createOcclusionQuery(); - if ( flareState->fullPixelQuery == NULL ) - flareState->fullPixelQuery = GFX->createOcclusionQuery(); - // Always treat light as onscreen if using HOQ // it will be faded out if offscreen anyway. onScreen = true; - - // NOTE: These queries frame lock us as we block to get the - // results. This is ok as long as long as we're not too GPU - // bound... else we waste CPU time here waiting for it when - // we could have been doing other CPU work instead. + needsRaycast = false; // Test the hardware queries for rendered pixels. U32 pixels = 0, fullPixels = 0; - GFXOcclusionQuery::OcclusionQueryStatus status = flareState->occlusionQuery->getStatus( true, &pixels ); - flareState->fullPixelQuery->getStatus( true, &fullPixels ); - if ( status != GFXOcclusionQuery::Occluded && fullPixels != 0 ) + GFXOcclusionQuery::OcclusionQueryStatus status; + flareState->occlusionQuery.getLastStatus( false, &status, &pixels ); + flareState->fullPixelQuery.getLastStatus( false, NULL, &fullPixels ); + + if ( status == GFXOcclusionQuery::NotOccluded && fullPixels != 0 ) *outOcclusionFade = mClampF( (F32)pixels / (F32)fullPixels, 0.0f, 1.0f ); - // If we got a result then we don't need to fallback to the raycast. - if ( status != GFXOcclusionQuery::Unset ) - needsRaycast = false; - - // Setup the new queries. - RenderPassManager *rpm = state->getRenderPass(); - OccluderRenderInst *ri = rpm->allocInst(); - ri->type = RenderPassManager::RIT_Occluder; - ri->query = flareState->occlusionQuery; - ri->query2 = flareState->fullPixelQuery; - ri->isSphere = true; - ri->position = lightPos; - if ( isVectorLight && flareState->worldRadius > 0.0f ) - ri->scale.set( flareState->worldRadius ); - else - ri->scale.set( mOcclusionRadius ); - ri->orientation = rpm->allocUniqueXform( lightInfo->getTransform() ); + if( !flareState->occlusionQuery.isWaiting() ) + { + // Setup the new queries. + RenderPassManager *rpm = state->getRenderPass(); + OccluderRenderInst *ri = rpm->allocInst(); + ri->type = RenderPassManager::RIT_Occluder; + ri->query = flareState->occlusionQuery.getQuery(); + ri->query2 = flareState->fullPixelQuery.getQuery(); + ri->isSphere = true; + ri->position = lightPos; + if ( isVectorLight && flareState->worldRadius > 0.0f ) + ri->scale.set( flareState->worldRadius ); + else + ri->scale.set( mOcclusionRadius ); + ri->orientation = rpm->allocUniqueXform( lightInfo->getTransform() ); - // Submit the queries. - state->getRenderPass()->addInst( ri ); + // Submit the queries. + state->getRenderPass()->addInst( ri ); + } } const Point3F &camPos = state->getCameraPosition(); diff --git a/Engine/source/T3D/lightFlareData.h b/Engine/source/T3D/lightFlareData.h index a450d4e56..333bf1bf5 100644 --- a/Engine/source/T3D/lightFlareData.h +++ b/Engine/source/T3D/lightFlareData.h @@ -41,12 +41,14 @@ #ifndef _GFXSTATEBLOCK_H_ #include "gfx/gfxStateBlock.h" #endif +#ifndef _GFXOCCLUSIONQUERY_H_ +#include "gfx/gfxOcclusionQuery.h" +#endif class LightInfo; struct ObjectRenderInst; class SceneRenderState; class BaseMatInstance; -class GFXOcclusionQuery; struct LightFlareState { @@ -65,8 +67,8 @@ struct LightFlareState bool visible; F32 occlusion; GFXVertexBufferHandle vertBuffer; - GFXOcclusionQuery *occlusionQuery; - GFXOcclusionQuery *fullPixelQuery; + GFXOcclusionQueryHandle occlusionQuery; + GFXOcclusionQueryHandle fullPixelQuery; }; class LightFlareData : public SimDataBlock diff --git a/Engine/source/environment/scatterSky.cpp b/Engine/source/environment/scatterSky.cpp index ed5f8d3ad..a9d187c89 100644 --- a/Engine/source/environment/scatterSky.cpp +++ b/Engine/source/environment/scatterSky.cpp @@ -658,6 +658,11 @@ void ScatterSky::prepRenderImage( SceneRenderState *state ) mFlareState.lightMat.identity(); mFlareState.lightMat.setPosition( lightPos ); + F32 dist = ( lightPos - state->getCameraPosition( ) ).len( ); + F32 coronaScale = 0.5f; + F32 screenRadius = GFX->getViewport( ).extent.y * coronaScale * 0.5f; + mFlareState.worldRadius = screenRadius * dist / state->getWorldToScreenScale( ).y; + mFlareData->prepRender( state, &mFlareState ); } diff --git a/Engine/source/gfx/D3D9/gfxD3D9OcclusionQuery.cpp b/Engine/source/gfx/D3D9/gfxD3D9OcclusionQuery.cpp index 99e664652..8d36776ca 100644 --- a/Engine/source/gfx/D3D9/gfxD3D9OcclusionQuery.cpp +++ b/Engine/source/gfx/D3D9/gfxD3D9OcclusionQuery.cpp @@ -130,6 +130,7 @@ GFXD3D9OcclusionQuery::OcclusionQueryStatus GFXD3D9OcclusionQuery::getStatus( bo //If we're stalled out, proceed with worst-case scenario -BJR if(GFX->mFrameTime->getElapsedMs()>4) { + this->begin(); this->end(); return NotOccluded; } diff --git a/Engine/source/gfx/gfxOcclusionQuery.h b/Engine/source/gfx/gfxOcclusionQuery.h index 9bf87c46d..ac6b0bf07 100644 --- a/Engine/source/gfx/gfxOcclusionQuery.h +++ b/Engine/source/gfx/gfxOcclusionQuery.h @@ -82,4 +82,71 @@ public: virtual const String describeSelf() const = 0; }; +/// Handle for GFXOcclusionQuery than store last valid state +class GFXOcclusionQueryHandle +{ +public: + + GFXOcclusionQueryHandle() + : mLastStatus(GFXOcclusionQuery::Unset), mLastData(0), mQuery(NULL), mWaiting(false) + {} + + ~GFXOcclusionQueryHandle() + { + SAFE_DELETE(mQuery); + } + + bool getLastStatus( bool block, GFXOcclusionQuery::OcclusionQueryStatus *statusPtr = NULL, U32 *data = NULL ); + GFXOcclusionQuery* getQuery() const { return mQuery; } + + void clearLastStatus() + { + mLastStatus = GFXOcclusionQuery::Unset; + mLastData = 0; + mWaiting = false; + + if( !mQuery ) + return; + + mQuery->begin(); + mQuery->end(); + } + + bool isWaiting() const { return mWaiting; } +protected: + GFXOcclusionQuery::OcclusionQueryStatus mLastStatus; + U32 mLastData; + bool mWaiting; + GFXOcclusionQuery *mQuery; +}; + +inline bool GFXOcclusionQueryHandle::getLastStatus( bool block, GFXOcclusionQuery::OcclusionQueryStatus *statusPtr, U32 *data ) +{ + if( !mQuery ) + mQuery = GFX->createOcclusionQuery(); + + GFXOcclusionQuery::OcclusionQueryStatus status = mQuery->getStatus( block, data ); + + if( status == GFXOcclusionQuery::Waiting ) + { + mWaiting = true; + if( statusPtr ) + *statusPtr = mLastStatus; + if( data ) + *data = mLastData; + + return true; + } + + if( statusPtr ) + *statusPtr = status; + + mWaiting = false; + mLastStatus = status; + mLastData = *data; + + return true; +} + + #endif // _GFXOCCLUSIONQUERY_H_ \ No newline at end of file From b0efd865d9821f0e1b998f7d2257743786d15f67 Mon Sep 17 00:00:00 2001 From: LuisAntonRebollo Date: Tue, 9 Dec 2014 12:38:28 +0100 Subject: [PATCH 18/75] Use factor of ambient light with camera direction for allow normals on shadowed surfaces. --- Templates/Empty/game/shaders/common/lighting.hlsl | 1 + .../game/shaders/common/lighting/advanced/vectorLightP.hlsl | 2 +- Templates/Full/game/shaders/common/lighting.hlsl | 1 + .../game/shaders/common/lighting/advanced/vectorLightP.hlsl | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Templates/Empty/game/shaders/common/lighting.hlsl b/Templates/Empty/game/shaders/common/lighting.hlsl index fc8470b7d..ec8129e94 100644 --- a/Templates/Empty/game/shaders/common/lighting.hlsl +++ b/Templates/Empty/game/shaders/common/lighting.hlsl @@ -36,6 +36,7 @@ uniform float4 inLightColor[4]; #endif uniform float4 ambient; +#define ambientCameraFactor 0.3 uniform float specularPower; uniform float4 specularColor; diff --git a/Templates/Empty/game/shaders/common/lighting/advanced/vectorLightP.hlsl b/Templates/Empty/game/shaders/common/lighting/advanced/vectorLightP.hlsl index 5ddb5586b..266cc6438 100644 --- a/Templates/Empty/game/shaders/common/lighting/advanced/vectorLightP.hlsl +++ b/Templates/Empty/game/shaders/common/lighting/advanced/vectorLightP.hlsl @@ -202,7 +202,7 @@ float4 main( FarFrustumQuadConnectP IN, float Sat_NL_Att = saturate( dotNL * shadowed ) * lightBrightness; float3 lightColorOut = lightMapParams.rgb * lightColor.rgb; - float4 addToResult = lightAmbient; + float4 addToResult = (lightAmbient * (1 - ambientCameraFactor)) + ( lightAmbient * ambientCameraFactor * saturate(dot(normalize(-IN.vsEyeRay), normal)) ); // TODO: This needs to be removed when lightmapping is disabled // as its extra work per-pixel on dynamic lit scenes. diff --git a/Templates/Full/game/shaders/common/lighting.hlsl b/Templates/Full/game/shaders/common/lighting.hlsl index fc8470b7d..ec8129e94 100644 --- a/Templates/Full/game/shaders/common/lighting.hlsl +++ b/Templates/Full/game/shaders/common/lighting.hlsl @@ -36,6 +36,7 @@ uniform float4 inLightColor[4]; #endif uniform float4 ambient; +#define ambientCameraFactor 0.3 uniform float specularPower; uniform float4 specularColor; diff --git a/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl index 5ddb5586b..266cc6438 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl @@ -202,7 +202,7 @@ float4 main( FarFrustumQuadConnectP IN, float Sat_NL_Att = saturate( dotNL * shadowed ) * lightBrightness; float3 lightColorOut = lightMapParams.rgb * lightColor.rgb; - float4 addToResult = lightAmbient; + float4 addToResult = (lightAmbient * (1 - ambientCameraFactor)) + ( lightAmbient * ambientCameraFactor * saturate(dot(normalize(-IN.vsEyeRay), normal)) ); // TODO: This needs to be removed when lightmapping is disabled // as its extra work per-pixel on dynamic lit scenes. From 6f975dd14a00320ea8a66ec650c0e31e9982c6b5 Mon Sep 17 00:00:00 2001 From: LuisAntonRebollo Date: Wed, 10 Dec 2014 22:13:23 +0100 Subject: [PATCH 19/75] Fix a crash when change a material reclect cubemap. --- Engine/source/materials/processedMaterial.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/materials/processedMaterial.h b/Engine/source/materials/processedMaterial.h index b72422cf9..97b267466 100644 --- a/Engine/source/materials/processedMaterial.h +++ b/Engine/source/materials/processedMaterial.h @@ -73,7 +73,7 @@ public: /// The cubemap to use when the texture type is /// set to Material::Cube. /// @see mTexType - GFXCubemap *mCubeMap; + GFXCubemapHandle mCubeMap; U32 mNumTex; From 93fdcdecbebe57d5edfc82b1d88a428c21c39d44 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Thu, 11 Dec 2014 12:30:48 +1100 Subject: [PATCH 20/75] Compare to cosine of angle, not angle. --- Engine/source/T3D/fps/guiShapeNameHud.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Engine/source/T3D/fps/guiShapeNameHud.cpp b/Engine/source/T3D/fps/guiShapeNameHud.cpp index 9ec1afac4..0609bbd0e 100644 --- a/Engine/source/T3D/fps/guiShapeNameHud.cpp +++ b/Engine/source/T3D/fps/guiShapeNameHud.cpp @@ -182,9 +182,9 @@ void GuiShapeNameHud::onRender( Point2I, const RectI &updateRect) cam.getColumn(3, &camPos); cam.getColumn(1, &camDir); - F32 camFov; - conn->getControlCameraFov(&camFov); - camFov = mDegToRad(camFov) / 2; + F32 camFovCos; + conn->getControlCameraFov(&camFovCos); + camFovCos = mCos(mDegToRad(camFovCos) / 2); // Visible distance info & name fading F32 visDistance = gClientSceneGraph->getVisibleDistance(); @@ -236,7 +236,7 @@ void GuiShapeNameHud::onRender( Point2I, const RectI &updateRect) // projection and box test. shapeDir.normalize(); F32 dot = mDot(shapeDir, camDir); - if (dot < camFov) + if (dot < camFovCos) continue; // Test to see if it's behind something, and we want to From 81e7dafb945ceb4c6009a35c629b022a78b296fa Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Fri, 7 Nov 2014 10:23:16 -0500 Subject: [PATCH 21/75] Fix delete of malloc'ed memory --- Engine/source/console/consoleInternal.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/source/console/consoleInternal.cpp b/Engine/source/console/consoleInternal.cpp index f8f4eb046..fc27b4ff7 100644 --- a/Engine/source/console/consoleInternal.cpp +++ b/Engine/source/console/consoleInternal.cpp @@ -880,7 +880,7 @@ void Namespace::Entry::clear() // Clean up usage strings generated for script functions. if( ( mType == Namespace::Entry::ConsoleFunctionType ) && mUsage ) { - delete mUsage; + dFree(mUsage); mUsage = NULL; } } @@ -906,7 +906,7 @@ Namespace::~Namespace() clearEntries(); if( mUsage && mCleanUpUsage ) { - delete mUsage; + dFree(mUsage); mUsage = NULL; mCleanUpUsage = false; } From 2fc1ac48161fc72fdd11471b424db56652057c1b Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Fri, 7 Nov 2014 10:25:10 -0500 Subject: [PATCH 22/75] Fix uninit vars in gui --- Engine/source/gui/containers/guiRolloutCtrl.cpp | 5 +++++ Engine/source/gui/containers/guiScrollCtrl.cpp | 5 +++-- Engine/source/gui/containers/guiWindowCtrl.cpp | 2 +- Engine/source/gui/core/guiCanvas.cpp | 3 +++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Engine/source/gui/containers/guiRolloutCtrl.cpp b/Engine/source/gui/containers/guiRolloutCtrl.cpp index 9044a1aaf..919846b66 100644 --- a/Engine/source/gui/containers/guiRolloutCtrl.cpp +++ b/Engine/source/gui/containers/guiRolloutCtrl.cpp @@ -56,6 +56,10 @@ IMPLEMENT_CALLBACK( GuiRolloutCtrl, onCollapsed, void, (), (), //----------------------------------------------------------------------------- GuiRolloutCtrl::GuiRolloutCtrl() + : mHeader(0,0,0,0), + mExpanded(0,0,0,0), + mChildRect(0,0,0,0), + mMargin(0,0,0,0) { mExpanded.set(0,0,200,60); mCaption = StringTable->EmptyString(); @@ -70,6 +74,7 @@ GuiRolloutCtrl::GuiRolloutCtrl() mIsContainer = true; mCanCollapse = true; mAutoCollapseSiblings = false; + mHasTexture = false; // Make sure we receive our ticks. setProcessTicks(); } diff --git a/Engine/source/gui/containers/guiScrollCtrl.cpp b/Engine/source/gui/containers/guiScrollCtrl.cpp index c32e9e2a6..91e86a770 100644 --- a/Engine/source/gui/containers/guiScrollCtrl.cpp +++ b/Engine/source/gui/containers/guiScrollCtrl.cpp @@ -72,8 +72,9 @@ GuiScrollCtrl::GuiScrollCtrl() mAnimating( false ), mScrollAnimSpeed( -1 ), mScrollTargetPos( -1, -1 ), - mChildExt(0, 0), - mChildPos(0, 0) + mChildExt(0, 0), + mChildPos(0, 0), + mBaseThumbSize(0) { mIsContainer = true; setExtent(200,200); diff --git a/Engine/source/gui/containers/guiWindowCtrl.cpp b/Engine/source/gui/containers/guiWindowCtrl.cpp index 0132a75d6..e98c07652 100644 --- a/Engine/source/gui/containers/guiWindowCtrl.cpp +++ b/Engine/source/gui/containers/guiWindowCtrl.cpp @@ -98,10 +98,10 @@ GuiWindowCtrl::GuiWindowCtrl() mMouseMovingWin = false; mMouseResizeWidth = false; mMouseResizeHeight = false; - setExtent(100, 200); mMinimizeIndex = -1; mTabIndex = -1; mBitmapBounds = NULL; + setExtent(100, 200); RectI closeRect(80, 2, 16, 16); mCloseButton = closeRect; diff --git a/Engine/source/gui/core/guiCanvas.cpp b/Engine/source/gui/core/guiCanvas.cpp index ef7bf3630..6e3a5a3a7 100644 --- a/Engine/source/gui/core/guiCanvas.cpp +++ b/Engine/source/gui/core/guiCanvas.cpp @@ -94,9 +94,11 @@ extern InputModifiers convertModifierBits(const U32 in); //----------------------------------------------------------------------------- GuiCanvas::GuiCanvas(): GuiControl(), + mCurUpdateRect(0, 0, 0, 0), mCursorEnabled(true), mForceMouseToGUI(false), mAlwaysHandleMouseButtons(false), + mCursorChanged(0), mClampTorqueCursor(true), mShowCursor(true), mLastCursorEnabled(false), @@ -120,6 +122,7 @@ GuiCanvas::GuiCanvas(): GuiControl(), mLeftMouseLast(false), mMiddleMouseLast(false), mRightMouseLast(false), + mMouseDownPoint(0.0f,0.0f), mPlatformWindow(NULL), mLastRenderMs(0), mDisplayWindow(true) From d4b4320f45226eb0ca076f13630e00925cee951c Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Fri, 7 Nov 2014 10:28:01 -0500 Subject: [PATCH 23/75] More uninitialized variables --- Engine/source/sfx/openal/sfxALDevice.cpp | 3 ++- Engine/source/windowManager/platformWindow.h | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Engine/source/sfx/openal/sfxALDevice.cpp b/Engine/source/sfx/openal/sfxALDevice.cpp index f2e00356c..66929876b 100644 --- a/Engine/source/sfx/openal/sfxALDevice.cpp +++ b/Engine/source/sfx/openal/sfxALDevice.cpp @@ -35,7 +35,8 @@ SFXALDevice::SFXALDevice( SFXProvider *provider, : Parent( name, provider, useHardware, maxBuffers ), mOpenAL( openal ), mDevice( NULL ), - mContext( NULL ) + mContext( NULL ), + mRolloffFactor( 1.0f ) { mMaxBuffers = getMax( maxBuffers, 8 ); diff --git a/Engine/source/windowManager/platformWindow.h b/Engine/source/windowManager/platformWindow.h index 680e8b12b..e2af67c42 100644 --- a/Engine/source/windowManager/platformWindow.h +++ b/Engine/source/windowManager/platformWindow.h @@ -98,17 +98,17 @@ protected: { mIsBackground = false; // This could be toggled to true to prefer performance. mMinimumSize.set(0,0); - mLockedSize.set(0,0); - mResizeLocked = false; + mLockedSize.set(0,0); + mResizeLocked = false; mEnableKeyboardTranslation = false; mEnableAccelerators = true; mCursorController = NULL; - // This controller maps window input (Mouse/Keyboard) to a generic input consumer - mWindowInputGenerator = new WindowInputGenerator( this ); mSuppressReset = false; - mOffscreenRender = false; mDisplayWindow = false; + + // This controller maps window input (Mouse/Keyboard) to a generic input consumer + mWindowInputGenerator = new WindowInputGenerator( this ); } public: @@ -498,4 +498,4 @@ protected: virtual void _setFullscreen(const bool fullScreen) {}; }; -#endif \ No newline at end of file +#endif From a10e6e99d40721ea7cacab1c340f2d81b27770d4 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Mon, 10 Nov 2014 11:42:49 -0500 Subject: [PATCH 24/75] Fix read past end of array --- Engine/source/core/strings/unicode.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Engine/source/core/strings/unicode.cpp b/Engine/source/core/strings/unicode.cpp index b6c915e05..0dee6f3ef 100644 --- a/Engine/source/core/strings/unicode.cpp +++ b/Engine/source/core/strings/unicode.cpp @@ -601,10 +601,13 @@ bool chompUTF8BOM( const char *inString, char **outStringPtr ) { *outStringPtr = const_cast( inString ); - U8 bom[4]; - dMemcpy( bom, inString, 4 ); - - bool valid = isValidUTF8BOM( bom ); + bool valid = false; + if (inString[0] && inString[1] && inString[2]) + { + U8 bom[4]; + dMemcpy(bom, inString, 4); + valid = isValidUTF8BOM(bom); + } // This is hackey, but I am not sure the best way to do it at the present. // The only valid BOM is a UTF8 BOM, which is 3 bytes, even though we read From d97d44f66fa1d07caaa51e855c121d3016543300 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Mon, 10 Nov 2014 11:50:46 -0500 Subject: [PATCH 25/75] Fix more misc uninitialized vars --- Engine/source/T3D/gameBase/gameConnection.cpp | 2 ++ Engine/source/core/dnet.cpp | 1 + Engine/source/platformWin32/menus/popupMenuWin32.cpp | 4 ++-- Engine/source/sim/netConnection.cpp | 1 + Engine/source/util/settings.h | 5 ++++- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Engine/source/T3D/gameBase/gameConnection.cpp b/Engine/source/T3D/gameBase/gameConnection.cpp index 5888ec218..4c5eef912 100644 --- a/Engine/source/T3D/gameBase/gameConnection.cpp +++ b/Engine/source/T3D/gameBase/gameConnection.cpp @@ -208,6 +208,8 @@ GameConnection::GameConnection() mAIControlled = false; + mLastPacketTime = 0; + mDisconnectReason[0] = 0; //blackout vars diff --git a/Engine/source/core/dnet.cpp b/Engine/source/core/dnet.cpp index 324a9fcfd..b850bf5fd 100644 --- a/Engine/source/core/dnet.cpp +++ b/Engine/source/core/dnet.cpp @@ -66,6 +66,7 @@ ConnectionProtocol::ConnectionProtocol() mLastSendSeq = 0; // start sending at 1 mAckMask = 0; mLastRecvAckAck = 0; + mConnectionEstablished = false; } void ConnectionProtocol::buildSendPacketHeader(BitStream *stream, S32 packetType) { diff --git a/Engine/source/platformWin32/menus/popupMenuWin32.cpp b/Engine/source/platformWin32/menus/popupMenuWin32.cpp index f04ae1b58..883e2c0c3 100644 --- a/Engine/source/platformWin32/menus/popupMenuWin32.cpp +++ b/Engine/source/platformWin32/menus/popupMenuWin32.cpp @@ -158,7 +158,7 @@ void PopupMenu::createPlatformMenu() mData->mMenu = mIsPopup ? CreatePopupMenu() : CreateMenu(); AssertFatal(mData->mMenu, "Unable to create menu"); - MENUINFO mi; + MENUINFO mi = { 0 }; mi.cbSize = sizeof(mi); mi.fMask = MIM_MENUDATA; mi.dwMenuData = (ULONG_PTR)this; @@ -176,7 +176,7 @@ S32 PopupMenu::insertItem(S32 pos, const char *title, const char* accelerator) if(isAttached && pWindow == NULL) return -1; - MENUITEMINFOA mi; + MENUITEMINFOA mi = { 0 }; mi.cbSize = sizeof(mi); mi.fMask = MIIM_ID|MIIM_TYPE; mi.wID = (mData->mMenuID * PlatformPopupMenuData::PopupMenuIDRange) + mData->mLastID + 1; diff --git a/Engine/source/sim/netConnection.cpp b/Engine/source/sim/netConnection.cpp index a34265e48..e882ef869 100644 --- a/Engine/source/sim/netConnection.cpp +++ b/Engine/source/sim/netConnection.cpp @@ -351,6 +351,7 @@ void NetConnection::setNetClassGroup(U32 grp) } NetConnection::NetConnection() + : mNetAddress() { mTranslateStrings = false; mConnectSequence = 0; diff --git a/Engine/source/util/settings.h b/Engine/source/util/settings.h index 2438504ac..10fe2305c 100644 --- a/Engine/source/util/settings.h +++ b/Engine/source/util/settings.h @@ -78,7 +78,10 @@ public: String mValue; bool mIsGroup; - SettingSaveNode(){}; + SettingSaveNode() + { + mIsGroup = false; + } SettingSaveNode(const String &name, bool isGroup = false) { mName = name; From c50c88d071a6e4695fa2248c8e37665300437622 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Tue, 11 Nov 2014 15:14:47 -0500 Subject: [PATCH 26/75] Fix use-after-delete errors --- Engine/source/T3D/shapeImage.cpp | 4 ++-- Engine/source/ts/collada/colladaLights.cpp | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Engine/source/T3D/shapeImage.cpp b/Engine/source/T3D/shapeImage.cpp index 548984ca8..9a31a87c9 100644 --- a/Engine/source/T3D/shapeImage.cpp +++ b/Engine/source/T3D/shapeImage.cpp @@ -3339,6 +3339,6 @@ void ShapeBase::ejectShellCasing( U32 imageSlot ) if (!casing->registerObject()) delete casing; - - casing->init( shellPos, shellVel ); + else + casing->init( shellPos, shellVel ); } diff --git a/Engine/source/ts/collada/colladaLights.cpp b/Engine/source/ts/collada/colladaLights.cpp index b906ecd03..a1d22cd84 100644 --- a/Engine/source/ts/collada/colladaLights.cpp +++ b/Engine/source/ts/collada/colladaLights.cpp @@ -128,8 +128,7 @@ static void processNodeLights(AppNode* appNode, const MatrixF& offset, SimGroup* Con::errorf(ConsoleLogEntry::General, "Failed to register light for \"%s\"", lightName.c_str()); delete pLight; } - - if (group) + else if (group) group->addObject(pLight); } From 68b5e7b5176ea4733b689f42185d9091828cfb21 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Tue, 11 Nov 2014 15:15:11 -0500 Subject: [PATCH 27/75] Fix more use-after-delete errors --- Engine/source/environment/decalRoad.cpp | 4 ++-- Engine/source/environment/meshRoad.cpp | 2 +- Engine/source/environment/river.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Engine/source/environment/decalRoad.cpp b/Engine/source/environment/decalRoad.cpp index 7bd240095..3cde83149 100644 --- a/Engine/source/environment/decalRoad.cpp +++ b/Engine/source/environment/decalRoad.cpp @@ -155,8 +155,8 @@ void DecalRoadNodeEvent::padListToSize() newlist->mPositions.merge(list->mPositions); newlist->mWidths.merge(list->mWidths); - mNodeList = newlist; delete list; + mNodeList = list = newlist; } // Pad our list end? @@ -1726,4 +1726,4 @@ DefineEngineMethod( DecalRoad, postApply, void, (),, ) { object->inspectPostApply(); -} \ No newline at end of file +} diff --git a/Engine/source/environment/meshRoad.cpp b/Engine/source/environment/meshRoad.cpp index 453250568..1c6e7a693 100644 --- a/Engine/source/environment/meshRoad.cpp +++ b/Engine/source/environment/meshRoad.cpp @@ -203,8 +203,8 @@ void MeshRoadNodeEvent::padListToSize() newlist->mDepths.merge(list->mDepths); newlist->mNormals.merge(list->mNormals); - mNodeList = newlist; delete list; + mNodeList = list = newlist; } // Pad our list end? diff --git a/Engine/source/environment/river.cpp b/Engine/source/environment/river.cpp index 59a16230f..bf9b9671f 100644 --- a/Engine/source/environment/river.cpp +++ b/Engine/source/environment/river.cpp @@ -227,8 +227,8 @@ void RiverNodeEvent::padListToSize() newlist->mDepths.merge(list->mDepths); newlist->mNormals.merge(list->mNormals); - mNodeList = newlist; delete list; + mNodeList = list = newlist; } // Pad our list end? From dc780ddcae62f8d772bf972ab15a51d3b9434198 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Tue, 11 Nov 2014 15:15:55 -0500 Subject: [PATCH 28/75] Fix use-after-delete --- Engine/source/materials/materialList.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Engine/source/materials/materialList.cpp b/Engine/source/materials/materialList.cpp index fbeab64f3..afdba4f54 100644 --- a/Engine/source/materials/materialList.cpp +++ b/Engine/source/materials/materialList.cpp @@ -263,8 +263,6 @@ void MaterialList::clearMatInstList() if (mMatInstList[i]) { BaseMatInstance* current = mMatInstList[i]; - delete current; - mMatInstList[i] = NULL; // ok, since ts material lists can remap difference indexes to the same object // we need to make sure that we don't delete the same memory twice. walk the @@ -272,6 +270,9 @@ void MaterialList::clearMatInstList() for (U32 j=0; j Date: Tue, 11 Nov 2014 15:19:26 -0500 Subject: [PATCH 29/75] Replace obsolete calling convention --- Engine/source/main/main.cpp | 2 +- Engine/source/platformWin32/winWindow.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Engine/source/main/main.cpp b/Engine/source/main/main.cpp index 9728f37ec..f4c4d95e6 100644 --- a/Engine/source/main/main.cpp +++ b/Engine/source/main/main.cpp @@ -49,7 +49,7 @@ bool getDllName(std::wstring& dllName, const std::wstring suffix) return true; } -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCommandShow) +int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCommandShow) { // Try to find the game DLL, which may have one of several file names. HMODULE hGame = NULL; diff --git a/Engine/source/platformWin32/winWindow.cpp b/Engine/source/platformWin32/winWindow.cpp index 2546f2cbb..bc8e9e48c 100644 --- a/Engine/source/platformWin32/winWindow.cpp +++ b/Engine/source/platformWin32/winWindow.cpp @@ -313,7 +313,7 @@ S32 main(S32 argc, const char **argv) #include "app/mainLoop.h" -S32 PASCAL WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, S32) +S32 WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, S32) { Vector argv( __FILE__, __LINE__ ); @@ -619,4 +619,4 @@ ConsoleFunction( isKoreanBuild, bool, 1, 1, "isKoreanBuild()" ) } return( result ); -} \ No newline at end of file +} From 8518c85e8007212eab5081fedce8837f6f9e23f4 Mon Sep 17 00:00:00 2001 From: Areloch Date: Thu, 11 Dec 2014 22:17:55 -0600 Subject: [PATCH 30/75] PR for issue #748 --- Engine/source/console/simObject.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Engine/source/console/simObject.cpp b/Engine/source/console/simObject.cpp index 629542531..e38aa1e9d 100644 --- a/Engine/source/console/simObject.cpp +++ b/Engine/source/console/simObject.cpp @@ -1599,8 +1599,7 @@ void SimObject::unlinkNamespaces() // Handle object name. - StringTableEntry objectName = getName(); - if( objectName && objectName[ 0 ] ) + if (mNameSpace && mNameSpace->mClassRep == NULL) mNameSpace->decRefCountToParent(); mNameSpace = NULL; From fd186204a273340b509ffae2c12473b8c1e6fb08 Mon Sep 17 00:00:00 2001 From: Areloch Date: Sat, 13 Dec 2014 03:11:11 -0600 Subject: [PATCH 31/75] Fizes #945 --- Engine/source/T3D/player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/source/T3D/player.cpp b/Engine/source/T3D/player.cpp index 241be2c2f..944d5c1fa 100644 --- a/Engine/source/T3D/player.cpp +++ b/Engine/source/T3D/player.cpp @@ -6152,7 +6152,7 @@ U32 Player::packUpdate(NetConnection *con, U32 mask, BitStream *stream) stream->writeInt((S32)len, 13); } stream->writeFloat(mRot.z / M_2PI_F, 7); - stream->writeSignedFloat(mHead.x / mDataBlock->maxLookAngle, 6); + stream->writeSignedFloat(mHead.x / (mDataBlock->maxLookAngle - mDataBlock->minLookAngle), 6); stream->writeSignedFloat(mHead.z / mDataBlock->maxFreelookAngle, 6); delta.move.pack(stream); stream->writeFlag(!(mask & NoWarpMask)); @@ -6250,7 +6250,7 @@ void Player::unpackUpdate(NetConnection *con, BitStream *stream) rot.y = rot.x = 0.0f; rot.z = stream->readFloat(7) * M_2PI_F; - mHead.x = stream->readSignedFloat(6) * mDataBlock->maxLookAngle; + mHead.x = stream->readSignedFloat(6) * (mDataBlock->maxLookAngle - mDataBlock->minLookAngle); mHead.z = stream->readSignedFloat(6) * mDataBlock->maxFreelookAngle; delta.move.unpack(stream); From dd297d4dc02eb7f0ee1bd76544c4a3d7d089f0d7 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Tue, 11 Nov 2014 15:19:52 -0500 Subject: [PATCH 32/75] Fix buffer overflow --- Engine/source/platformWin32/winWindow.cpp | 26 ++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Engine/source/platformWin32/winWindow.cpp b/Engine/source/platformWin32/winWindow.cpp index bc8e9e48c..23f52074e 100644 --- a/Engine/source/platformWin32/winWindow.cpp +++ b/Engine/source/platformWin32/winWindow.cpp @@ -317,15 +317,16 @@ S32 WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, S32) { Vector argv( __FILE__, __LINE__ ); - char moduleName[256]; + enum { moduleNameSize = 256 }; + char moduleName[moduleNameSize]; #ifdef TORQUE_UNICODE { - TCHAR buf[ 256 ]; - GetModuleFileNameW( NULL, buf, sizeof( buf ) ); - convertUTF16toUTF8( buf, moduleName, sizeof( moduleName ) ); + TCHAR buf[ moduleNameSize ]; + GetModuleFileNameW( NULL, buf, moduleNameSize ); + convertUTF16toUTF8( buf, moduleName, moduleNameSize ); } #else - GetModuleFileNameA(NULL, moduleName, sizeof(moduleName)); + GetModuleFileNameA(NULL, moduleName, moduleNameSize); #endif argv.push_back(moduleName); @@ -394,15 +395,16 @@ S32 torque_winmain( HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, S32) { Vector argv( __FILE__, __LINE__ ); - char moduleName[256]; + enum { moduleNameSize = 256 }; + char moduleName[moduleNameSize]; #ifdef TORQUE_UNICODE - { - TCHAR buf[ 256 ]; - GetModuleFileNameW( NULL, buf, sizeof( buf ) ); - convertUTF16toUTF8( buf, moduleName, sizeof( moduleName ) ); -} + { + TCHAR buf[ moduleNameSize ]; + GetModuleFileNameW( NULL, buf, moduleNameSize ); + convertUTF16toUTF8( buf, moduleName, moduleNameSize ); + } #else - GetModuleFileNameA(NULL, moduleName, sizeof(moduleName)); + GetModuleFileNameA(NULL, moduleName, moduleNameSize); #endif argv.push_back(moduleName); From 50238fb2ace2f124dedc443f885dee7aa835aae3 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Tue, 18 Nov 2014 17:47:59 -0500 Subject: [PATCH 33/75] Casts are stronger than necessary --- Engine/source/core/util/str.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/source/core/util/str.cpp b/Engine/source/core/util/str.cpp index 36b0637de..d01af6279 100644 --- a/Engine/source/core/util/str.cpp +++ b/Engine/source/core/util/str.cpp @@ -491,7 +491,7 @@ ConsoleFunction( dumpStringMemStats, void, 1, 1, "()" void* String::StringData::operator new( size_t size, U32 len ) { AssertFatal( len != 0, "String::StringData::operator new() - string must not be empty" ); - StringData *str = reinterpret_cast( dMalloc( size + len * sizeof(StringChar) ) ); + StringData *str = static_cast( dMalloc( size + len * sizeof(StringChar) ) ); str->mLength = len; @@ -519,7 +519,7 @@ void String::StringData::operator delete(void *ptr) void* String::StringData::operator new( size_t size, U32 len, DataChunker& chunker ) { AssertFatal( len != 0, "String::StringData::operator new() - string must not be empty" ); - StringData *str = reinterpret_cast( chunker.alloc( size + len * sizeof(StringChar) ) ); + StringData *str = static_cast( chunker.alloc( size + len * sizeof(StringChar) ) ); str->mLength = len; From 98e79f3aec90728ab11f134907f2ffee3e714654 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Thu, 20 Nov 2014 00:35:56 -0500 Subject: [PATCH 34/75] Fix uninitialized member vars --- Engine/source/scene/reflectionManager.cpp | 3 ++- Engine/source/scene/reflector.cpp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Engine/source/scene/reflectionManager.cpp b/Engine/source/scene/reflectionManager.cpp index 2c86a700f..057c72c0a 100644 --- a/Engine/source/scene/reflectionManager.cpp +++ b/Engine/source/scene/reflectionManager.cpp @@ -83,7 +83,8 @@ F32 ReflectionManager::smRefractTexScale = 0.5f; ReflectionManager::ReflectionManager() : mUpdateRefract( true ), - mReflectFormat( GFXFormatR8G8B8A8 ) + mReflectFormat( GFXFormatR8G8B8A8 ), + mLastUpdateMs( 0 ) { mTimer = PlatformTimer::create(); diff --git a/Engine/source/scene/reflector.cpp b/Engine/source/scene/reflector.cpp index ab53c2bdd..a992456e2 100644 --- a/Engine/source/scene/reflector.cpp +++ b/Engine/source/scene/reflector.cpp @@ -179,6 +179,8 @@ ReflectorBase::ReflectorBase() mObject = NULL; mOcclusionQuery = GFX->createOcclusionQuery(); mQueryPending = false; + score = 0.0f; + lastUpdateMs = 0; } ReflectorBase::~ReflectorBase() From de7101dec2956785b3de98423058d28f12336f7d Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Thu, 20 Nov 2014 21:34:19 -0500 Subject: [PATCH 35/75] Fix mismatched free Memory was allocated with new on line 304 --- Engine/source/console/compiler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/console/compiler.cpp b/Engine/source/console/compiler.cpp index 49125389f..fd871c036 100644 --- a/Engine/source/console/compiler.cpp +++ b/Engine/source/console/compiler.cpp @@ -400,7 +400,7 @@ void CodeStream::reset() { CodeData *next = itr->next; dFree(itr->data); - dFree(itr); + delete(itr); itr = next; } From cadc390895c544770e7ede52dc11d3bea02cf490 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Thu, 20 Nov 2014 22:07:27 -0500 Subject: [PATCH 36/75] Fix leaked member var --- Engine/source/gfx/gfxDevice.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Engine/source/gfx/gfxDevice.cpp b/Engine/source/gfx/gfxDevice.cpp index 47f528d94..35d86d827 100644 --- a/Engine/source/gfx/gfxDevice.cpp +++ b/Engine/source/gfx/gfxDevice.cpp @@ -279,6 +279,7 @@ GFXDevice::~GFXDevice() #endif SAFE_DELETE( mTextureManager ); + SAFE_DELETE( mFrameTime ); // Clear out our state block references mCurrentStateBlocks.clear(); From 8d4679b2b762ba7bd48f54272f861675c5d57a60 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Thu, 11 Dec 2014 20:07:11 -0500 Subject: [PATCH 37/75] Fix potential buffer overflows --- Engine/source/main/main.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Engine/source/main/main.cpp b/Engine/source/main/main.cpp index f4c4d95e6..56bed4ceb 100644 --- a/Engine/source/main/main.cpp +++ b/Engine/source/main/main.cpp @@ -75,10 +75,11 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdL return -1; } + enum { errorSize = 4096 }; if (!hGame) { - wchar_t error[4096]; - _swprintf_l(error, sizeof(error), L"Unable to load game library: %s. Please make sure it exists and the latest DirectX is installed.", _get_current_locale(), dllName.c_str()); + wchar_t error[errorSize]; + _swprintf_l(error, errorSize, L"Unable to load game library: %s. Please make sure it exists and the latest DirectX is installed.", _get_current_locale(), dllName.c_str()); MessageBoxW(NULL, error, L"Error", MB_OK|MB_ICONWARNING); return -1; } @@ -86,8 +87,8 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdL torque_winmain = (int (*)(HINSTANCE hInstance, HINSTANCE h, LPSTR lpszCmdLine, int nShow))GetProcAddress(hGame, "torque_winmain"); if (!torque_winmain) { - wchar_t error[4096]; - _swprintf_l(error, sizeof(error), L"Missing torque_winmain export in game library: %s. Please make sure that it exists and the latest DirectX is installed.", _get_current_locale(), dllName.c_str()); + wchar_t error[errorSize]; + _swprintf_l(error, errorSize, L"Missing torque_winmain export in game library: %s. Please make sure that it exists and the latest DirectX is installed.", _get_current_locale(), dllName.c_str()); MessageBoxW(NULL, error, L"Error", MB_OK|MB_ICONWARNING); return -1; } From a3fab3d4c409fa522ddaf461e83a4a4f3435f335 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 22 Dec 2014 17:52:02 -0600 Subject: [PATCH 38/75] Projected Shadow fix With Permission from Jeff Faust. // AFX CODE BLOCK (bug-fix) << // For ShapeBase objects this causes the shader to fade along with the // object and also prevents a rectangular shadow artifact from occuring // once the visibility is zero. --- Engine/source/lighting/common/projectedShadow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Engine/source/lighting/common/projectedShadow.cpp b/Engine/source/lighting/common/projectedShadow.cpp index 8918ddf5a..1ad88cd10 100644 --- a/Engine/source/lighting/common/projectedShadow.cpp +++ b/Engine/source/lighting/common/projectedShadow.cpp @@ -230,6 +230,9 @@ bool ProjectedShadow::_updateDecal( const SceneRenderState *state ) lightCount++; } + if (mShapeBase) + fade *= mShapeBase->getFadeVal(); + lightDir.normalize(); // No light... no shadow. From a4adf28ef54c52235420d14bd2990b2c9a874cb0 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 22 Dec 2014 17:55:10 -0600 Subject: [PATCH 39/75] mVertexFormat validation fix With Permission from Jeff Faust. // AFX CODE BLOCK (bug-fix) << (no text, self evident) --- Engine/source/materials/matInstance.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Engine/source/materials/matInstance.cpp b/Engine/source/materials/matInstance.cpp index a61b75bf7..1a894f1a5 100644 --- a/Engine/source/materials/matInstance.cpp +++ b/Engine/source/materials/matInstance.cpp @@ -290,6 +290,12 @@ bool MatInstance::init( const FeatureSet &features, //---------------------------------------------------------------------------- bool MatInstance::reInit() { + if (!mVertexFormat) + { + mIsValid = false; + return mIsValid; + } + SAFE_DELETE(mProcessedMaterial); deleteAllHooks(); mIsValid = processMaterial(); From b2a4f3fd44e92d6172696e0c76be30659dada24f Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 22 Dec 2014 17:58:12 -0600 Subject: [PATCH 40/75] depth correction With Permission from Jeff Faust. // AFX CODE BLOCK (bug-fix) << // This fix prevents some bad rendering artifacts that occur at the edge of the visibleDistance. // The artifacts are most obvious when there is fog present. --- Engine/source/shaderGen/HLSL/depthHLSL.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Engine/source/shaderGen/HLSL/depthHLSL.cpp b/Engine/source/shaderGen/HLSL/depthHLSL.cpp index 9f5726a51..ecb23d676 100644 --- a/Engine/source/shaderGen/HLSL/depthHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/depthHLSL.cpp @@ -25,7 +25,7 @@ #include "materials/materialFeatureTypes.h" #include "materials/materialFeatureData.h" - +#include "terrain/terrFeatureTypes.h" void EyeSpaceDepthOutHLSL::processVert( Vector &componentList, const MaterialFeatureData &fd ) @@ -85,7 +85,12 @@ void EyeSpaceDepthOutHLSL::processPix( Vector &componentList, LangElement *depthOutDecl = new DecOp( depthOut ); meta->addStatement( new GenOp( "#ifndef CUBE_SHADOW_MAP\r\n" ) ); - meta->addStatement( new GenOp( " @ = dot(@, (@.xyz / @.w));\r\n", depthOutDecl, vEye, wsEyeVec, wsEyeVec ) ); + + if (fd.features.hasFeature(MFT_TerrainBaseMap)) + meta->addStatement(new GenOp(" @ =min(0.9999, dot(@, (@.xyz / @.w)));\r\n", depthOutDecl, vEye, wsEyeVec, wsEyeVec)); + else + meta->addStatement(new GenOp(" @ = dot(@, (@.xyz / @.w));\r\n", depthOutDecl, vEye, wsEyeVec, wsEyeVec)); + meta->addStatement( new GenOp( "#else\r\n" ) ); Var *farDist = (Var*)Var::find( "oneOverFarplane" ); From dbf9275037402bbd619d4c9e007445ee2d19fff7 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 22 Dec 2014 18:01:18 -0600 Subject: [PATCH 41/75] Ref Count Catch With Permission from Jeff Faust. // AFX CODE BLOCK (bug-fix) << // for events that are not GuaranteedOrdered we can get here w/o ever // incrementing ref-count on the event. --- Engine/source/sim/netEvent.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Engine/source/sim/netEvent.cpp b/Engine/source/sim/netEvent.cpp index 07b90f6ca..08707ea7f 100644 --- a/Engine/source/sim/netEvent.cpp +++ b/Engine/source/sim/netEvent.cpp @@ -344,6 +344,8 @@ void NetConnection::eventReadPacket(BitStream *bstream) if(unguaranteedPhase) { evt->process(this); + if (evt->getRefCount() == 0) + evt->incRef(); evt->decRef(); if(mErrorBuffer.isNotEmpty()) return; From c76b44bb91fb49fd7ebc09d34ccdc293d9776324 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 22 Dec 2014 18:03:52 -0600 Subject: [PATCH 42/75] Ref Count Catch With Permission from Jeff Faust. // AFX CODE BLOCK (bug-fix) << (no text, self evident) --- Engine/source/T3D/fx/particle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/source/T3D/fx/particle.cpp b/Engine/source/T3D/fx/particle.cpp index 5b794748e..bf9e987f8 100644 --- a/Engine/source/T3D/fx/particle.cpp +++ b/Engine/source/T3D/fx/particle.cpp @@ -355,7 +355,7 @@ bool ParticleData::protectedSetSizes( void *object, const char *index, const cha U32 i; if (!index) - i = 0; + return (val >= 0.f && val <= MaxParticleSize); else i = dAtoui(index); @@ -371,7 +371,7 @@ bool ParticleData::protectedSetTimes( void *object, const char *index, const cha U32 i; if (!index) - i = 0; + return (val >= 0.f && val <= 1.f); else i = dAtoui(index); From 8c979a6d7bdcafa28fabd6ffe0d3e7f0c44eef1d Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 22 Dec 2014 18:05:43 -0600 Subject: [PATCH 43/75] Oriented Particles UV Correction With Permission from Jeff Faust. // AFX CODE BLOCK (bug-fix) << // this fix re-orders the UV coords to produce a consistent orientation // with oriented particles in TGE. --- Engine/source/T3D/fx/particleEmitter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Engine/source/T3D/fx/particleEmitter.cpp b/Engine/source/T3D/fx/particleEmitter.cpp index b40148cea..4e4f9728b 100644 --- a/Engine/source/T3D/fx/particleEmitter.cpp +++ b/Engine/source/T3D/fx/particleEmitter.cpp @@ -1825,22 +1825,22 @@ void ParticleEmitter::setupOriented( Particle *part, lVerts->point = start + crossDir; lVerts->color = partCol; // Here and below, we copy UVs from particle datablock's texCoords (oriented) - lVerts->texCoord = part->dataBlock->texCoords[0]; + lVerts->texCoord = part->dataBlock->texCoords[1]; ++lVerts; lVerts->point = start - crossDir; lVerts->color = partCol; - lVerts->texCoord = part->dataBlock->texCoords[1]; + lVerts->texCoord = part->dataBlock->texCoords[2]; ++lVerts; lVerts->point = end - crossDir; lVerts->color = partCol; - lVerts->texCoord = part->dataBlock->texCoords[2]; + lVerts->texCoord = part->dataBlock->texCoords[3]; ++lVerts; lVerts->point = end + crossDir; lVerts->color = partCol; - lVerts->texCoord = part->dataBlock->texCoords[3]; + lVerts->texCoord = part->dataBlock->texCoords[0]; ++lVerts; } From dbd8c6b37b375eba00692a4dcb0a70f6b478a3ba Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 22 Dec 2014 18:08:05 -0600 Subject: [PATCH 44/75] Player Networking DIVNULL error correction With Permission from Jeff Faust. // AFX CODE BLOCK (bug-fix) << // avoids a divide-by-zero when maxEnergy is set to zero. --- Engine/source/T3D/player.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Engine/source/T3D/player.cpp b/Engine/source/T3D/player.cpp index 944d5c1fa..f9278e62b 100644 --- a/Engine/source/T3D/player.cpp +++ b/Engine/source/T3D/player.cpp @@ -6158,7 +6158,10 @@ U32 Player::packUpdate(NetConnection *con, U32 mask, BitStream *stream) stream->writeFlag(!(mask & NoWarpMask)); } // Ghost need energy to predict reliably - stream->writeFloat(getEnergyLevel() / mDataBlock->maxEnergy,EnergyLevelBits); + if (mDataBlock->maxEnergy > 0.f) + stream->writeFloat(getEnergyLevel() / mDataBlock->maxEnergy, EnergyLevelBits); + else + stream->writeFloat(0.f, EnergyLevelBits); return retMask; } From cd42424d61f4f305650773c67421cd5363c6decb Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Fri, 26 Dec 2014 11:41:19 +1100 Subject: [PATCH 45/75] Use a strong reference instead of more manual reference counting. --- Engine/source/sim/netEvent.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Engine/source/sim/netEvent.cpp b/Engine/source/sim/netEvent.cpp index 07b90f6ca..bd8dd9569 100644 --- a/Engine/source/sim/netEvent.cpp +++ b/Engine/source/sim/netEvent.cpp @@ -310,8 +310,8 @@ void NetConnection::eventReadPacket(BitStream *bstream) setLastError("Invalid packet. (bad event class id)"); return; } - NetEvent *evt = (NetEvent *) ConsoleObject::create(getNetClassGroup(), NetClassTypeEvent, classId); - if(!evt) + StrongRefPtr evt = (NetEvent *) ConsoleObject::create(getNetClassGroup(), NetClassTypeEvent, classId); + if(evt.isNull()) { setLastError("Invalid packet. (bad ghost class id)"); return; @@ -344,7 +344,7 @@ void NetConnection::eventReadPacket(BitStream *bstream) if(unguaranteedPhase) { evt->process(this); - evt->decRef(); + evt = NULL; if(mErrorBuffer.isNotEmpty()) return; continue; From 6ee81d94207dfa43da5c95779d963aacb23cf0e9 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Fri, 26 Dec 2014 13:04:53 -0600 Subject: [PATCH 46/75] Revert "Ref Count Catch" This reverts commit dbf9275037402bbd619d4c9e007445ee2d19fff7. --- Engine/source/sim/netEvent.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Engine/source/sim/netEvent.cpp b/Engine/source/sim/netEvent.cpp index 08707ea7f..07b90f6ca 100644 --- a/Engine/source/sim/netEvent.cpp +++ b/Engine/source/sim/netEvent.cpp @@ -344,8 +344,6 @@ void NetConnection::eventReadPacket(BitStream *bstream) if(unguaranteedPhase) { evt->process(this); - if (evt->getRefCount() == 0) - evt->incRef(); evt->decRef(); if(mErrorBuffer.isNotEmpty()) return; From 05b8fe4423504dfe9230a834f49f2d14745851af Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Mon, 29 Dec 2014 12:32:45 +1100 Subject: [PATCH 47/75] Bump version numbers. --- Engine/source/app/version.h | 4 ++-- README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Engine/source/app/version.h b/Engine/source/app/version.h index 9f68b2cbc..4a03f5ddc 100644 --- a/Engine/source/app/version.h +++ b/Engine/source/app/version.h @@ -41,10 +41,10 @@ /// code version, the game name, and which type of game it is (TGB, TGE, TGEA, etc.). /// /// Version number is major * 1000 + minor * 100 + revision * 10. -#define TORQUE_GAME_ENGINE 3620 +#define TORQUE_GAME_ENGINE 3630 /// Human readable engine version string. -#define TORQUE_GAME_ENGINE_VERSION_STRING "3.6.2" +#define TORQUE_GAME_ENGINE_VERSION_STRING "3.6.3" /// Gets the engine version number. The version number is specified as a global in version.cc U32 getVersionNumber(); diff --git a/README.md b/README.md index 5aed4b20a..1ef223d89 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Torque 3D v3.6.2 +Torque 3D v3.6.3 ================ MIT Licensed Open Source version of [Torque 3D](http://www.garagegames.com/products/torque-3d) from [GarageGames](http://www.garagegames.com) @@ -23,7 +23,7 @@ In addition to GitHub we also have a couple of pre-packaged files for you to dow * [Torque 3D 3.6 Full template](http://mit.garagegames.com/Torque3D-3-6-1-FullTemplate.zip), which contains precompiled binaries. * [Complete Torque 3D 3.6 zip package](http://mit.garagegames.com/Torque3D-3-6-1.zip) containing the contents of this repository. -* [Windows binaries for 3.6.2](https://github.com/GarageGames/Torque3D/releases/tag/v3.6.2) which you can drop into your existing script projects. +* [Windows binaries for 3.6.3](https://github.com/GarageGames/Torque3D/releases/tag/v3.6.3) which you can drop into your existing script projects. * [Torque 3D Project Manager v2.1](http://mit.garagegames.com/T3DProjectManager-2-1.zip) on its own for use in your T3D forks. If you're looking for an older release see the [Torque 3D Archive](https://github.com/GarageGames/Torque3D/wiki/Torque-3D-Archive) From 40b871e6528c212279a926df249b302bd8d623df Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Mon, 29 Dec 2014 16:44:16 +1100 Subject: [PATCH 48/75] Add profiling to StringTable. --- Engine/source/core/stringTable.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Engine/source/core/stringTable.cpp b/Engine/source/core/stringTable.cpp index 2340fd5af..9a71603ae 100644 --- a/Engine/source/core/stringTable.cpp +++ b/Engine/source/core/stringTable.cpp @@ -22,6 +22,7 @@ #include "core/strings/stringFunctions.h" #include "core/stringTable.h" +#include "platform/profiler.h" _StringTable *_gStringTable = NULL; const U32 _StringTable::csm_stInitSize = 29; @@ -121,6 +122,8 @@ void _StringTable::destroy() //-------------------------------------- StringTableEntry _StringTable::insert(const char* _val, const bool caseSens) { + PROFILE_SCOPE(StringTableInsert); + // Added 3/29/2007 -- If this is undesirable behavior, let me know -patw const char *val = _val; if( val == NULL ) @@ -165,6 +168,8 @@ StringTableEntry _StringTable::insertn(const char* src, S32 len, const bool cas //-------------------------------------- StringTableEntry _StringTable::lookup(const char* val, const bool caseSens) { + PROFILE_SCOPE(StringTableLookup); + Node **walk, *temp; U32 key = hashString(val); walk = &buckets[key % numBuckets]; @@ -181,6 +186,8 @@ StringTableEntry _StringTable::lookup(const char* val, const bool caseSens) //-------------------------------------- StringTableEntry _StringTable::lookupn(const char* val, S32 len, const bool caseSens) { + PROFILE_SCOPE(StringTableLookupN); + Node **walk, *temp; U32 key = hashStringn(val, len); walk = &buckets[key % numBuckets]; From 1204b81a78ec6658e38dc58456a714264fa38da3 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Mon, 29 Dec 2014 21:49:52 +1100 Subject: [PATCH 49/75] Added anomymous functions as in Konrad Kiss's resource. --- Engine/source/console/CMDgram.y | 13 +++++++++++++ Engine/source/console/ast.h | 4 +++- Engine/source/console/codeBlock.cpp | 17 +++++++++++++++++ Engine/source/console/console.cpp | 2 ++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Engine/source/console/CMDgram.y b/Engine/source/console/CMDgram.y index 06830b7dd..af0122e9b 100644 --- a/Engine/source/console/CMDgram.y +++ b/Engine/source/console/CMDgram.y @@ -456,6 +456,19 @@ expr { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, NULL); } | VAR '[' aidx_expr ']' { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, $3 ); } + | rwDEFINE '(' var_list_decl ')' '{' statement_list '}' + { + String fnname = String("__anonymous_function_" + String::ToString(gAnonFunctionID++)); + StringTableEntry afnName = StringTable->insert(fnname.c_str()); + StmtNode *fndef = FunctionDeclStmtNode::alloc($1.lineNumber, afnName, NULL, $3, $6); + + if(!gAnonFunctionList) + gAnonFunctionList = fndef; + else + gAnonFunctionList->append(fndef); + + $$ = StrConstNode::alloc( $1.lineNumber, (UTF8*)fnname.utf8(), false ); + } ; slot_acc diff --git a/Engine/source/console/ast.h b/Engine/source/console/ast.h index 5177cbaf0..f1327a75a 100644 --- a/Engine/source/console/ast.h +++ b/Engine/source/console/ast.h @@ -575,6 +575,8 @@ struct FunctionDeclStmtNode : StmtNode }; extern StmtNode *gStatementList; -extern ExprEvalState gEvalState;; +extern StmtNode *gAnonFunctionList; +extern U32 gAnonFunctionID; +extern ExprEvalState gEvalState; #endif diff --git a/Engine/source/console/codeBlock.cpp b/Engine/source/console/codeBlock.cpp index 3599ae15b..c8cd57223 100644 --- a/Engine/source/console/codeBlock.cpp +++ b/Engine/source/console/codeBlock.cpp @@ -468,6 +468,7 @@ bool CodeBlock::compile(const char *codeFileName, StringTableEntry fileName, con STEtoCode = compileSTEtoCode; gStatementList = NULL; + gAnonFunctionList = NULL; // Set up the parser. smCurrentParser = getParserForFile(fileName); @@ -477,6 +478,14 @@ bool CodeBlock::compile(const char *codeFileName, StringTableEntry fileName, con smCurrentParser->setScanBuffer(script, fileName); smCurrentParser->restart(NULL); smCurrentParser->parse(); + if (gStatementList) + { + if (gAnonFunctionList) + { + gStatementList->append(gAnonFunctionList); + } + } + if(gSyntaxError) { @@ -599,6 +608,7 @@ const char *CodeBlock::compileExec(StringTableEntry fileName, const char *inStri addToCodeList(); gStatementList = NULL; + gAnonFunctionList = NULL; // Set up the parser. smCurrentParser = getParserForFile(fileName); @@ -608,6 +618,13 @@ const char *CodeBlock::compileExec(StringTableEntry fileName, const char *inStri smCurrentParser->setScanBuffer(string, fileName); smCurrentParser->restart(NULL); smCurrentParser->parse(); + if (gStatementList) + { + if (gAnonFunctionList) + { + gStatementList->append(gAnonFunctionList); + } + } if(!gStatementList) { diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 18d32bed4..fb0232051 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -47,6 +47,8 @@ extern ConsoleValueStack CSTK; ConsoleDocFragment* ConsoleDocFragment::smFirst; ExprEvalState gEvalState; StmtNode *gStatementList; +StmtNode *gAnonFunctionList; +U32 gAnonFunctionID = 0; ConsoleConstructor *ConsoleConstructor::first = NULL; bool gWarnUndefinedScriptVariables; From 412247c40191b38c8d9e424eb4858affe86b8e01 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Mon, 29 Dec 2014 21:50:11 +1100 Subject: [PATCH 50/75] Regenerate lex/bison files. --- Engine/source/console/CMDscan.cpp | 1488 ++++---- Engine/source/console/cmdgram.cpp | 5236 ++++++++++++----------------- Engine/source/console/cmdgram.h | 280 +- 3 files changed, 2898 insertions(+), 4106 deletions(-) diff --git a/Engine/source/console/CMDscan.cpp b/Engine/source/console/CMDscan.cpp index 24f118d2d..28b4815f1 100644 --- a/Engine/source/console/CMDscan.cpp +++ b/Engine/source/console/CMDscan.cpp @@ -1,94 +1,51 @@ -#line 2 "CMDscan.cpp" - -#line 4 "CMDscan.cpp" - -#define YY_INT_ALIGNED short int +#define yy_create_buffer CMD_create_buffer +#define yy_delete_buffer CMD_delete_buffer +#define yy_scan_buffer CMD_scan_buffer +#define yy_scan_string CMD_scan_string +#define yy_scan_bytes CMD_scan_bytes +#define yy_flex_debug CMD_flex_debug +#define yy_init_buffer CMD_init_buffer +#define yy_flush_buffer CMD_flush_buffer +#define yy_load_buffer_state CMD_load_buffer_state +#define yy_switch_to_buffer CMD_switch_to_buffer +#define yyin CMDin +#define yyleng CMDleng +#define yylex CMDlex +#define yyout CMDout +#define yyrestart CMDrestart +#define yytext CMDtext +#define yywrap CMDwrap +#line 20 "CMDscan.cpp" /* A lexical scanner generated by flex */ +/* Scanner skeleton version: + * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.85 95/04/24 10:48:47 vern Exp $ + */ + #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 33 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ #include -#include -#include -#include -/* end standard C headers. */ -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif #endif -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; -#endif /* ! C99 */ - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#endif /* ! FLEXINT_H */ #ifdef __cplusplus +#include +//nclude + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST @@ -96,17 +53,34 @@ typedef unsigned int flex_uint32_t; #if __STDC__ +#define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + /* Returned upon end-of-file. */ #define YY_NULL 0 @@ -121,75 +95,70 @@ typedef unsigned int flex_uint32_t; * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ -#define BEGIN (yy_start) = 1 + 2 * +#define BEGIN yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ -#define YY_START (((yy_start) - 1) / 2) +#define YY_START ((yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE CMDrestart(CMDin ) +#define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ -#ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 -#endif -/* The state buf must be large enough to hold one state per character in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif -extern int CMDleng; - -extern FILE *CMDin, *CMDout; +extern int yyleng; +extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - #define YY_LESS_LINENO(n) - -/* Return all but the first "n" matched characters back to the input stream. */ +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + #define yyless(n) \ do \ { \ - /* Undo effects of setting up CMDtext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up CMDtext again */ \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) -#define unput(c) yyunput( c, (yytext_ptr) ) +#define unput(c) yyunput( c, yytext_ptr ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T typedef unsigned int yy_size_t; -#endif -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE + struct yy_buffer_state { FILE *yy_input_file; @@ -226,16 +195,12 @@ struct yy_buffer_state */ int yy_at_bol; - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; - #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process @@ -245,135 +210,99 @@ struct yy_buffer_state * possible backing-up. * * When we actually see the EOF, we change the status to "new" - * (via CMDrestart()), so that the user can continue scanning by - * just pointing CMDin at a new input file. + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +static YY_BUFFER_STATE yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". - * - * Returns the top of the stack, or NULL. */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) +#define YY_CURRENT_BUFFER yy_current_buffer -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] -/* yy_hold_char holds the character lost when CMDtext is formed. */ +/* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; + static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int CMDleng; + + +int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ +static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ -/* Flag which is used to allow CMDwrap()'s to do buffer switches - * instead of setting up a fresh CMDin. A bit of a hack ... +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; -void CMDrestart (FILE *input_file ); -void CMD_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE CMD_create_buffer (FILE *file,int size ); -void CMD_delete_buffer (YY_BUFFER_STATE b ); -void CMD_flush_buffer (YY_BUFFER_STATE b ); -void CMDpush_buffer_state (YY_BUFFER_STATE new_buffer ); -void CMDpop_buffer_state (void ); +void yyrestart YY_PROTO(( FILE *input_file )); -static void CMDensure_buffer_stack (void ); -static void CMD_load_buffer_state (void ); -static void CMD_init_buffer (YY_BUFFER_STATE b,FILE *file ); +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) -#define YY_FLUSH_BUFFER CMD_flush_buffer(YY_CURRENT_BUFFER ) +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); -YY_BUFFER_STATE CMD_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE CMD_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE CMD_scan_bytes (yyconst char *bytes,int len ); +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); -void *CMDalloc (yy_size_t ); -void *CMDrealloc (void *,yy_size_t ); -void CMDfree (void * ); - -#define yy_new_buffer CMD_create_buffer +#define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ - if ( ! YY_CURRENT_BUFFER ){ \ - CMDensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - CMD_create_buffer(CMDin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ - if ( ! YY_CURRENT_BUFFER ){\ - CMDensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - CMD_create_buffer(CMDin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ } -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) typedef unsigned char YY_CHAR; - -FILE *CMDin = (FILE *) 0, *CMDout = (FILE *) 0; - +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext -extern int CMDlineno; - -int CMDlineno = 1; - -extern char *CMDtext; -#define yytext_ptr CMDtext - -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); /* Done after the current pattern has been matched and before the - * corresponding action - sets up CMDtext. + * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - CMDleng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; + yy_c_buf_p = yy_cp; #define YY_NUM_RULES 94 #define YY_END_OF_BUFFER 95 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[233] = +static yyconst short int yy_accept[233] = { 0, 0, 0, 95, 93, 1, 5, 4, 51, 93, 93, 58, 57, 93, 41, 42, 45, 43, 56, 44, 50, @@ -403,7 +332,7 @@ static yyconst flex_int16_t yy_accept[233] = 77, 0 } ; -static yyconst flex_int32_t yy_ec[256] = +static yyconst int yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, @@ -435,7 +364,7 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[68] = +static yyconst int yy_meta[68] = { 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 4, @@ -446,7 +375,7 @@ static yyconst flex_int32_t yy_meta[68] = 7, 7, 7, 1, 1, 1, 1 } ; -static yyconst flex_int16_t yy_base[248] = +static yyconst short int yy_base[248] = { 0, 0, 0, 380, 381, 377, 381, 381, 61, 63, 51, 53, 65, 66, 381, 381, 354, 64, 381, 66, 60, @@ -477,7 +406,7 @@ static yyconst flex_int16_t yy_base[248] = 243, 250, 257, 264, 271, 278, 285 } ; -static yyconst flex_int16_t yy_def[248] = +static yyconst short int yy_def[248] = { 0, 232, 1, 232, 232, 232, 232, 232, 232, 233, 234, 234, 232, 235, 232, 232, 232, 232, 232, 232, 232, @@ -508,7 +437,7 @@ static yyconst flex_int16_t yy_def[248] = 232, 232, 232, 232, 232, 232, 232 } ; -static yyconst flex_int16_t yy_nxt[449] = +static yyconst short int yy_nxt[449] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, @@ -561,7 +490,7 @@ static yyconst flex_int16_t yy_nxt[449] = 232, 232, 232, 232, 232, 232, 232, 232 } ; -static yyconst flex_int16_t yy_chk[449] = +static yyconst short int yy_chk[449] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -617,18 +546,15 @@ static yyconst flex_int16_t yy_chk[449] = static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; -extern int CMD_flex_debug; -int CMD_flex_debug = 0; - /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *CMDtext; +char *yytext; #line 1 "CMDscan.l" +#define INITIAL 0 #line 2 "CMDscan.l" // flex --nounput -o CMDscan.cpp -P CMD CMDscan.l @@ -716,23 +642,7 @@ void CMDerror(char * s, ...); // Reset the parser. void CMDrestart(FILE *in); -#line 720 "CMDscan.cpp" - -#define INITIAL 0 - -#ifndef YY_NO_UNISTD_H -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned first. - * The user has a chance to override it with an option. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); +#line 646 "CMDscan.cpp" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -740,28 +650,61 @@ static int yy_init_globals (void ); #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int CMDwrap (void ); +extern "C" int yywrap YY_PROTO(( void )); #else -extern int CMDwrap (void ); +extern int yywrap YY_PROTO(( void )); #endif #endif +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + #ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); #endif #ifndef YY_NO_INPUT - #ifdef __cplusplus -static int yyinput (void ); +static int yyinput YY_PROTO(( void )); #else -static int input (void ); +static int input YY_PROTO(( void )); +#endif #endif +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif #endif /* Amount of stuff to slurp up with each read. */ @@ -770,11 +713,12 @@ static int input (void ); #endif /* Copy whatever the last rule matched to the standard output. */ + #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO (void) fwrite( CMDtext, CMDleng, 1, CMDout ) +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -782,35 +726,21 @@ static int input (void ); */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + if ( yy_current_buffer->yy_is_interactive ) \ { \ - int c = '*'; \ - size_t n; \ + int c = '*', n; \ for ( n = 0; n < max_size && \ - (c = getc( CMDin )) != EOF && c != '\n'; ++n ) \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ - if ( c == EOF && ferror( CMDin ) ) \ + if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, CMDin))==0 && ferror(CMDin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(CMDin); \ - } \ - }\ -\ - + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - @@ -831,20 +761,14 @@ static int input (void ); #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif -/* end tables serialization structures and prototypes */ - /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL -#define YY_DECL_IS_OURS 1 +#define YY_DECL int yylex YY_PROTO(( void )) +#endif -extern int CMDlex (void); - -#define YY_DECL int CMDlex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after CMDtext and CMDleng +/* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION @@ -859,66 +783,62 @@ extern int CMDlex (void); #define YY_RULE_SETUP \ YY_USER_ACTION -/** The main scanner function which does all the work. - */ YY_DECL -{ + { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; - + #line 105 "CMDscan.l" ; -#line 874 "CMDscan.cpp" +#line 796 "CMDscan.cpp" - if ( !(yy_init) ) + if ( yy_init ) { - (yy_init) = 1; + yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ + if ( ! yy_start ) + yy_start = 1; /* first start state */ - if ( ! CMDin ) - CMDin = stdin; + if ( ! yyin ) + yyin = stdin; - if ( ! CMDout ) - CMDout = stdout; + if ( ! yyout ) + yyout = stdout; - if ( ! YY_CURRENT_BUFFER ) { - CMDensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - CMD_create_buffer(CMDin,YY_BUF_SIZE ); - } + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); - CMD_load_buffer_state( ); + yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { - yy_cp = (yy_c_buf_p); + yy_cp = yy_c_buf_p; - /* Support of CMDtext. */ - *yy_cp = (yy_hold_char); + /* Support of yytext. */ + *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; - yy_current_state = (yy_start); + yy_current_state = yy_start; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { @@ -935,22 +855,24 @@ yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; + do_action: /* This label is used only to access EOF actions. */ + switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; goto yy_find_action; case 1: @@ -959,7 +881,6 @@ YY_RULE_SETUP { } YY_BREAK case 2: -/* rule 2 can match eol */ YY_RULE_SETUP #line 108 "CMDscan.l" { return(Sc_ScanDocBlock()); } @@ -975,7 +896,6 @@ YY_RULE_SETUP ; YY_BREAK case 5: -/* rule 5 can match eol */ YY_RULE_SETUP #line 111 "CMDscan.l" {lineIndex++;} @@ -1378,33 +1298,32 @@ YY_RULE_SETUP #line 222 "CMDscan.l" ECHO; YY_BREAK -#line 1382 "CMDscan.cpp" +#line 1302 "CMDscan.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET + *yy_cp = yy_hold_char; - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user - * just pointed CMDin at a new source and called - * CMDlex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = CMDin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position @@ -1414,13 +1333,13 @@ case YY_STATE_EOF(INITIAL): * end-of-buffer state). Contrast this with the test * in input(). */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state( ); + yy_current_state = yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have @@ -1433,41 +1352,41 @@ case YY_STATE_EOF(INITIAL): yy_next_state = yy_try_NUL_trans( yy_current_state ); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; + yy_bp = yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); + yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { - yy_cp = (yy_c_buf_p); + yy_cp = yy_c_buf_p; goto yy_find_action; } } - else switch ( yy_get_next_buffer( ) ) + else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { - (yy_did_buffer_switch_on_eof) = 0; + yy_did_buffer_switch_on_eof = 0; - if ( CMDwrap( ) ) + if ( yywrap() ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up - * CMDtext, we can now set up + * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; @@ -1475,30 +1394,30 @@ case YY_STATE_EOF(INITIAL): else { - if ( ! (yy_did_buffer_switch_on_eof) ) + if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state( ); + yy_current_state = yy_get_previous_state(); - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; - yy_current_state = yy_get_previous_state( ); + yy_current_state = yy_get_previous_state(); - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; @@ -1509,7 +1428,8 @@ case YY_STATE_EOF(INITIAL): "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ -} /* end of CMDlex */ + } /* end of yylex */ + /* yy_get_next_buffer - try to read in a new buffer * @@ -1518,22 +1438,23 @@ case YY_STATE_EOF(INITIAL): * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; register int number_to_move, i; int ret_val; - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + if ( yy_current_buffer->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) { - /* We matched a single character, the EOB, so + /* We matched a singled characater, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; @@ -1551,30 +1472,34 @@ static int yy_get_next_buffer (void) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + yy_n_chars = 0; else { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + YY_BUFFER_STATE b = yy_current_buffer; int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); + (int) (yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { @@ -1587,7 +1512,8 @@ static int yy_get_next_buffer (void) b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - CMDrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ @@ -1597,35 +1523,33 @@ static int yy_get_next_buffer (void) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; - +#endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); } - if ( (yy_n_chars) == 0 ) + if ( yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - CMDrestart(CMDin ); + yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + yy_current_buffer->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } @@ -1633,31 +1557,32 @@ static int yy_get_next_buffer (void) else ret_val = EOB_ACT_CONTINUE_SCAN; - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; return ret_val; -} + } + /* yy_get_previous_state - get the state just before the EOB char was reached */ - static yy_state_type yy_get_previous_state (void) -{ +static yy_state_type yy_get_previous_state() + { register yy_state_type yy_current_state; register char *yy_cp; - - yy_current_state = (yy_start); - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { @@ -1669,23 +1594,30 @@ static int yy_get_next_buffer (void) } return yy_current_state; -} + } + /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); + register char *yy_cp = yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { @@ -1697,59 +1629,90 @@ static int yy_get_next_buffer (void) yy_is_jam = (yy_current_state == 232); return yy_is_jam ? 0 : yy_current_state; -} + } -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) #else - static int input (void) +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; #endif + { + register char *yy_cp = yy_c_buf_p; -{ + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { int c; - - *(yy_c_buf_p) = (yy_hold_char); - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; + *yy_c_buf_p = '\0'; else { /* need more input */ - int offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); + yytext_ptr = yy_c_buf_p; + ++yy_c_buf_p; - switch ( yy_get_next_buffer( ) ) + switch ( yy_get_next_buffer() ) { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - CMDrestart(CMDin ); - - /*FALLTHROUGH*/ - case EOB_ACT_END_OF_FILE: { - if ( CMDwrap( ) ) - return 0; + if ( yywrap() ) + { + yy_c_buf_p = + yytext_ptr + YY_MORE_ADJ; + return EOF; + } - if ( ! (yy_did_buffer_switch_on_eof) ) + if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); @@ -1759,170 +1722,180 @@ static int yy_get_next_buffer (void) } case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; break; + + case EOB_ACT_LAST_MATCH: +#ifdef __cplusplus + YY_FATAL_ERROR( + "unexpected last match in yyinput()" ); +#else + YY_FATAL_ERROR( + "unexpected last match in input()" ); +#endif } } } - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve CMDtext */ - (yy_hold_char) = *++(yy_c_buf_p); + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * - * @note This function does not reset the start condition to @c INITIAL . - */ - void CMDrestart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - CMDensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - CMD_create_buffer(CMDin,YY_BUF_SIZE ); } - CMD_init_buffer(YY_CURRENT_BUFFER,input_file ); - CMD_load_buffer_state( ); -} -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void CMD_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * CMDpop_buffer_state(); - * CMDpush_buffer_state(new_buffer); - */ - CMDensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) return; - if ( YY_CURRENT_BUFFER ) + if ( yy_current_buffer ) { /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; } - YY_CURRENT_BUFFER_LVALUE = new_buffer; - CMD_load_buffer_state( ); + yy_current_buffer = new_buffer; + yy_load_buffer_state(); /* We don't actually know whether we did this switch during - * EOF (CMDwrap()) processing, but the only time this flag - * is looked at is after CMDwrap() is called, so it's safe + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ - (yy_did_buffer_switch_on_eof) = 1; -} + yy_did_buffer_switch_on_eof = 1; + } -static void CMD_load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - CMDin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); -} -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * - * @return the allocated buffer state. - */ - YY_BUFFER_STATE CMD_create_buffer (FILE * file, int size ) -{ +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) CMDalloc(sizeof( struct yy_buffer_state ) ); + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in CMD_create_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) CMDalloc(b->yy_buf_size + 2 ); + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in CMD_create_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; - CMD_init_buffer(b,file ); + yy_init_buffer( b, file ); return b; -} + } -/** Destroy the buffer. - * @param b a buffer created with CMD_create_buffer() - * - */ - void CMD_delete_buffer (YY_BUFFER_STATE b ) -{ - + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { if ( ! b ) return; - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - CMDfree((void *) b->yy_ch_buf ); + yy_flex_free( (void *) b->yy_ch_buf ); - CMDfree((void *) b ); -} + yy_flex_free( (void *) b ); + } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a CMDrestart() or at EOF. - */ - static void CMD_init_buffer (YY_BUFFER_STATE b, FILE * file ) -{ - int oerrno = errno; - - CMD_flush_buffer(b ); +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; - /* If b is the current buffer, then CMD_init_buffer was _probably_ - * called from CMDrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - errno = oerrno; -} -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * - */ - void CMD_flush_buffer (YY_BUFFER_STATE b ) -{ - if ( ! b ) - return; +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + { b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes @@ -1937,123 +1910,31 @@ extern int isatty (int ); b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == YY_CURRENT_BUFFER ) - CMD_load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * - */ -void CMDpush_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - CMDensure_buffer_stack(); - - /* This block is copied from CMD_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from CMD_switch_to_buffer. */ - CMD_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void CMDpop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - CMD_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - CMD_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void CMDensure_buffer_stack (void) -{ - int num_to_alloc; - - if (!(yy_buffer_stack)) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; - (yy_buffer_stack) = (struct yy_buffer_state**)CMDalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; + if ( b == yy_current_buffer ) + yy_load_buffer_state(); } - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ - /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)CMDrealloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE CMD_scan_buffer (char * base, yy_size_t size ) -{ +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { YY_BUFFER_STATE b; - + if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; - b = (YY_BUFFER_STATE) CMDalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in CMD_scan_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; @@ -2065,53 +1946,58 @@ YY_BUFFER_STATE CMD_scan_buffer (char * base, yy_size_t size ) b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - CMD_switch_to_buffer(b ); + yy_switch_to_buffer( b ); return b; -} + } +#endif -/** Setup the input buffer state to scan a string. The next call to CMDlex() will - * scan from a @e copy of @a str. - * @param str a NUL-terminated string to scan - * - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * CMD_scan_bytes() instead. - */ -YY_BUFFER_STATE CMD_scan_string (yyconst char * yystr ) -{ - - return CMD_scan_bytes(yystr,strlen(yystr) ); -} -/** Setup the input buffer state to scan the given bytes. The next call to CMDlex() will - * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE CMD_scan_bytes (yyconst char * yybytes, int _yybytes_len ) -{ +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *str ) +#else +YY_BUFFER_STATE yy_scan_string( str ) +yyconst char *str; +#endif + { + int len; + for ( len = 0; str[len]; ++len ) + ; + + return yy_scan_bytes( str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; - + /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) CMDalloc(n ); + n = len + 2; + buf = (char *) yy_flex_alloc( n ); if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in CMD_scan_bytes()" ); + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - b = CMD_scan_buffer(buf,n ); + b = yy_scan_buffer( buf, n ); if ( ! b ) - YY_FATAL_ERROR( "bad buffer in CMD_scan_bytes()" ); + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. @@ -2119,17 +2005,78 @@ YY_BUFFER_STATE CMD_scan_bytes (yyconst char * yybytes, int _yybytes_len ) b->yy_is_our_buffer = 1; return b; -} + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); -} + } + + /* Redefine yyless() so it works in section 3 code. */ @@ -2137,178 +2084,53 @@ static void yy_fatal_error (yyconst char* msg ) #define yyless(n) \ do \ { \ - /* Undo effects of setting up CMDtext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - CMDtext[CMDleng] = (yy_hold_char); \ - (yy_c_buf_p) = CMDtext + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - CMDleng = yyless_macro_arg; \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n - YY_MORE_ADJ; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ } \ while ( 0 ) -/* Accessor methods (get/set functions) to struct members. */ -/** Get the current line number. - * - */ -int CMDget_lineno (void) -{ - - return CMDlineno; -} - -/** Get the input stream. - * - */ -FILE *CMDget_in (void) -{ - return CMDin; -} - -/** Get the output stream. - * - */ -FILE *CMDget_out (void) -{ - return CMDout; -} - -/** Get the length of the current token. - * - */ -int CMDget_leng (void) -{ - return CMDleng; -} - -/** Get the current token. - * - */ - -char *CMDget_text (void) -{ - return CMDtext; -} - -/** Set the current line number. - * @param line_number - * - */ -void CMDset_lineno (int line_number ) -{ - - CMDlineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see CMD_switch_to_buffer - */ -void CMDset_in (FILE * in_str ) -{ - CMDin = in_str ; -} - -void CMDset_out (FILE * out_str ) -{ - CMDout = out_str ; -} - -int CMDget_debug (void) -{ - return CMD_flex_debug; -} - -void CMDset_debug (int bdebug ) -{ - CMD_flex_debug = bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from CMDlex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - CMDin = stdin; - CMDout = stdout; -#else - CMDin = (FILE *) 0; - CMDout = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * CMDlex_init() - */ - return 0; -} - -/* CMDlex_destroy is for both reentrant and non-reentrant scanners. */ -int CMDlex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - CMD_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - CMDpop_buffer_state(); - } - - /* Destroy the stack itself. */ - CMDfree((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * CMDlex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ +/* Internal utility routines. */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; -} + } #endif -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - return n; -} +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; #endif - -void *CMDalloc (yy_size_t size ) -{ + { return (void *) malloc( size ); -} + } -void *CMDrealloc (void * ptr, yy_size_t size ) -{ +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter @@ -2317,19 +2139,28 @@ void *CMDrealloc (void * ptr, yy_size_t size ) * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); -} + } -void CMDfree (void * ptr ) -{ - free( (char *) ptr ); /* see CMDrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif #line 222 "CMDscan.l" - static const char *scanBuffer; static const char *fileName; static int scanIndex; @@ -2731,4 +2562,3 @@ void CMD_reset() { CMDrestart(NULL); } - diff --git a/Engine/source/console/cmdgram.cpp b/Engine/source/console/cmdgram.cpp index 33dc24203..e24576307 100644 --- a/Engine/source/console/cmdgram.cpp +++ b/Engine/source/console/cmdgram.cpp @@ -1,232 +1,90 @@ -/* A Bison parser, made by GNU Bison 2.3. */ -/* Skeleton implementation for Bison's Yacc-like parsers in C +/* A Bison parser, made from cmdgram.y with Bison version GNU Bison version 1.24 + */ - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. +#define YYBISON 1 /* Identify Bison output. */ - 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 2, 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, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.3" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - -/* Substitute the variable and function names. */ #define yyparse CMDparse -#define yylex CMDlex +#define yylex CMDlex #define yyerror CMDerror -#define yylval CMDlval -#define yychar CMDchar +#define yylval CMDlval +#define yychar CMDchar #define yydebug CMDdebug #define yynerrs CMDnerrs +#define rwDEFINE 258 +#define rwENDDEF 259 +#define rwDECLARE 260 +#define rwDECLARESINGLETON 261 +#define rwBREAK 262 +#define rwELSE 263 +#define rwCONTINUE 264 +#define rwGLOBAL 265 +#define rwIF 266 +#define rwNIL 267 +#define rwRETURN 268 +#define rwWHILE 269 +#define rwDO 270 +#define rwENDIF 271 +#define rwENDWHILE 272 +#define rwENDFOR 273 +#define rwDEFAULT 274 +#define rwFOR 275 +#define rwFOREACH 276 +#define rwFOREACHSTR 277 +#define rwIN 278 +#define rwDATABLOCK 279 +#define rwSWITCH 280 +#define rwCASE 281 +#define rwSWITCHSTR 282 +#define rwCASEOR 283 +#define rwPACKAGE 284 +#define rwNAMESPACE 285 +#define rwCLASS 286 +#define rwASSERT 287 +#define ILLEGAL_TOKEN 288 +#define CHRCONST 289 +#define INTCONST 290 +#define TTAG 291 +#define VAR 292 +#define IDENT 293 +#define TYPEIDENT 294 +#define DOCBLOCK 295 +#define STRATOM 296 +#define TAGATOM 297 +#define FLTCONST 298 +#define opINTNAME 299 +#define opINTNAMER 300 +#define opMINUSMINUS 301 +#define opPLUSPLUS 302 +#define STMT_SEP 303 +#define opSHL 304 +#define opSHR 305 +#define opPLASN 306 +#define opMIASN 307 +#define opMLASN 308 +#define opDVASN 309 +#define opMODASN 310 +#define opANDASN 311 +#define opXORASN 312 +#define opORASN 313 +#define opSLASN 314 +#define opSRASN 315 +#define opCAT 316 +#define opEQ 317 +#define opNE 318 +#define opGE 319 +#define opLE 320 +#define opAND 321 +#define opOR 322 +#define opSTREQ 323 +#define opCOLONCOLON 324 +#define opMDASN 325 +#define opNDASN 326 +#define opNTASN 327 +#define opSTRNE 328 +#define UNARY 329 - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - rwDEFINE = 258, - rwENDDEF = 259, - rwDECLARE = 260, - rwDECLARESINGLETON = 261, - rwBREAK = 262, - rwELSE = 263, - rwCONTINUE = 264, - rwGLOBAL = 265, - rwIF = 266, - rwNIL = 267, - rwRETURN = 268, - rwWHILE = 269, - rwDO = 270, - rwENDIF = 271, - rwENDWHILE = 272, - rwENDFOR = 273, - rwDEFAULT = 274, - rwFOR = 275, - rwFOREACH = 276, - rwFOREACHSTR = 277, - rwIN = 278, - rwDATABLOCK = 279, - rwSWITCH = 280, - rwCASE = 281, - rwSWITCHSTR = 282, - rwCASEOR = 283, - rwPACKAGE = 284, - rwNAMESPACE = 285, - rwCLASS = 286, - rwASSERT = 287, - ILLEGAL_TOKEN = 288, - CHRCONST = 289, - INTCONST = 290, - TTAG = 291, - VAR = 292, - IDENT = 293, - TYPEIDENT = 294, - DOCBLOCK = 295, - STRATOM = 296, - TAGATOM = 297, - FLTCONST = 298, - opINTNAME = 299, - opINTNAMER = 300, - opMINUSMINUS = 301, - opPLUSPLUS = 302, - STMT_SEP = 303, - opSHL = 304, - opSHR = 305, - opPLASN = 306, - opMIASN = 307, - opMLASN = 308, - opDVASN = 309, - opMODASN = 310, - opANDASN = 311, - opXORASN = 312, - opORASN = 313, - opSLASN = 314, - opSRASN = 315, - opCAT = 316, - opEQ = 317, - opNE = 318, - opGE = 319, - opLE = 320, - opAND = 321, - opOR = 322, - opSTREQ = 323, - opCOLONCOLON = 324, - opNTASN = 325, - opNDASN = 326, - opMDASN = 327, - opSTRNE = 328, - UNARY = 329 - }; -#endif -/* Tokens. */ -#define rwDEFINE 258 -#define rwENDDEF 259 -#define rwDECLARE 260 -#define rwDECLARESINGLETON 261 -#define rwBREAK 262 -#define rwELSE 263 -#define rwCONTINUE 264 -#define rwGLOBAL 265 -#define rwIF 266 -#define rwNIL 267 -#define rwRETURN 268 -#define rwWHILE 269 -#define rwDO 270 -#define rwENDIF 271 -#define rwENDWHILE 272 -#define rwENDFOR 273 -#define rwDEFAULT 274 -#define rwFOR 275 -#define rwFOREACH 276 -#define rwFOREACHSTR 277 -#define rwIN 278 -#define rwDATABLOCK 279 -#define rwSWITCH 280 -#define rwCASE 281 -#define rwSWITCHSTR 282 -#define rwCASEOR 283 -#define rwPACKAGE 284 -#define rwNAMESPACE 285 -#define rwCLASS 286 -#define rwASSERT 287 -#define ILLEGAL_TOKEN 288 -#define CHRCONST 289 -#define INTCONST 290 -#define TTAG 291 -#define VAR 292 -#define IDENT 293 -#define TYPEIDENT 294 -#define DOCBLOCK 295 -#define STRATOM 296 -#define TAGATOM 297 -#define FLTCONST 298 -#define opINTNAME 299 -#define opINTNAMER 300 -#define opMINUSMINUS 301 -#define opPLUSPLUS 302 -#define STMT_SEP 303 -#define opSHL 304 -#define opSHR 305 -#define opPLASN 306 -#define opMIASN 307 -#define opMLASN 308 -#define opDVASN 309 -#define opMODASN 310 -#define opANDASN 311 -#define opXORASN 312 -#define opORASN 313 -#define opSLASN 314 -#define opSRASN 315 -#define opCAT 316 -#define opEQ 317 -#define opNE 318 -#define opGE 319 -#define opLE 320 -#define opAND 321 -#define opOR 322 -#define opSTREQ 323 -#define opCOLONCOLON 324 -#define opNTASN 325 -#define opNDASN 326 -#define opMDASN 327 -#define opSTRNE 328 -#define UNARY 329 - - - - -/* Copy the first part of user declarations. */ -#line 1 "CMDgram.y" +#line 1 "cmdgram.y" // bison --defines=cmdgram.h --verbose -o cmdgram.cpp -p CMD CMDgram.y @@ -269,39 +127,18 @@ struct Token U32 lineNumber; }; -#line 44 "CMDgram.y" +#line 44 "cmdgram.y" /* Reserved Word Definitions */ -#line 55 "CMDgram.y" +#line 55 "cmdgram.y" /* Constants and Identifier Definitions */ -#line 69 "CMDgram.y" +#line 69 "cmdgram.y" /* Operator Definitions */ - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 82 "CMDgram.y" -{ +#line 82 "cmdgram.y" +typedef union { Token< char > c; Token< int > i; Token< const char* > s; @@ -317,1855 +154,1229 @@ typedef union YYSTYPE ObjectDeclNode* od; AssignDecl asn; IfStmtNode* ifnode; -} -/* Line 193 of yacc.c. */ -#line 323 "cmdgram.cpp" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 +} YYSTYPE; + +#ifndef YYLTYPE +typedef + struct yyltype + { + int timestamp; + int first_line; + int first_column; + int last_line; + int last_column; + char *text; + } + yyltype; + +#define YYLTYPE yyltype +#endif + +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif #endif -/* Copy the second part of user declarations. */ +#define YYFINAL 388 +#define YYFLAG -32768 +#define YYNTBASE 100 +#define YYTRANSLATE(x) ((unsigned)(x) <= 329 ? yytranslate[x] : 140) -/* Line 216 of yacc.c. */ -#line 336 "cmdgram.cpp" +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 64, 2, 2, 2, 54, 53, 2, 55, + 56, 46, 44, 57, 45, 51, 47, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 58, 59, 48, + 50, 49, 96, 65, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 92, 2, 99, 62, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 60, 52, 61, 63, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 93, 94, 95, 97, 98 +}; -#ifdef short -# undef short -#endif +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 3, 6, 8, 10, 12, 19, 21, 24, + 25, 28, 30, 32, 34, 36, 38, 40, 43, 46, + 49, 53, 56, 61, 68, 70, 79, 90, 91, 93, + 95, 99, 110, 121, 129, 142, 152, 163, 171, 172, + 175, 176, 178, 179, 182, 183, 185, 187, 190, 193, + 197, 201, 203, 211, 219, 224, 232, 238, 240, 244, + 250, 258, 264, 271, 281, 290, 299, 307, 316, 324, + 332, 339, 347, 355, 357, 359, 363, 367, 371, 375, + 379, 383, 387, 391, 395, 398, 401, 403, 409, 413, + 417, 421, 425, 429, 433, 437, 441, 445, 449, 453, + 457, 461, 464, 467, 469, 471, 473, 475, 477, 479, + 481, 483, 485, 490, 498, 502, 509, 513, 517, 519, + 523, 525, 527, 530, 533, 536, 539, 542, 545, 548, + 551, 554, 557, 559, 561, 563, 567, 574, 577, 583, + 586, 590, 596, 601, 608, 615, 620, 627, 628, 630, + 632, 636, 637, 639, 641, 644, 649, 655, 660, 668, + 677, 679 +}; -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) -#else -static int -YYID (i) - int i; -#endif -{ - return i; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +static const short yyrhs[] = { 101, + 0, 0, 101, 102, 0, 106, 0, 107, 0, 103, + 0, 29, 38, 60, 104, 61, 59, 0, 107, 0, + 104, 107, 0, 0, 105, 106, 0, 121, 0, 122, + 0, 123, 0, 124, 0, 110, 0, 118, 0, 7, + 59, 0, 9, 59, 0, 13, 59, 0, 13, 126, + 59, 0, 125, 59, 0, 36, 50, 126, 59, 0, + 36, 50, 126, 57, 126, 59, 0, 40, 0, 3, + 38, 55, 108, 56, 60, 105, 61, 0, 3, 38, + 91, 38, 55, 108, 56, 60, 105, 61, 0, 0, + 109, 0, 37, 0, 109, 57, 37, 0, 24, 129, + 55, 126, 112, 56, 60, 136, 61, 59, 0, 5, + 129, 55, 113, 112, 114, 56, 60, 115, 61, 0, + 5, 129, 55, 113, 112, 114, 56, 0, 5, 129, + 55, 92, 113, 99, 112, 114, 56, 60, 115, 61, + 0, 5, 129, 55, 92, 113, 99, 112, 114, 56, + 0, 6, 129, 55, 113, 112, 114, 56, 60, 115, + 61, 0, 6, 129, 55, 113, 112, 114, 56, 0, + 0, 58, 38, 0, 0, 126, 0, 0, 57, 135, + 0, 0, 137, 0, 116, 0, 137, 116, 0, 111, + 59, 0, 116, 111, 59, 0, 60, 105, 61, 0, + 106, 0, 25, 55, 126, 56, 60, 119, 61, 0, + 27, 55, 126, 56, 60, 119, 61, 0, 26, 120, + 58, 105, 0, 26, 120, 58, 105, 19, 58, 105, + 0, 26, 120, 58, 105, 119, 0, 126, 0, 120, + 28, 126, 0, 11, 55, 126, 56, 117, 0, 11, + 55, 126, 56, 117, 8, 117, 0, 14, 55, 126, + 56, 117, 0, 15, 117, 14, 55, 126, 56, 0, + 20, 55, 126, 59, 126, 59, 126, 56, 117, 0, + 20, 55, 126, 59, 126, 59, 56, 117, 0, 20, + 55, 126, 59, 59, 126, 56, 117, 0, 20, 55, + 126, 59, 59, 56, 117, 0, 20, 55, 59, 126, + 59, 126, 56, 117, 0, 20, 55, 59, 126, 59, + 56, 117, 0, 20, 55, 59, 59, 126, 56, 117, + 0, 20, 55, 59, 59, 56, 117, 0, 21, 55, + 37, 23, 126, 56, 117, 0, 22, 55, 37, 23, + 126, 56, 117, 0, 131, 0, 131, 0, 55, 126, + 56, 0, 126, 62, 126, 0, 126, 54, 126, 0, + 126, 53, 126, 0, 126, 52, 126, 0, 126, 44, + 126, 0, 126, 45, 126, 0, 126, 46, 126, 0, + 126, 47, 126, 0, 45, 126, 0, 46, 126, 0, + 36, 0, 126, 96, 126, 58, 126, 0, 126, 48, + 126, 0, 126, 49, 126, 0, 126, 86, 126, 0, + 126, 87, 126, 0, 126, 84, 126, 0, 126, 85, + 126, 0, 126, 89, 126, 0, 126, 71, 126, 0, + 126, 72, 126, 0, 126, 88, 126, 0, 126, 90, + 126, 0, 126, 97, 126, 0, 126, 65, 126, 0, + 64, 126, 0, 63, 126, 0, 42, 0, 43, 0, + 35, 0, 7, 0, 127, 0, 128, 0, 38, 0, + 41, 0, 37, 0, 37, 92, 139, 99, 0, 3, + 55, 108, 56, 60, 105, 61, 0, 126, 51, 38, + 0, 126, 51, 38, 92, 139, 99, 0, 126, 66, + 129, 0, 126, 67, 129, 0, 38, 0, 55, 126, + 56, 0, 69, 0, 68, 0, 73, 126, 0, 74, + 126, 0, 75, 126, 0, 76, 126, 0, 77, 126, + 0, 78, 126, 0, 79, 126, 0, 80, 126, 0, + 81, 126, 0, 82, 126, 0, 132, 0, 133, 0, + 111, 0, 37, 50, 126, 0, 37, 92, 139, 99, + 50, 126, 0, 37, 130, 0, 37, 92, 139, 99, + 130, 0, 127, 130, 0, 127, 50, 126, 0, 127, + 50, 60, 135, 61, 0, 38, 55, 134, 56, 0, + 38, 91, 38, 55, 134, 56, 0, 126, 51, 38, + 55, 134, 56, 0, 32, 55, 126, 56, 0, 32, + 55, 126, 57, 41, 56, 0, 0, 135, 0, 126, + 0, 135, 57, 126, 0, 0, 137, 0, 138, 0, + 137, 138, 0, 38, 50, 126, 59, 0, 39, 38, + 50, 126, 59, 0, 24, 50, 126, 59, 0, 38, + 92, 139, 99, 50, 126, 59, 0, 39, 38, 92, + 139, 99, 50, 126, 59, 0, 126, 0, 139, 57, + 126, 0 +}; #endif -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 3 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2858 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 100 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 41 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 162 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 380 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 329 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 64, 2, 2, 2, 54, 53, 2, - 55, 56, 46, 44, 57, 45, 51, 47, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 58, 59, - 48, 50, 49, 96, 65, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 92, 2, 99, 62, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 60, 52, 61, 63, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 93, 94, 95, 97, 98 +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 161, 166, 168, 173, 175, 177, 182, 187, 189, 194, + 196, 201, 202, 203, 204, 205, 206, 207, 209, 211, + 213, 215, 217, 219, 221, 226, 228, 233, 235, 240, + 242, 247, 252, 254, 256, 258, 260, 262, 267, 269, + 274, 276, 281, 283, 288, 290, 292, 294, 299, 301, + 306, 308, 313, 315, 320, 322, 324, 329, 331, 336, + 338, 343, 345, 350, 352, 354, 356, 358, 360, 362, + 364, 369, 371, 376, 381, 383, 385, 387, 389, 391, + 393, 395, 397, 399, 401, 403, 405, 407, 409, 411, + 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, + 433, 435, 437, 439, 441, 443, 445, 447, 449, 451, + 453, 455, 457, 459, 475, 477, 482, 484, 489, 491, + 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, + 516, 518, 523, 525, 527, 529, 531, 533, 535, 537, + 539, 541, 546, 548, 550, 555, 557, 562, 564, 569, + 571, 576, 578, 583, 585, 590, 592, 594, 596, 598, + 603, 605 }; -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 5, 6, 9, 11, 13, 15, 22, - 24, 27, 28, 31, 33, 35, 37, 39, 41, 43, - 46, 49, 52, 56, 59, 64, 71, 73, 82, 93, - 94, 96, 98, 102, 113, 124, 132, 145, 155, 166, - 174, 175, 178, 179, 181, 182, 185, 186, 188, 190, - 193, 196, 200, 204, 206, 214, 222, 227, 235, 241, - 243, 247, 253, 261, 267, 274, 284, 293, 302, 310, - 319, 327, 335, 342, 350, 358, 360, 362, 366, 370, - 374, 378, 382, 386, 390, 394, 398, 401, 404, 406, - 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, - 452, 456, 460, 464, 467, 470, 472, 474, 476, 478, - 480, 482, 484, 486, 488, 493, 497, 504, 508, 512, - 514, 518, 520, 522, 525, 528, 531, 534, 537, 540, - 543, 546, 549, 552, 554, 556, 558, 562, 569, 572, - 578, 581, 585, 591, 596, 603, 610, 615, 622, 623, - 625, 627, 631, 632, 634, 636, 639, 644, 650, 655, - 663, 672, 674 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 101, 0, -1, 102, -1, -1, 102, 103, -1, 107, - -1, 108, -1, 104, -1, 29, 38, 60, 105, 61, - 59, -1, 108, -1, 105, 108, -1, -1, 106, 107, - -1, 122, -1, 123, -1, 124, -1, 125, -1, 111, - -1, 119, -1, 7, 59, -1, 9, 59, -1, 13, - 59, -1, 13, 127, 59, -1, 126, 59, -1, 36, - 50, 127, 59, -1, 36, 50, 127, 57, 127, 59, - -1, 40, -1, 3, 38, 55, 109, 56, 60, 106, - 61, -1, 3, 38, 91, 38, 55, 109, 56, 60, - 106, 61, -1, -1, 110, -1, 37, -1, 110, 57, - 37, -1, 24, 130, 55, 127, 113, 56, 60, 137, - 61, 59, -1, 5, 130, 55, 114, 113, 115, 56, - 60, 116, 61, -1, 5, 130, 55, 114, 113, 115, - 56, -1, 5, 130, 55, 92, 114, 99, 113, 115, - 56, 60, 116, 61, -1, 5, 130, 55, 92, 114, - 99, 113, 115, 56, -1, 6, 130, 55, 114, 113, - 115, 56, 60, 116, 61, -1, 6, 130, 55, 114, - 113, 115, 56, -1, -1, 58, 38, -1, -1, 127, - -1, -1, 57, 136, -1, -1, 138, -1, 117, -1, - 138, 117, -1, 112, 59, -1, 117, 112, 59, -1, - 60, 106, 61, -1, 107, -1, 25, 55, 127, 56, - 60, 120, 61, -1, 27, 55, 127, 56, 60, 120, - 61, -1, 26, 121, 58, 106, -1, 26, 121, 58, - 106, 19, 58, 106, -1, 26, 121, 58, 106, 120, - -1, 127, -1, 121, 28, 127, -1, 11, 55, 127, - 56, 118, -1, 11, 55, 127, 56, 118, 8, 118, - -1, 14, 55, 127, 56, 118, -1, 15, 118, 14, - 55, 127, 56, -1, 20, 55, 127, 59, 127, 59, - 127, 56, 118, -1, 20, 55, 127, 59, 127, 59, - 56, 118, -1, 20, 55, 127, 59, 59, 127, 56, - 118, -1, 20, 55, 127, 59, 59, 56, 118, -1, - 20, 55, 59, 127, 59, 127, 56, 118, -1, 20, - 55, 59, 127, 59, 56, 118, -1, 20, 55, 59, - 59, 127, 56, 118, -1, 20, 55, 59, 59, 56, - 118, -1, 21, 55, 37, 23, 127, 56, 118, -1, - 22, 55, 37, 23, 127, 56, 118, -1, 132, -1, - 132, -1, 55, 127, 56, -1, 127, 62, 127, -1, - 127, 54, 127, -1, 127, 53, 127, -1, 127, 52, - 127, -1, 127, 44, 127, -1, 127, 45, 127, -1, - 127, 46, 127, -1, 127, 47, 127, -1, 45, 127, - -1, 46, 127, -1, 36, -1, 127, 96, 127, 58, - 127, -1, 127, 48, 127, -1, 127, 49, 127, -1, - 127, 86, 127, -1, 127, 87, 127, -1, 127, 84, - 127, -1, 127, 85, 127, -1, 127, 89, 127, -1, - 127, 71, 127, -1, 127, 72, 127, -1, 127, 88, - 127, -1, 127, 90, 127, -1, 127, 97, 127, -1, - 127, 65, 127, -1, 64, 127, -1, 63, 127, -1, - 42, -1, 43, -1, 35, -1, 7, -1, 128, -1, - 129, -1, 38, -1, 41, -1, 37, -1, 37, 92, - 140, 99, -1, 127, 51, 38, -1, 127, 51, 38, - 92, 140, 99, -1, 127, 66, 130, -1, 127, 67, - 130, -1, 38, -1, 55, 127, 56, -1, 69, -1, - 68, -1, 73, 127, -1, 74, 127, -1, 75, 127, - -1, 76, 127, -1, 77, 127, -1, 78, 127, -1, - 79, 127, -1, 80, 127, -1, 81, 127, -1, 82, - 127, -1, 133, -1, 134, -1, 112, -1, 37, 50, - 127, -1, 37, 92, 140, 99, 50, 127, -1, 37, - 131, -1, 37, 92, 140, 99, 131, -1, 128, 131, - -1, 128, 50, 127, -1, 128, 50, 60, 136, 61, - -1, 38, 55, 135, 56, -1, 38, 91, 38, 55, - 135, 56, -1, 127, 51, 38, 55, 135, 56, -1, - 32, 55, 127, 56, -1, 32, 55, 127, 57, 41, - 56, -1, -1, 136, -1, 127, -1, 136, 57, 127, - -1, -1, 138, -1, 139, -1, 138, 139, -1, 38, - 50, 127, 59, -1, 39, 38, 50, 127, 59, -1, - 24, 50, 127, 59, -1, 38, 92, 140, 99, 50, - 127, 59, -1, 39, 38, 92, 140, 99, 50, 127, - 59, -1, 127, -1, 140, 57, 127, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 161, 161, 167, 168, 173, 175, 177, 182, 187, - 189, 195, 196, 201, 202, 203, 204, 205, 206, 207, - 209, 211, 213, 215, 217, 219, 221, 226, 228, 234, - 235, 240, 242, 247, 252, 254, 256, 258, 260, 262, - 268, 269, 275, 276, 282, 283, 289, 290, 292, 294, - 299, 301, 306, 308, 313, 315, 320, 322, 324, 329, - 331, 336, 338, 343, 345, 350, 352, 354, 356, 358, - 360, 362, 364, 369, 371, 376, 381, 383, 385, 387, - 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, - 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, - 429, 431, 433, 435, 437, 439, 441, 443, 445, 447, - 449, 451, 453, 455, 457, 462, 464, 469, 471, 476, - 478, 483, 485, 487, 489, 491, 493, 495, 497, 499, - 501, 503, 505, 510, 512, 514, 516, 518, 520, 522, - 524, 526, 528, 533, 535, 537, 542, 544, 550, 551, - 556, 558, 564, 565, 570, 572, 577, 579, 581, 583, - 585, 590, 592 +static const char * const yytname[] = { "$","error","$undefined.","rwDEFINE", +"rwENDDEF","rwDECLARE","rwDECLARESINGLETON","rwBREAK","rwELSE","rwCONTINUE", +"rwGLOBAL","rwIF","rwNIL","rwRETURN","rwWHILE","rwDO","rwENDIF","rwENDWHILE", +"rwENDFOR","rwDEFAULT","rwFOR","rwFOREACH","rwFOREACHSTR","rwIN","rwDATABLOCK", +"rwSWITCH","rwCASE","rwSWITCHSTR","rwCASEOR","rwPACKAGE","rwNAMESPACE","rwCLASS", +"rwASSERT","ILLEGAL_TOKEN","CHRCONST","INTCONST","TTAG","VAR","IDENT","TYPEIDENT", +"DOCBLOCK","STRATOM","TAGATOM","FLTCONST","'+'","'-'","'*'","'/'","'<'","'>'", +"'='","'.'","'|'","'&'","'%'","'('","')'","','","':'","';'","'{'","'}'","'^'", +"'~'","'!'","'@'","opINTNAME","opINTNAMER","opMINUSMINUS","opPLUSPLUS","STMT_SEP", +"opSHL","opSHR","opPLASN","opMIASN","opMLASN","opDVASN","opMODASN","opANDASN", +"opXORASN","opORASN","opSLASN","opSRASN","opCAT","opEQ","opNE","opGE","opLE", +"opAND","opOR","opSTREQ","opCOLONCOLON","'['","opMDASN","opNDASN","opNTASN", +"'?'","opSTRNE","UNARY","']'","start","decl_list","decl","package_decl","fn_decl_list", +"statement_list","stmt","fn_decl_stmt","var_list_decl","var_list","datablock_decl", +"object_decl","parent_block","object_name","object_args","object_declare_block", +"object_decl_list","stmt_block","switch_stmt","case_block","case_expr","if_stmt", +"while_stmt","for_stmt","foreach_stmt","expression_stmt","expr","slot_acc","intslot_acc", +"class_name_expr","assign_op_struct","stmt_expr","funcall_expr","assert_expr", +"expr_list_decl","expr_list","slot_assign_list_opt","slot_assign_list","slot_assign", +"aidx_expr","" }; #endif -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "rwDEFINE", "rwENDDEF", "rwDECLARE", - "rwDECLARESINGLETON", "rwBREAK", "rwELSE", "rwCONTINUE", "rwGLOBAL", - "rwIF", "rwNIL", "rwRETURN", "rwWHILE", "rwDO", "rwENDIF", "rwENDWHILE", - "rwENDFOR", "rwDEFAULT", "rwFOR", "rwFOREACH", "rwFOREACHSTR", "rwIN", - "rwDATABLOCK", "rwSWITCH", "rwCASE", "rwSWITCHSTR", "rwCASEOR", - "rwPACKAGE", "rwNAMESPACE", "rwCLASS", "rwASSERT", "ILLEGAL_TOKEN", - "CHRCONST", "INTCONST", "TTAG", "VAR", "IDENT", "TYPEIDENT", "DOCBLOCK", - "STRATOM", "TAGATOM", "FLTCONST", "'+'", "'-'", "'*'", "'/'", "'<'", - "'>'", "'='", "'.'", "'|'", "'&'", "'%'", "'('", "')'", "','", "':'", - "';'", "'{'", "'}'", "'^'", "'~'", "'!'", "'@'", "opINTNAME", - "opINTNAMER", "opMINUSMINUS", "opPLUSPLUS", "STMT_SEP", "opSHL", "opSHR", - "opPLASN", "opMIASN", "opMLASN", "opDVASN", "opMODASN", "opANDASN", - "opXORASN", "opORASN", "opSLASN", "opSRASN", "opCAT", "opEQ", "opNE", - "opGE", "opLE", "opAND", "opOR", "opSTREQ", "opCOLONCOLON", "'['", - "opNTASN", "opNDASN", "opMDASN", "'?'", "opSTRNE", "UNARY", "']'", - "$accept", "start", "decl_list", "decl", "package_decl", "fn_decl_list", - "statement_list", "stmt", "fn_decl_stmt", "var_list_decl", "var_list", - "datablock_decl", "object_decl", "parent_block", "object_name", - "object_args", "object_declare_block", "object_decl_list", "stmt_block", - "switch_stmt", "case_block", "case_expr", "if_stmt", "while_stmt", - "for_stmt", "foreach_stmt", "expression_stmt", "expr", "slot_acc", - "intslot_acc", "class_name_expr", "assign_op_struct", "stmt_expr", - "funcall_expr", "assert_expr", "expr_list_decl", "expr_list", - "slot_assign_list_opt", "slot_assign_list", "slot_assign", "aidx_expr", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 43, 45, 42, 47, 60, 62, - 61, 46, 124, 38, 37, 40, 41, 44, 58, 59, - 123, 125, 94, 126, 33, 64, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 91, 325, 326, 327, 63, 328, 329, 93 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 100, 101, 102, 102, 103, 103, 103, 104, 105, - 105, 106, 106, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 108, 108, 109, - 109, 110, 110, 111, 112, 112, 112, 112, 112, 112, - 113, 113, 114, 114, 115, 115, 116, 116, 116, 116, - 117, 117, 118, 118, 119, 119, 120, 120, 120, 121, - 121, 122, 122, 123, 123, 124, 124, 124, 124, 124, - 124, 124, 124, 125, 125, 126, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 128, 128, 129, 129, 130, - 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 133, 133, 133, 134, 134, 135, 135, - 136, 136, 137, 137, 138, 138, 139, 139, 139, 139, - 139, 140, 140 +static const short yyr1[] = { 0, + 100, 101, 101, 102, 102, 102, 103, 104, 104, 105, + 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 107, 107, 108, 108, 109, + 109, 110, 111, 111, 111, 111, 111, 111, 112, 112, + 113, 113, 114, 114, 115, 115, 115, 115, 116, 116, + 117, 117, 118, 118, 119, 119, 119, 120, 120, 121, + 121, 122, 122, 123, 123, 123, 123, 123, 123, 123, + 123, 124, 124, 125, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 127, 127, 128, 128, 129, 129, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 132, 132, 132, 133, 133, 134, 134, 135, + 135, 136, 136, 137, 137, 138, 138, 138, 138, 138, + 139, 139 }; -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 0, 2, 1, 1, 1, 6, 1, - 2, 0, 2, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 3, 2, 4, 6, 1, 8, 10, 0, - 1, 1, 3, 10, 10, 7, 12, 9, 10, 7, - 0, 2, 0, 1, 0, 2, 0, 1, 1, 2, - 2, 3, 3, 1, 7, 7, 4, 7, 5, 1, - 3, 5, 7, 5, 6, 9, 8, 8, 7, 8, - 7, 7, 6, 7, 7, 1, 1, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 2, 1, 5, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 3, 6, 3, 3, 1, - 3, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 3, 6, 2, 5, - 2, 3, 5, 4, 6, 6, 4, 6, 0, 1, - 1, 3, 0, 1, 1, 2, 4, 5, 4, 7, - 8, 1, 3 +static const short yyr2[] = { 0, + 1, 0, 2, 1, 1, 1, 6, 1, 2, 0, + 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 3, 2, 4, 6, 1, 8, 10, 0, 1, 1, + 3, 10, 10, 7, 12, 9, 10, 7, 0, 2, + 0, 1, 0, 2, 0, 1, 1, 2, 2, 3, + 3, 1, 7, 7, 4, 7, 5, 1, 3, 5, + 7, 5, 6, 9, 8, 8, 7, 8, 7, 7, + 6, 7, 7, 1, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 1, 5, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 7, 3, 6, 3, 3, 1, 3, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 1, 1, 1, 3, 6, 2, 5, 2, + 3, 5, 4, 6, 6, 4, 6, 0, 1, 1, + 3, 0, 1, 1, 2, 4, 5, 4, 7, 8, + 1, 3 }; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 3, 0, 2, 1, 0, 0, 0, 108, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 107, 88, 113, 111, 26, 112, 105, 106, 0, - 0, 0, 0, 0, 4, 7, 5, 6, 17, 135, - 18, 13, 14, 15, 16, 0, 0, 109, 110, 76, - 133, 134, 0, 119, 0, 0, 0, 19, 20, 0, - 108, 88, 21, 0, 76, 0, 11, 53, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, - 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 138, 148, 0, 86, 87, 0, 104, 103, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 140, 29, 0, - 0, 42, 42, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 136, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 161, - 0, 150, 0, 149, 0, 77, 82, 83, 84, 85, - 90, 91, 115, 81, 80, 79, 78, 102, 117, 118, - 97, 98, 94, 95, 92, 93, 99, 96, 100, 0, - 101, 0, 141, 31, 0, 30, 0, 120, 42, 40, - 43, 40, 0, 0, 52, 12, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 9, 146, 0, 0, - 24, 0, 114, 143, 0, 148, 148, 0, 0, 0, - 0, 0, 29, 0, 0, 44, 44, 61, 63, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 0, 162, 0, 139, 151, 0, 0, - 0, 89, 142, 11, 32, 0, 40, 41, 0, 0, - 0, 0, 64, 72, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 147, 25, 137, - 144, 145, 116, 0, 0, 44, 45, 35, 39, 62, - 71, 70, 0, 68, 0, 0, 0, 73, 74, 152, - 0, 59, 54, 55, 27, 11, 0, 46, 46, 69, - 67, 66, 0, 0, 0, 0, 0, 153, 154, 0, - 11, 0, 37, 0, 0, 48, 47, 0, 65, 0, - 0, 0, 0, 0, 155, 60, 56, 28, 46, 50, - 34, 0, 49, 38, 0, 0, 0, 0, 0, 33, - 0, 58, 0, 51, 158, 156, 0, 0, 0, 11, - 36, 0, 157, 0, 57, 0, 0, 159, 0, 160 +static const short yydefact[] = { 2, + 1, 0, 0, 0, 107, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106, 87, + 112, 110, 25, 111, 104, 105, 0, 0, 0, 0, + 0, 3, 6, 4, 5, 16, 135, 17, 12, 13, + 14, 15, 0, 0, 108, 109, 75, 133, 134, 0, + 28, 119, 0, 0, 0, 18, 19, 0, 0, 107, + 87, 20, 0, 75, 0, 10, 52, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 122, 121, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 148, 0, 85, 86, 0, 103, 102, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 140, 28, 0, 30, + 0, 29, 0, 41, 41, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 136, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 161, 0, 150, 0, 149, 0, 76, 81, 82, + 83, 84, 89, 90, 115, 80, 79, 78, 77, 101, + 117, 118, 96, 97, 93, 94, 91, 92, 98, 95, + 99, 0, 100, 0, 141, 0, 0, 0, 0, 120, + 41, 39, 42, 39, 0, 0, 51, 11, 0, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 0, 8, + 146, 0, 0, 23, 0, 113, 143, 0, 148, 148, + 0, 0, 0, 0, 28, 10, 31, 0, 0, 43, + 43, 60, 62, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 162, 0, + 139, 151, 0, 0, 0, 88, 142, 10, 0, 0, + 39, 40, 0, 0, 0, 0, 63, 71, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 147, 24, 137, 144, 145, 116, 0, 0, 114, + 43, 44, 34, 38, 61, 70, 69, 0, 67, 0, + 0, 0, 72, 73, 152, 0, 58, 53, 54, 26, + 10, 0, 45, 45, 68, 66, 65, 0, 0, 0, + 0, 0, 153, 154, 0, 10, 0, 36, 0, 0, + 47, 46, 0, 64, 0, 0, 0, 0, 0, 155, + 59, 55, 27, 45, 49, 33, 0, 48, 37, 0, + 0, 0, 0, 0, 32, 0, 57, 0, 50, 158, + 156, 0, 0, 0, 10, 35, 0, 157, 0, 56, + 0, 0, 159, 0, 160, 0, 0, 0 }; -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 2, 34, 35, 215, 136, 67, 37, 194, - 195, 38, 39, 235, 199, 269, 334, 335, 68, 40, - 284, 310, 41, 42, 43, 44, 45, 46, 47, 48, - 55, 92, 64, 50, 51, 162, 163, 326, 336, 328, - 160 +static const short yydefgoto[] = { 386, + 1, 32, 33, 219, 139, 67, 35, 131, 132, 36, + 37, 240, 202, 274, 340, 341, 68, 38, 289, 316, + 39, 40, 41, 42, 43, 44, 45, 46, 54, 92, + 64, 48, 49, 165, 166, 332, 342, 334, 163 }; -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -310 -static const yytype_int16 yypact[] = -{ - -310, 31, 397, -310, 4, 2, 2, -3, 32, 27, - 167, 34, 489, 40, 41, 43, 2, 44, 47, 66, - 55, -310, 67, 115, -33, -310, -310, -310, -310, 1002, - 1002, 1002, 1002, 1002, -310, -310, -310, -310, -310, -310, - -310, -310, -310, -310, -310, 59, 2465, 2727, -310, 71, - -310, -310, -12, -310, 1002, 81, 82, -310, -310, 1002, - -310, -310, -310, 1115, -310, 1002, -310, -310, 124, 708, - 108, 129, 97, 1002, 1002, 107, 1002, 1002, 1002, -310, - -310, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, - 1002, 1002, -310, 1002, 133, -34, -34, 1169, -34, -34, - -310, 1002, 1002, 1002, 1002, 1002, 1002, 137, 1002, 1002, - 1002, 1002, 1002, 2, 2, 1002, 1002, 1002, 1002, 1002, - 1002, 1002, 1002, 1002, 1002, 1002, 750, -310, 141, 143, - 1223, 9, 1002, 1277, -310, 1331, 549, 127, 792, 1385, - 156, 162, 1002, 1439, 1493, 183, 1007, 1061, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - -39, 2465, 131, 149, 159, -310, 292, 292, -34, -34, - 2722, 2722, -43, 2606, 2664, -34, 2635, 2786, -310, -310, - 39, 39, 2693, 2693, 2722, 2722, 2577, 2548, 2786, 1547, - 2786, 1002, 2465, -310, 142, 154, 160, -310, 1002, 158, - 2465, 158, 489, 489, -310, -310, 1002, 319, 1601, 834, - 1002, 1002, 1655, 157, 161, 5, -310, -310, 179, 1002, - -310, 1002, 2747, -310, 1002, 1002, 1002, 1002, 1002, -31, - 165, 190, 141, 135, 197, 171, 171, 231, -310, 1709, - 489, 1763, 876, 918, 1817, 1871, 1925, 184, 217, 217, - 187, -310, 194, 1979, 2465, 1002, -310, 2465, 199, 200, - -38, 2519, -310, -310, -310, 204, 158, -310, 1002, 205, - 211, 489, -310, -310, 489, 489, 2033, 489, 2087, 960, - 489, 489, 193, 1002, 207, 210, -310, -310, -310, 2465, - -310, -310, -310, 594, 214, 171, 149, 216, 222, -310, - -310, -310, 489, -310, 489, 489, 2141, -310, -310, 70, - -5, 2465, -310, -310, -310, -310, 221, 213, 213, -310, - -310, -310, 489, 233, -30, 246, 224, 70, -310, 1002, - -310, 639, 226, 228, 227, 23, 213, 229, -310, 1002, - 1002, 1002, -29, 230, -310, 2465, 444, -310, 213, -310, - -310, 235, 23, -310, 2195, 2249, -23, 1002, 1002, -310, - 237, -310, 236, -310, -310, -310, 248, 2303, -19, -310, - -310, 1002, -310, 249, 684, 2357, 1002, -310, 2411, -310 +static const short yypact[] = {-32768, + 210, -14, -2, -2, -38, -28, -11, 829, 4, 418, + 13, 64, 69, -2, 70, 71, 85, 72,-32768, 52, + 462, -40,-32768,-32768,-32768,-32768, 1225, 1225, 1225, 1225, + 1225,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 75, 2688, 560,-32768, 76,-32768,-32768, -22, + 92,-32768, 1225, 81, 86,-32768,-32768, 1225, 88,-32768, +-32768,-32768, 1338,-32768, 1225,-32768,-32768, 116, 873, 103, + 107, 90, 1225, 1225, 96, 1225, 1225, 1225,-32768,-32768, + 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, + 1225,-32768, 1225, 93, 30, 30, 1392, 30, 30,-32768, + 1225, 1225, 1225, 1225, 1225, 1225, 108, 1225, 1225, 1225, + 1225, 1225, -2, -2, 1225, 1225, 1225, 1225, 1225, 1225, + 1225, 1225, 1225, 1225, 1225, 917,-32768, 92, 110,-32768, + 98, 95, 1446, 20, 1225, 1500,-32768, 1554, 550, 105, + 961, 1608, 138, 139, 1225, 1662, 1716, 164, 1230, 1284, + 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, + 2688, 2688, -39, 2688, 117, 115, 119,-32768, 47, 47, + 30, 30, 2945, 2945, -25, 2829, 2887, 30, 2858, 257, +-32768,-32768, 421, 421, 2916, 2916, 2945, 2945, 2800, 2771, + 257, 1770, 257, 1225, 2688, 121, 120, 118, 151,-32768, + 1225, 133, 2688, 133, 418, 418,-32768,-32768, 1225, 1005, + 1824, 1049, 1225, 1225, 1878, 132, 134, 155, 11,-32768, +-32768, 154, 1225,-32768, 1225, 2950,-32768, 1225, 1225, 1225, + 1225, 1225, -15, 136, 92,-32768,-32768, 101, 159, 141, + 141, 193,-32768, 1932, 418, 1986, 1093, 1137, 2040, 2094, + 2148, 146, 177, 177, 147,-32768, 153, 2202, 2688, 1225, +-32768, 2688, 156, 158, -35, 2742,-32768,-32768, 162, 650, + 133,-32768, 1225, 166, 170, 418,-32768,-32768, 418, 418, + 2256, 418, 2310, 1181, 418, 418, 150, 1225, 167, 168, +-32768,-32768,-32768, 2688,-32768,-32768,-32768, 695, 160,-32768, + 141, 115, 173, 176,-32768,-32768,-32768, 418,-32768, 418, + 418, 2364,-32768,-32768, 68, 12, 2688,-32768,-32768,-32768, +-32768, 171, 94, 94,-32768,-32768,-32768, 418, 161, -21, + 200, 179, 68,-32768, 1225,-32768, 740, 181, 184, 188, + 99, 94, 196,-32768, 1225, 1225, 1225, -18, 195,-32768, + 2688, 144,-32768, 94,-32768,-32768, 199, 99,-32768, 2418, + 2472, -9, 1225, 1225,-32768, 201,-32768, 202,-32768,-32768, +-32768, 211, 2526, -8,-32768,-32768, 1225,-32768, 212, 785, + 2580, 1225,-32768, 2634,-32768, 260, 264,-32768 }; -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -310, -310, -310, -310, -310, -310, -256, -1, -140, 64, - -310, -310, -94, -188, -121, -230, -309, -28, 30, -310, - -246, -310, -310, -310, -310, -310, -310, 38, -310, -310, - 19, -45, -2, -310, -310, -138, -187, -310, 0, -300, - -190 +static const short yypgoto[] = {-32768, +-32768,-32768,-32768,-32768, -233, 0, -132, -120,-32768,-32768, + -304, -176, -123, -228, -277, -76, -200,-32768, -243,-32768, +-32768,-32768,-32768,-32768,-32768, 285,-32768,-32768, 3, -43, + -1,-32768,-32768, -108, -184,-32768, -48, -299, -227 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -76 -static const yytype_int16 yytable[] = -{ - 49, 36, 127, 285, 229, 216, 270, 293, 4, 337, - 49, 201, 226, 236, 5, 6, 60, 107, 221, 221, - 340, 357, 93, 329, 247, 56, 224, 344, 5, 6, - 262, 3, 113, 114, 221, 72, 344, 260, 221, 362, - 53, 20, 52, 128, 21, 61, 23, 24, 63, 227, - 26, 27, 28, 330, 29, 30, 57, 54, 94, 331, - 222, 292, 341, 358, 31, 316, 250, 95, 96, 97, - 98, 99, 32, 33, 346, 251, 366, 233, 295, 129, - 373, 296, 59, 101, 102, 103, 104, 258, 259, 65, - 107, 58, 130, 110, 323, 69, 70, 133, 71, 73, - 361, 198, 74, 135, 75, 113, 114, 139, 324, 325, - 76, 143, 144, 374, 146, 147, 148, 77, 100, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - -75, 161, 178, 179, 49, 205, 131, 132, 137, 166, - 167, 168, 169, 170, 171, 140, 173, 174, 175, 176, - 177, 356, 142, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 192, 78, 141, 145, 368, 200, - 200, 164, 5, 6, 60, 172, 208, 256, 193, 210, - 212, 196, 206, 79, 80, 211, 4, 223, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 230, 20, - 49, 49, 21, 61, 23, 24, 224, 91, 26, 27, - 28, 231, 29, 30, 225, 232, 234, 248, 5, 6, - 252, 249, 31, 333, 333, 263, 62, 264, 268, 161, - 32, 33, 237, 238, 266, 267, 200, 323, 49, 271, - 282, 351, 333, 283, 239, 241, 286, 244, 245, 246, - 287, 324, 325, 309, 333, 290, 291, 253, 351, 254, - 294, 297, 257, 161, 161, 159, 261, 298, 312, 49, - 273, 313, 49, 49, 315, 49, 317, 332, 49, 49, - 276, 278, 318, 339, 342, 343, 348, 349, 350, 359, - 353, 49, 205, 289, 363, 369, 265, 370, 371, 376, - 49, 299, 49, 49, 300, 301, 161, 303, 352, 327, - 307, 308, 0, 0, 0, 0, 0, 306, 0, 0, - 49, 311, 0, 0, 5, 6, 60, 0, 0, 49, - 205, 0, 319, 0, 320, 321, 0, 0, 103, 104, - 0, 0, 0, 107, 49, 205, 110, 0, 0, 0, - 0, 20, 338, 0, 21, 61, 23, 24, 113, 114, - 26, 27, 28, 0, 29, 30, 0, 345, 0, 0, - 0, 0, 49, 205, 31, 240, 0, 354, 355, 159, - 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 367, 159, 0, 0, 0, - 4, 0, 5, 6, 7, 0, 8, 0, 9, 375, - 10, 11, 12, 0, 378, 0, 0, 13, 14, 15, - 0, 16, 17, 0, 18, 0, 19, 0, 0, 20, - 0, 0, 21, 22, 23, 24, 0, 25, 26, 27, - 28, 0, 29, 30, 0, 0, 0, 0, 0, 5, - 6, 7, 31, 8, 0, 9, 0, 10, 11, 12, - 32, 33, 0, 360, 13, 14, 15, 0, 16, 17, - 283, 18, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 5, 6, 7, 0, 8, 31, - 9, 0, 10, 11, 12, 0, 0, 32, 33, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 66, - 0, 0, 32, 33, 5, 6, 7, 0, 8, 0, - 9, 0, 10, 11, 12, 0, 0, 0, 0, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 5, - 6, 7, 0, 8, 31, 9, 0, 10, 11, 12, - 204, 0, 32, 33, 13, 14, 15, 0, 16, 17, - 0, 18, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 5, 6, 7, 0, 8, 31, - 9, 0, 10, 11, 12, 314, 0, 32, 33, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 5, - 6, 7, 0, 8, 31, 9, 0, 10, 11, 12, - 347, 0, 32, 33, 13, 14, 15, 0, 16, 17, - 0, 18, 0, 5, 6, 60, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 20, 0, 0, 21, 61, 23, 24, 32, 33, 26, - 27, 28, 0, 29, 30, 5, 6, 60, 0, 0, - 0, 0, 0, 31, 0, 0, 0, 138, 0, 0, - 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 21, 61, 23, 24, 0, - 0, 26, 27, 28, 0, 29, 30, 5, 6, 60, - 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 191, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 21, 61, 23, - 24, 0, 0, 26, 27, 28, 0, 29, 30, 5, - 6, 60, 0, 0, 0, 0, 0, 31, 0, 0, - 0, 207, 0, 0, 0, 32, 33, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, - 61, 23, 24, 0, 0, 26, 27, 28, 0, 29, - 30, 5, 6, 60, 0, 0, 0, 0, 0, 31, - 0, 0, 0, 243, 0, 0, 0, 32, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, - 0, 21, 61, 23, 24, 0, 0, 26, 27, 28, - 0, 29, 30, 5, 6, 60, 0, 0, 0, 0, - 0, 31, 275, 0, 0, 0, 0, 0, 0, 32, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 21, 61, 23, 24, 0, 0, 26, - 27, 28, 0, 29, 30, 5, 6, 60, 0, 0, - 0, 0, 0, 31, 277, 0, 0, 0, 0, 0, - 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 21, 61, 23, 24, 0, - 0, 26, 27, 28, 0, 29, 30, 5, 6, 60, - 0, 0, 0, 0, 0, 31, 305, 0, 0, 0, - 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 21, 61, 23, - 24, 0, 0, 26, 27, 28, 0, 29, 30, 0, - 0, 101, 102, 103, 104, 105, 106, 31, 107, 108, - 109, 110, 0, 217, 218, 32, 33, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 219, 0, - 220, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 134, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 165, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 197, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 202, 0, 0, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 203, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 209, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 213, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 214, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 228, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, - 242, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 234, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 272, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 274, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 0, 279, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 280, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 281, 0, 0, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 288, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 302, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 304, 0, 0, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 322, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 364, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 365, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 0, - 0, 0, 372, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 0, 377, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, - 379, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 101, 102, 103, 104, 105, 106, 0, 107, - 108, 109, 110, 117, 118, 119, 120, 121, 122, 123, - 111, 0, 0, 112, 113, 114, 125, 0, 0, 115, - 116, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 117, 118, 119, 120, 121, 0, 123, 111, - 0, 0, 112, 113, 114, 125, 0, 0, 115, 116, - 101, 102, 103, 104, 105, 106, 0, 107, 0, 109, - 110, 117, 118, 119, 120, 0, 0, 123, 111, 0, - 0, 112, 113, 114, 125, 0, 0, 115, 116, 101, - 102, 103, 104, 105, 106, 0, 107, 0, 109, 110, - 117, 118, 119, 120, 0, 0, 123, 0, 0, 0, - 112, 113, 114, 125, 0, 0, 115, 116, 101, 102, - 103, 104, 105, 106, 0, 107, 0, 0, 110, 117, - 118, 119, 120, 0, 0, 123, 0, 0, 0, 112, - 113, 114, 125, 0, 0, 115, 116, 101, 102, 103, - 104, 105, 106, 0, 107, 0, 0, 110, 117, 118, - 119, 120, 0, 0, 123, 0, 0, 0, 112, 113, - 114, 125, 0, 0, 115, 116, 101, 102, 103, 104, - 0, 0, 0, 107, 0, 0, 110, 126, 0, 119, - 120, 0, 0, 123, 0, 0, 0, 112, 113, 114, - 125, 0, 0, 115, 116, 79, 80, 255, 0, 0, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 0, 0, 123, 0, 0, 79, 80, 0, 0, 125, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 101, 102, 103, 104, 0, 0, 0, 107, 0, 0, - 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 113, 114, 0, 0, 0, 115, 116 + +#define YYLAST 3042 + + +static const short yytable[] = { 47, + 34, 127, 270, 265, 242, 243, 55, 196, 47, 233, + 290, 204, 275, 218, 93, 220, 72, 225, 339, 339, + 56, 225, 59, 50, 3, 4, 60, 241, 346, 230, + 57, 363, 128, 350, 298, 52, 357, 339, 252, 335, + 51, 228, 350, 58, 278, 267, 343, 225, 225, 339, + 94, 18, 53, 357, 19, 61, 21, 22, 65, 226, + 24, 25, 26, 297, 27, 28, 231, 69, 129, 336, + 347, 255, 322, 364, 29, 305, 368, 238, 306, 307, + 107, 309, 30, 31, 313, 314, 256, 337, 302, 372, + 379, 329, 103, 104, 301, 113, 114, 107, 3, 4, + 110, 77, 352, 3, 4, 330, 331, 325, 367, 326, + 327, 201, 113, 114, 269, 181, 182, 329, 70, 362, + 263, 264, 75, 71, 73, 74, 76, 344, 130, 140, + 167, 330, 331, 100, -74, 134, 374, 47, 208, 143, + 135, 380, 51, 144, 145, 175, 59, 197, 3, 4, + 5, 199, 6, 198, 7, 148, 8, 9, 10, 209, + 213, 214, 366, 11, 12, 13, 218, 14, 15, 288, + 16, 228, 227, 229, 235, 18, 234, 236, 19, 20, + 21, 22, 261, 23, 24, 25, 26, 237, 27, 28, + 239, 253, 50, 254, 257, 268, 272, 273, 29, 271, + 276, 287, 288, 47, 47, 291, 30, 31, 292, 315, + 345, 295, 2, 296, 3, 4, 5, 299, 6, 321, + 7, 303, 8, 9, 10, 304, 338, 318, 319, 11, + 12, 13, 323, 14, 15, 324, 16, 348, 17, 349, + 354, 18, 355, 47, 19, 20, 21, 22, 356, 23, + 24, 25, 26, 365, 27, 28, 359, 369, 375, 387, + 377, 382, 376, 388, 29, 358, 333, 0, 47, 208, + 0, 0, 30, 31, 47, 0, 0, 47, 47, 0, + 47, 0, 0, 47, 47, 0, 0, 0, 0, 0, + 0, 0, 63, 0, 0, 0, 47, 208, 0, 0, + 101, 102, 103, 104, 0, 0, 47, 107, 47, 47, + 110, 95, 96, 97, 98, 99, 0, 0, 0, 0, + 0, 0, 113, 114, 0, 0, 47, 115, 116, 0, + 0, 0, 0, 0, 0, 47, 208, 133, 0, 0, + 0, 0, 136, 0, 0, 0, 0, 0, 0, 138, + 47, 208, 0, 142, 0, 0, 0, 146, 147, 0, + 149, 150, 151, 0, 0, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 0, 164, 47, 208, + 0, 0, 0, 0, 0, 169, 170, 171, 172, 173, + 174, 0, 176, 177, 178, 179, 180, 0, 0, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 195, 0, 0, 0, 0, 0, 0, 0, 203, 203, + 59, 0, 3, 4, 5, 211, 6, 0, 7, 215, + 8, 9, 10, 0, 0, 0, 0, 11, 12, 13, + 0, 14, 15, 0, 16, 0, 0, 0, 0, 18, + 0, 0, 19, 20, 21, 22, 0, 23, 24, 25, + 26, 0, 27, 28, 101, 102, 103, 104, 0, 0, + 0, 107, 29, 0, 110, 0, 0, 66, 164, 0, + 30, 31, 0, 0, 0, 203, 113, 114, 0, 0, + 0, 0, 0, 244, 246, 0, 249, 250, 251, 0, + 0, 0, 0, 0, 0, 0, 0, 258, 0, 259, + 0, 78, 262, 164, 164, 162, 266, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, + 80, 281, 283, 0, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 294, 0, 0, 0, 0, 0, + 0, 0, 59, 91, 3, 4, 5, 164, 6, 0, + 7, 0, 8, 9, 10, 0, 0, 0, 312, 11, + 12, 13, 317, 14, 15, 0, 16, 0, 0, 0, + 0, 18, 0, 0, 19, 20, 21, 22, 0, 23, + 24, 25, 26, 0, 27, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 126, + 207, 0, 30, 31, 0, 0, 0, 0, 0, 351, + 0, 0, 0, 0, 0, 0, 0, 79, 80, 360, + 361, 162, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 0, 0, 0, 0, 0, 373, 162, 0, + 0, 0, 59, 0, 3, 4, 5, 0, 6, 0, + 7, 381, 8, 9, 10, 0, 384, 0, 0, 11, + 12, 13, 0, 14, 15, 0, 16, 0, 0, 0, + 0, 18, 0, 0, 19, 20, 21, 22, 0, 23, + 24, 25, 26, 0, 27, 28, 0, 59, 0, 3, + 4, 5, 0, 6, 29, 7, 0, 8, 9, 10, + 300, 0, 30, 31, 11, 12, 13, 0, 14, 15, + 0, 16, 0, 0, 0, 0, 18, 0, 0, 19, + 20, 21, 22, 0, 23, 24, 25, 26, 0, 27, + 28, 0, 59, 0, 3, 4, 5, 0, 6, 29, + 7, 0, 8, 9, 10, 320, 0, 30, 31, 11, + 12, 13, 0, 14, 15, 0, 16, 0, 0, 0, + 0, 18, 0, 0, 19, 20, 21, 22, 0, 23, + 24, 25, 26, 0, 27, 28, 0, 59, 0, 3, + 4, 5, 0, 6, 29, 7, 0, 8, 9, 10, + 353, 0, 30, 31, 11, 12, 13, 0, 14, 15, + 0, 16, 0, 0, 0, 0, 18, 0, 0, 19, + 20, 21, 22, 0, 23, 24, 25, 26, 0, 27, + 28, 59, 0, 3, 4, 60, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 30, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 0, 0, 19, 61, 21, 22, 0, 0, 24, + 25, 26, 0, 27, 28, 59, 0, 3, 4, 60, + 0, 0, 0, 29, 0, 0, 0, 62, 0, 0, + 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 0, 0, 19, 61, 21, + 22, 0, 0, 24, 25, 26, 0, 27, 28, 59, + 0, 3, 4, 60, 0, 0, 0, 29, 0, 0, + 0, 141, 0, 0, 0, 30, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 19, 61, 21, 22, 0, 0, 24, 25, 26, + 0, 27, 28, 59, 0, 3, 4, 60, 0, 0, + 0, 29, 0, 0, 0, 0, 194, 0, 0, 30, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 19, 61, 21, 22, 0, + 0, 24, 25, 26, 0, 27, 28, 59, 0, 3, + 4, 60, 0, 0, 0, 29, 0, 0, 0, 210, + 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 0, 0, 19, + 61, 21, 22, 0, 0, 24, 25, 26, 0, 27, + 28, 59, 0, 3, 4, 60, 0, 0, 0, 29, + 245, 0, 0, 0, 0, 0, 0, 30, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 0, 0, 19, 61, 21, 22, 0, 0, 24, + 25, 26, 0, 27, 28, 59, 0, 3, 4, 60, + 0, 0, 0, 29, 0, 0, 0, 248, 0, 0, + 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 0, 0, 19, 61, 21, + 22, 0, 0, 24, 25, 26, 0, 27, 28, 59, + 0, 3, 4, 60, 0, 0, 0, 29, 280, 0, + 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 19, 61, 21, 22, 0, 0, 24, 25, 26, + 0, 27, 28, 59, 0, 3, 4, 60, 0, 0, + 0, 29, 282, 0, 0, 0, 0, 0, 0, 30, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 19, 61, 21, 22, 0, + 0, 24, 25, 26, 0, 27, 28, 59, 0, 3, + 4, 60, 0, 0, 0, 29, 311, 0, 0, 0, + 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 0, 0, 19, + 61, 21, 22, 0, 0, 24, 25, 26, 0, 27, + 28, 0, 0, 101, 102, 103, 104, 105, 106, 29, + 107, 108, 109, 110, 0, 221, 222, 30, 31, 0, + 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, + 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, + 104, 105, 106, 0, 107, 108, 109, 110, 0, 0, + 223, 0, 224, 0, 0, 111, 0, 0, 112, 113, + 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, + 109, 110, 0, 0, 0, 0, 137, 0, 0, 111, + 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, + 106, 0, 107, 108, 109, 110, 0, 168, 0, 0, + 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, + 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, + 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, + 0, 200, 0, 0, 0, 0, 0, 111, 0, 0, + 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, + 107, 108, 109, 110, 0, 205, 0, 0, 0, 0, + 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, + 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, + 104, 105, 106, 0, 107, 108, 109, 110, 0, 206, + 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, + 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, + 109, 110, 0, 0, 0, 0, 212, 0, 0, 111, + 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, + 106, 0, 107, 108, 109, 110, 0, 216, 0, 0, + 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, + 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, + 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, + 0, 217, 0, 0, 0, 0, 0, 111, 0, 0, + 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, + 107, 108, 109, 110, 0, 0, 0, 232, 0, 0, + 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, + 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, + 104, 105, 106, 0, 107, 108, 109, 110, 0, 0, + 0, 0, 247, 0, 0, 111, 0, 0, 112, 113, + 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, + 109, 110, 0, 0, 0, 239, 0, 0, 0, 111, + 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, + 106, 0, 107, 108, 109, 110, 0, 277, 0, 0, + 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, + 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, + 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, + 0, 279, 0, 0, 0, 0, 0, 111, 0, 0, + 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, + 107, 108, 109, 110, 0, 0, 0, 0, 284, 0, + 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, + 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, + 104, 105, 106, 0, 107, 108, 109, 110, 0, 285, + 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, + 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, + 109, 110, 0, 286, 0, 0, 0, 0, 0, 111, + 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, + 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, + 293, 0, 0, 111, 0, 0, 112, 113, 114, 0, + 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, + 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, + 0, 308, 0, 0, 0, 0, 0, 111, 0, 0, + 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, + 107, 108, 109, 110, 0, 310, 0, 0, 0, 0, + 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, + 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, + 104, 105, 106, 0, 107, 108, 109, 110, 0, 328, + 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, + 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, + 109, 110, 0, 0, 0, 0, 370, 0, 0, 111, + 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, + 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, + 371, 0, 0, 111, 0, 0, 112, 113, 114, 0, + 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, + 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, + 0, 0, 0, 0, 378, 0, 0, 111, 0, 0, + 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, + 107, 108, 109, 110, 0, 0, 0, 0, 383, 0, + 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, + 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, + 104, 105, 106, 0, 107, 108, 109, 110, 0, 0, + 0, 0, 385, 0, 0, 111, 0, 0, 112, 113, + 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, + 109, 110, 0, 0, 0, 0, 0, 0, 0, 111, + 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, + 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, + 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, + 0, 0, 115, 116, 101, 102, 103, 104, 105, 106, + 0, 107, 108, 109, 110, 117, 118, 119, 120, 121, + 122, 123, 111, 0, 0, 112, 113, 114, 125, 0, + 0, 115, 116, 101, 102, 103, 104, 105, 106, 0, + 107, 108, 109, 110, 117, 118, 119, 120, 121, 0, + 123, 111, 0, 0, 112, 113, 114, 125, 0, 0, + 115, 116, 101, 102, 103, 104, 105, 106, 0, 107, + 0, 109, 110, 117, 118, 119, 120, 0, 0, 123, + 111, 0, 0, 112, 113, 114, 125, 0, 0, 115, + 116, 101, 102, 103, 104, 105, 106, 0, 107, 0, + 109, 110, 117, 118, 119, 120, 0, 0, 123, 0, + 0, 0, 112, 113, 114, 125, 0, 0, 115, 116, + 101, 102, 103, 104, 105, 106, 0, 107, 0, 0, + 110, 117, 118, 119, 120, 0, 0, 123, 0, 0, + 0, 112, 113, 114, 125, 0, 0, 115, 116, 101, + 102, 103, 104, 105, 106, 0, 107, 0, 0, 110, + 117, 118, 119, 120, 0, 0, 123, 0, 0, 0, + 112, 113, 114, 125, 0, 0, 115, 116, 101, 102, + 103, 104, 0, 0, 0, 107, 0, 0, 110, 260, + 0, 119, 120, 0, 0, 123, 0, 0, 0, 112, + 113, 114, 125, 0, 0, 115, 116, 79, 80, 0, + 0, 0, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 0, 0, 123, 0, 0, 0, 0, 0, + 0, 125 }; -static const yytype_int16 yycheck[] = -{ - 2, 2, 47, 249, 191, 145, 236, 263, 3, 318, - 12, 132, 55, 201, 5, 6, 7, 51, 57, 57, - 50, 50, 55, 28, 212, 6, 57, 327, 5, 6, - 61, 0, 66, 67, 57, 16, 336, 227, 57, 348, - 38, 32, 38, 55, 35, 36, 37, 38, 10, 92, - 41, 42, 43, 58, 45, 46, 59, 55, 91, 315, - 99, 99, 92, 92, 55, 295, 61, 29, 30, 31, - 32, 33, 63, 64, 330, 215, 99, 198, 266, 91, - 99, 268, 55, 44, 45, 46, 47, 225, 226, 55, - 51, 59, 54, 54, 24, 55, 55, 59, 55, 55, - 346, 92, 55, 65, 38, 66, 67, 69, 38, 39, - 55, 73, 74, 369, 76, 77, 78, 50, 59, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 59, 93, 113, 114, 136, 136, 55, 55, 14, 101, - 102, 103, 104, 105, 106, 37, 108, 109, 110, 111, - 112, 341, 55, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 50, 37, 60, 358, 131, - 132, 38, 5, 6, 7, 38, 138, 222, 37, 23, - 142, 38, 55, 68, 69, 23, 3, 56, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 56, 32, - 202, 203, 35, 36, 37, 38, 57, 92, 41, 42, - 43, 57, 45, 46, 55, 55, 58, 60, 5, 6, - 41, 60, 55, 317, 318, 60, 59, 37, 57, 191, - 63, 64, 202, 203, 99, 38, 198, 24, 240, 8, - 56, 335, 336, 26, 206, 207, 59, 209, 210, 211, - 56, 38, 39, 60, 348, 56, 56, 219, 352, 221, - 56, 56, 224, 225, 226, 227, 228, 56, 61, 271, - 240, 61, 274, 275, 60, 277, 60, 56, 280, 281, - 242, 243, 60, 50, 38, 61, 60, 59, 61, 59, - 61, 293, 293, 255, 59, 58, 232, 61, 50, 50, - 302, 271, 304, 305, 274, 275, 268, 277, 336, 309, - 280, 281, -1, -1, -1, -1, -1, 279, -1, -1, - 322, 283, -1, -1, 5, 6, 7, -1, -1, 331, - 331, -1, 302, -1, 304, 305, -1, -1, 46, 47, - -1, -1, -1, 51, 346, 346, 54, -1, -1, -1, - -1, 32, 322, -1, 35, 36, 37, 38, 66, 67, - 41, 42, 43, -1, 45, 46, -1, 329, -1, -1, - -1, -1, 374, 374, 55, 56, -1, 339, 340, 341, - -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 357, 358, -1, -1, -1, - 3, -1, 5, 6, 7, -1, 9, -1, 11, 371, - 13, 14, 15, -1, 376, -1, -1, 20, 21, 22, - -1, 24, 25, -1, 27, -1, 29, -1, -1, 32, - -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, - 43, -1, 45, 46, -1, -1, -1, -1, -1, 5, - 6, 7, 55, 9, -1, 11, -1, 13, 14, 15, - 63, 64, -1, 19, 20, 21, 22, -1, 24, 25, - 26, 27, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, 5, 6, 7, -1, 9, 55, - 11, -1, 13, 14, 15, -1, -1, 63, 64, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, -1, - -1, -1, -1, -1, 55, -1, -1, -1, -1, 60, - -1, -1, 63, 64, 5, 6, 7, -1, 9, -1, - 11, -1, 13, 14, 15, -1, -1, -1, -1, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, 5, - 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, - 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, - -1, 27, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, 5, 6, 7, -1, 9, 55, - 11, -1, 13, 14, 15, 61, -1, 63, 64, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, 5, - 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, - 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, - -1, 27, -1, 5, 6, 7, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 32, -1, -1, 35, 36, 37, 38, 63, 64, 41, - 42, 43, -1, 45, 46, 5, 6, 7, -1, -1, - -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, - -1, 41, 42, 43, -1, 45, 46, 5, 6, 7, - -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, - 60, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, - 38, -1, -1, 41, 42, 43, -1, 45, 46, 5, - 6, 7, -1, -1, -1, -1, -1, 55, -1, -1, - -1, 59, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, - 46, 5, 6, 7, -1, -1, -1, -1, -1, 55, - -1, -1, -1, 59, -1, -1, -1, 63, 64, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, - -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, - -1, 45, 46, 5, 6, 7, -1, -1, -1, -1, - -1, 55, 56, -1, -1, -1, -1, -1, -1, 63, - 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, - 42, 43, -1, 45, 46, 5, 6, 7, -1, -1, - -1, -1, -1, 55, 56, -1, -1, -1, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, - -1, 41, 42, 43, -1, 45, 46, 5, 6, 7, - -1, -1, -1, -1, -1, 55, 56, -1, -1, -1, - -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, - 38, -1, -1, 41, 42, 43, -1, 45, 46, -1, - -1, 44, 45, 46, 47, 48, 49, 55, 51, 52, - 53, 54, -1, 56, 57, 63, 64, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, 57, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, 58, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, 58, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, 44, 45, 46, 47, 48, 49, -1, 51, - 52, 53, 54, 84, 85, 86, 87, 88, 89, 90, - 62, -1, -1, 65, 66, 67, 97, -1, -1, 71, - 72, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, 84, 85, 86, 87, 88, -1, 90, 62, - -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, - 44, 45, 46, 47, 48, 49, -1, 51, -1, 53, - 54, 84, 85, 86, 87, -1, -1, 90, 62, -1, - -1, 65, 66, 67, 97, -1, -1, 71, 72, 44, - 45, 46, 47, 48, 49, -1, 51, -1, 53, 54, - 84, 85, 86, 87, -1, -1, 90, -1, -1, -1, - 65, 66, 67, 97, -1, -1, 71, 72, 44, 45, - 46, 47, 48, 49, -1, 51, -1, -1, 54, 84, - 85, 86, 87, -1, -1, 90, -1, -1, -1, 65, - 66, 67, 97, -1, -1, 71, 72, 44, 45, 46, - 47, 48, 49, -1, 51, -1, -1, 54, 84, 85, - 86, 87, -1, -1, 90, -1, -1, -1, 65, 66, - 67, 97, -1, -1, 71, 72, 44, 45, 46, 47, - -1, -1, -1, 51, -1, -1, 54, 50, -1, 86, - 87, -1, -1, 90, -1, -1, -1, 65, 66, 67, - 97, -1, -1, 71, 72, 68, 69, 50, -1, -1, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - -1, -1, 90, -1, -1, 68, 69, -1, -1, 97, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 44, 45, 46, 47, -1, -1, -1, 51, -1, -1, - 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 66, 67, -1, -1, -1, 71, 72 +static const short yycheck[] = { 1, + 1, 45, 236, 231, 205, 206, 4, 128, 10, 194, + 254, 135, 241, 3, 55, 148, 14, 57, 323, 324, + 59, 57, 3, 38, 5, 6, 7, 204, 50, 55, + 59, 50, 55, 333, 268, 38, 341, 342, 215, 28, + 55, 57, 342, 55, 245, 61, 324, 57, 57, 354, + 91, 32, 55, 358, 35, 36, 37, 38, 55, 99, + 41, 42, 43, 99, 45, 46, 92, 55, 91, 58, + 92, 61, 301, 92, 55, 276, 354, 201, 279, 280, + 51, 282, 63, 64, 285, 286, 219, 321, 273, 99, + 99, 24, 46, 47, 271, 66, 67, 51, 5, 6, + 54, 50, 336, 5, 6, 38, 39, 308, 352, 310, + 311, 92, 66, 67, 235, 113, 114, 24, 55, 347, + 229, 230, 38, 55, 55, 55, 55, 328, 37, 14, + 38, 38, 39, 59, 59, 55, 364, 139, 139, 37, + 55, 375, 55, 37, 55, 38, 3, 38, 5, 6, + 7, 57, 9, 56, 11, 60, 13, 14, 15, 55, + 23, 23, 19, 20, 21, 22, 3, 24, 25, 26, + 27, 57, 56, 55, 55, 32, 56, 60, 35, 36, + 37, 38, 226, 40, 41, 42, 43, 37, 45, 46, + 58, 60, 38, 60, 41, 60, 38, 57, 55, 99, + 8, 56, 26, 205, 206, 59, 63, 64, 56, 60, + 50, 56, 3, 56, 5, 6, 7, 56, 9, 60, + 11, 56, 13, 14, 15, 56, 56, 61, 61, 20, + 21, 22, 60, 24, 25, 60, 27, 38, 29, 61, + 60, 32, 59, 245, 35, 36, 37, 38, 61, 40, + 41, 42, 43, 59, 45, 46, 61, 59, 58, 0, + 50, 50, 61, 0, 55, 342, 315, -1, 270, 270, + -1, -1, 63, 64, 276, -1, -1, 279, 280, -1, + 282, -1, -1, 285, 286, -1, -1, -1, -1, -1, + -1, -1, 8, -1, -1, -1, 298, 298, -1, -1, + 44, 45, 46, 47, -1, -1, 308, 51, 310, 311, + 54, 27, 28, 29, 30, 31, -1, -1, -1, -1, + -1, -1, 66, 67, -1, -1, 328, 71, 72, -1, + -1, -1, -1, -1, -1, 337, 337, 53, -1, -1, + -1, -1, 58, -1, -1, -1, -1, -1, -1, 65, + 352, 352, -1, 69, -1, -1, -1, 73, 74, -1, + 76, 77, 78, -1, -1, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, -1, 93, 380, 380, + -1, -1, -1, -1, -1, 101, 102, 103, 104, 105, + 106, -1, 108, 109, 110, 111, 112, -1, -1, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, -1, -1, -1, -1, -1, -1, -1, 134, 135, + 3, -1, 5, 6, 7, 141, 9, -1, 11, 145, + 13, 14, 15, -1, -1, -1, -1, 20, 21, 22, + -1, 24, 25, -1, 27, -1, -1, -1, -1, 32, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, 45, 46, 44, 45, 46, 47, -1, -1, + -1, 51, 55, -1, 54, -1, -1, 60, 194, -1, + 63, 64, -1, -1, -1, 201, 66, 67, -1, -1, + -1, -1, -1, 209, 210, -1, 212, 213, 214, -1, + -1, -1, -1, -1, -1, -1, -1, 223, -1, 225, + -1, 50, 228, 229, 230, 231, 232, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, + 69, 247, 248, -1, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 260, -1, -1, -1, -1, -1, + -1, -1, 3, 92, 5, 6, 7, 273, 9, -1, + 11, -1, 13, 14, 15, -1, -1, -1, 284, 20, + 21, 22, 288, 24, 25, -1, 27, -1, -1, -1, + -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, + 41, 42, 43, -1, 45, 46, -1, -1, -1, -1, + -1, -1, -1, -1, 55, -1, -1, -1, -1, 50, + 61, -1, 63, 64, -1, -1, -1, -1, -1, 335, + -1, -1, -1, -1, -1, -1, -1, 68, 69, 345, + 346, 347, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, -1, -1, -1, -1, -1, 363, 364, -1, + -1, -1, 3, -1, 5, 6, 7, -1, 9, -1, + 11, 377, 13, 14, 15, -1, 382, -1, -1, 20, + 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, + -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, + 41, 42, 43, -1, 45, 46, -1, 3, -1, 5, + 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, + 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, + -1, 27, -1, -1, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, + 46, -1, 3, -1, 5, 6, 7, -1, 9, 55, + 11, -1, 13, 14, 15, 61, -1, 63, 64, 20, + 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, + -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, + 41, 42, 43, -1, 45, 46, -1, 3, -1, 5, + 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, + 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, + -1, 27, -1, -1, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, + 46, 3, -1, 5, 6, 7, -1, -1, -1, 55, + -1, -1, -1, -1, -1, -1, -1, 63, 64, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, + 42, 43, -1, 45, 46, 3, -1, 5, 6, 7, + -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, + -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, + 38, -1, -1, 41, 42, 43, -1, 45, 46, 3, + -1, 5, 6, 7, -1, -1, -1, 55, -1, -1, + -1, 59, -1, -1, -1, 63, 64, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, + -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, + -1, 45, 46, 3, -1, 5, 6, 7, -1, -1, + -1, 55, -1, -1, -1, -1, 60, -1, -1, 63, + 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, + -1, 41, 42, 43, -1, 45, 46, 3, -1, 5, + 6, 7, -1, -1, -1, 55, -1, -1, -1, 59, + -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, + 46, 3, -1, 5, 6, 7, -1, -1, -1, 55, + 56, -1, -1, -1, -1, -1, -1, 63, 64, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, + 42, 43, -1, 45, 46, 3, -1, 5, 6, 7, + -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, + -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, + 38, -1, -1, 41, 42, 43, -1, 45, 46, 3, + -1, 5, 6, 7, -1, -1, -1, 55, 56, -1, + -1, -1, -1, -1, -1, 63, 64, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, + -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, + -1, 45, 46, 3, -1, 5, 6, 7, -1, -1, + -1, 55, 56, -1, -1, -1, -1, -1, -1, 63, + 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, + -1, 41, 42, 43, -1, 45, 46, 3, -1, 5, + 6, 7, -1, -1, -1, 55, 56, -1, -1, -1, + -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, + 46, -1, -1, 44, 45, 46, 47, 48, 49, 55, + 51, 52, 53, 54, -1, 56, 57, 63, 64, -1, + -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, + 57, -1, 59, -1, -1, 62, -1, -1, 65, 66, + 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, + 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, + 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, + -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, + -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, + -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, + 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, + -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, + 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, + 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, + -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, + -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, + 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, + 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, + 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, + -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, + -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, + -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, + 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, + -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, + 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, + 51, 52, 53, 54, -1, -1, -1, 58, -1, -1, + -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, + -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, + 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, + 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, + 53, 54, -1, -1, -1, 58, -1, -1, -1, 62, + -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, + -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, + -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, + 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, + -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, + 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, + 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, + -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, + -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, + 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, + 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, + 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, + -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, + 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, + -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, + 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, + -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, + 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, + 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, + -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, + -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, + 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, + 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, + 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, + -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, + 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, + -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, + 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, + -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, + 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, + 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, + -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, + -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, + 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, + 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, + 53, 54, -1, -1, -1, -1, -1, -1, -1, 62, + -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, + -1, -1, 71, 72, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, 84, 85, 86, 87, 88, + 89, 90, 62, -1, -1, 65, 66, 67, 97, -1, + -1, 71, 72, 44, 45, 46, 47, 48, 49, -1, + 51, 52, 53, 54, 84, 85, 86, 87, 88, -1, + 90, 62, -1, -1, 65, 66, 67, 97, -1, -1, + 71, 72, 44, 45, 46, 47, 48, 49, -1, 51, + -1, 53, 54, 84, 85, 86, 87, -1, -1, 90, + 62, -1, -1, 65, 66, 67, 97, -1, -1, 71, + 72, 44, 45, 46, 47, 48, 49, -1, 51, -1, + 53, 54, 84, 85, 86, 87, -1, -1, 90, -1, + -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, + 44, 45, 46, 47, 48, 49, -1, 51, -1, -1, + 54, 84, 85, 86, 87, -1, -1, 90, -1, -1, + -1, 65, 66, 67, 97, -1, -1, 71, 72, 44, + 45, 46, 47, 48, 49, -1, 51, -1, -1, 54, + 84, 85, 86, 87, -1, -1, 90, -1, -1, -1, + 65, 66, 67, 97, -1, -1, 71, 72, 44, 45, + 46, 47, -1, -1, -1, 51, -1, -1, 54, 50, + -1, 86, 87, -1, -1, 90, -1, -1, -1, 65, + 66, 67, 97, -1, -1, 71, 72, 68, 69, -1, + -1, -1, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, -1, -1, 90, -1, -1, -1, -1, -1, + -1, 97 }; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "bison.simple" -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 101, 102, 0, 3, 5, 6, 7, 9, 11, - 13, 14, 15, 20, 21, 22, 24, 25, 27, 29, - 32, 35, 36, 37, 38, 40, 41, 42, 43, 45, - 46, 55, 63, 64, 103, 104, 107, 108, 111, 112, - 119, 122, 123, 124, 125, 126, 127, 128, 129, 132, - 133, 134, 38, 38, 55, 130, 130, 59, 59, 55, - 7, 36, 59, 127, 132, 55, 60, 107, 118, 55, - 55, 55, 130, 55, 55, 38, 55, 50, 50, 68, - 69, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 92, 131, 55, 91, 127, 127, 127, 127, 127, - 59, 44, 45, 46, 47, 48, 49, 51, 52, 53, - 54, 62, 65, 66, 67, 71, 72, 84, 85, 86, - 87, 88, 89, 90, 96, 97, 50, 131, 55, 91, - 127, 55, 55, 127, 59, 127, 106, 14, 59, 127, - 37, 37, 55, 127, 127, 60, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 140, 127, 135, 136, 38, 56, 127, 127, 127, 127, - 127, 127, 38, 127, 127, 127, 127, 127, 130, 130, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 60, 127, 37, 109, 110, 38, 56, 92, 114, - 127, 114, 56, 56, 61, 107, 55, 59, 127, 59, - 23, 23, 127, 56, 56, 105, 108, 56, 57, 57, - 59, 57, 99, 56, 57, 55, 55, 92, 58, 136, - 56, 57, 55, 114, 58, 113, 113, 118, 118, 127, - 56, 127, 59, 59, 127, 127, 127, 113, 60, 60, - 61, 108, 41, 127, 127, 50, 131, 127, 135, 135, - 140, 127, 61, 60, 37, 109, 99, 38, 57, 115, - 115, 8, 56, 118, 56, 56, 127, 56, 127, 59, - 56, 56, 56, 26, 120, 120, 59, 56, 59, 127, - 56, 56, 99, 106, 56, 113, 136, 56, 56, 118, - 118, 118, 56, 118, 56, 56, 127, 118, 118, 60, - 121, 127, 61, 61, 61, 60, 115, 60, 60, 118, - 118, 118, 56, 24, 38, 39, 137, 138, 139, 28, - 58, 106, 56, 112, 116, 117, 138, 116, 118, 50, - 50, 92, 38, 61, 139, 127, 106, 61, 60, 59, - 61, 112, 117, 61, 127, 127, 140, 50, 92, 59, - 19, 120, 116, 59, 59, 59, 99, 127, 140, 58, - 61, 50, 59, 99, 106, 127, 50, 59, 127, 59 +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + 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 2, 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef alloca +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) +#include +#else /* not sparc */ +#if defined (MSDOS) && !defined (__TURBOC__) +#include +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +#include + #pragma alloca +#else /* not MSDOS, __TURBOC__, or _AIX */ +#ifdef __hpux +#ifdef __cplusplus +extern "C" { +void *alloca (unsigned int); }; +#else /* not __cplusplus */ +void *alloca (); +#endif /* not __cplusplus */ +#endif /* __hpux */ +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc. */ +#endif /* not GNU C. */ +#endif /* alloca not defined. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) +#define YYEMPTY -2 #define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. +#define YYACCEPT return(0) +#define YYABORT return(1) +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ - #define YYFAIL goto yyerrlab - #define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ +#define YYBACKUP(token, value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ goto yybackup; \ } \ else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) #define YYTERROR 1 #define YYERRCODE 256 - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) +#ifndef YYPURE +#define YYLEX yylex() #endif - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - +#ifdef YYPURE +#ifdef YYLSP_NEEDED #ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) #else -# define YYLEX yylex () +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ #endif -/* Enable debugging if requested. */ -#if YYDEBUG +/* If nonreentrant, generate the variables here */ -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif +#ifndef YYPURE -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ #endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ #endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} +/* YYINITDEPTH indicates the initial size of the parser's stacks */ -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else -static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -# define YYINITDEPTH 200 +#define YYINITDEPTH 200 #endif -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif #ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 +#define YYMAXDEPTH 10000 #endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - -} - - -/* Prevent warnings from -Wmissing-prototypes. */ - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ int yyparse (void); -#else -int yyparse (); #endif -#endif /* ! YYPARSE_PARAM */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (from, to, count) + char *from; + char *to; + int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + while (i-- > 0) + *t++ = *f++; +} -/* The look-ahead symbol. */ -int yychar; +#else /* __cplusplus */ -/* The semantic value of the look-ahead symbol. */ -YYSTYPE yylval; +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *from, char *to, int count) +{ + register char *f = from; + register char *t = to; + register int i = count; -/* Number of syntax errors so far. */ -int yynerrs; + while (i-- > 0) + *t++ = *f++; +} +#endif +#endif + +#line 192 "bison.simple" - -/*----------. -| yyparse. | -`----------*/ +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ #ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; #else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; +#define YYPARSE_PARAM +#define YYPARSE_PARAM_DECL #endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () -#endif -#endif +int +yyparse(YYPARSE_PARAM) + YYPARSE_PARAM_DECL { - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) #endif - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. + int yystacksize = YYINITDEPTH; - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; + int yylen; - - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - YYSIZE_T yystacksize = YYINITDEPTH; - - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - YYDPRINTF ((stderr, "Starting parse\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif yystate = 0; yyerrstatus = 0; @@ -2177,1182 +1388,1063 @@ yyparse () so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss; + yyssp = yyss - 1; yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif - goto yysetstate; +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; + *++yyssp = yystate; - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) + if (yyssp >= yyss + yystacksize - 1) { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + int size = yyssp - yyss + 1; #ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif #else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + return 2; + } yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) + if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif + yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); + yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); +#endif #endif /* no yyoverflow */ - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) + if (yyssp >= yyss + yystacksize - 1) YYABORT; } - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif goto yybackup; + yybackup: -/*-----------. -| yybackup. | -`-----------*/ -yybackup: +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ + /* First try to decide what to do without reference to lookahead token. */ - /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yyn == YYFLAG) goto yydefault; - /* Not known => get a look-ahead token if don't already have one. */ + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif yychar = YYLEX; } - if (yychar <= YYEOF) + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif } else { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif } - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; + yyn = yytable[yyn]; - if (yyn <= 0) + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) + if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } + else if (yyn == 0) + goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; + /* Shift the lookahead token. */ - /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif - /* Discard the shifted token unless it is eof. */ + /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; - yystate = yyn; *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; goto yynewstate; - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ +/* Do the default action for the current state. */ yydefault: + yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; - goto yyreduce; - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ +/* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: - /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) +#if YYDEBUG != 0 + if (yydebug) { - case 2: -#line 162 "CMDgram.y" - { ;} - break; + int i; - case 3: -#line 167 "CMDgram.y" - { (yyval.stmt) = nil; ;} - break; + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); - case 4: -#line 169 "CMDgram.y" - { if(!gStatementList) { gStatementList = (yyvsp[(2) - (2)].stmt); } else { gStatementList->append((yyvsp[(2) - (2)].stmt)); } ;} - break; - - case 5: -#line 174 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (1)].stmt); ;} - break; - - case 6: -#line 176 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (1)].stmt); ;} - break; - - case 7: -#line 178 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (1)].stmt); ;} - break; - - case 8: -#line 183 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(4) - (6)].stmt); for(StmtNode *walk = ((yyvsp[(4) - (6)].stmt));walk;walk = walk->getNext() ) walk->setPackage((yyvsp[(2) - (6)].s).value); ;} - break; - - case 9: -#line 188 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (1)].stmt); ;} - break; - - case 10: -#line 190 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (2)].stmt); ((yyvsp[(1) - (2)].stmt))->append((yyvsp[(2) - (2)].stmt)); ;} - break; - - case 11: -#line 195 "CMDgram.y" - { (yyval.stmt) = nil; ;} - break; - - case 12: -#line 197 "CMDgram.y" - { if(!(yyvsp[(1) - (2)].stmt)) { (yyval.stmt) = (yyvsp[(2) - (2)].stmt); } else { ((yyvsp[(1) - (2)].stmt))->append((yyvsp[(2) - (2)].stmt)); (yyval.stmt) = (yyvsp[(1) - (2)].stmt); } ;} - break; - - case 19: -#line 208 "CMDgram.y" - { (yyval.stmt) = BreakStmtNode::alloc( (yyvsp[(1) - (2)].i).lineNumber ); ;} - break; - - case 20: -#line 210 "CMDgram.y" - { (yyval.stmt) = ContinueStmtNode::alloc( (yyvsp[(1) - (2)].i).lineNumber ); ;} - break; - - case 21: -#line 212 "CMDgram.y" - { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[(1) - (2)].i).lineNumber, NULL ); ;} - break; - - case 22: -#line 214 "CMDgram.y" - { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[(1) - (3)].i).lineNumber, (yyvsp[(2) - (3)].expr) ); ;} - break; - - case 23: -#line 216 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (2)].stmt); ;} - break; - - case 24: -#line 218 "CMDgram.y" - { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[(1) - (4)].s).lineNumber, (yyvsp[(1) - (4)].s).value, (yyvsp[(3) - (4)].expr), NULL ); ;} - break; - - case 25: -#line 220 "CMDgram.y" - { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[(1) - (6)].s).lineNumber, (yyvsp[(1) - (6)].s).value, (yyvsp[(3) - (6)].expr), (yyvsp[(5) - (6)].expr) ); ;} - break; - - case 26: -#line 222 "CMDgram.y" - { (yyval.stmt) = StrConstNode::alloc( (yyvsp[(1) - (1)].str).lineNumber, (yyvsp[(1) - (1)].str).value, false, true ); ;} - break; - - case 27: -#line 227 "CMDgram.y" - { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[(1) - (8)].i).lineNumber, (yyvsp[(2) - (8)].s).value, NULL, (yyvsp[(4) - (8)].var), (yyvsp[(7) - (8)].stmt) ); ;} - break; - - case 28: -#line 229 "CMDgram.y" - { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[(1) - (10)].i).lineNumber, (yyvsp[(4) - (10)].s).value, (yyvsp[(2) - (10)].s).value, (yyvsp[(6) - (10)].var), (yyvsp[(9) - (10)].stmt) ); ;} - break; - - case 29: -#line 234 "CMDgram.y" - { (yyval.var) = NULL; ;} - break; - - case 30: -#line 236 "CMDgram.y" - { (yyval.var) = (yyvsp[(1) - (1)].var); ;} - break; - - case 31: -#line 241 "CMDgram.y" - { (yyval.var) = VarNode::alloc( (yyvsp[(1) - (1)].s).lineNumber, (yyvsp[(1) - (1)].s).value, NULL ); ;} - break; - - case 32: -#line 243 "CMDgram.y" - { (yyval.var) = (yyvsp[(1) - (3)].var); ((StmtNode*)((yyvsp[(1) - (3)].var)))->append((StmtNode*)VarNode::alloc( (yyvsp[(3) - (3)].s).lineNumber, (yyvsp[(3) - (3)].s).value, NULL ) ); ;} - break; - - case 33: -#line 248 "CMDgram.y" - { (yyval.stmt) = ObjectDeclNode::alloc( (yyvsp[(1) - (10)].i).lineNumber, (yyvsp[(2) - (10)].expr), (yyvsp[(4) - (10)].expr), NULL, (yyvsp[(5) - (10)].s).value, (yyvsp[(8) - (10)].slist), NULL, true, false, false); ;} - break; - - case 34: -#line 253 "CMDgram.y" - { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[(1) - (10)].i).lineNumber, (yyvsp[(2) - (10)].expr), (yyvsp[(4) - (10)].expr), (yyvsp[(6) - (10)].expr), (yyvsp[(5) - (10)].s).value, (yyvsp[(9) - (10)].odcl).slots, (yyvsp[(9) - (10)].odcl).decls, false, false, false); ;} - break; - - case 35: -#line 255 "CMDgram.y" - { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[(1) - (7)].i).lineNumber, (yyvsp[(2) - (7)].expr), (yyvsp[(4) - (7)].expr), (yyvsp[(6) - (7)].expr), (yyvsp[(5) - (7)].s).value, NULL, NULL, false, false, false); ;} - break; - - case 36: -#line 257 "CMDgram.y" - { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[(1) - (12)].i).lineNumber, (yyvsp[(2) - (12)].expr), (yyvsp[(5) - (12)].expr), (yyvsp[(8) - (12)].expr), (yyvsp[(7) - (12)].s).value, (yyvsp[(11) - (12)].odcl).slots, (yyvsp[(11) - (12)].odcl).decls, false, true, false); ;} - break; - - case 37: -#line 259 "CMDgram.y" - { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[(1) - (9)].i).lineNumber, (yyvsp[(2) - (9)].expr), (yyvsp[(5) - (9)].expr), (yyvsp[(8) - (9)].expr), (yyvsp[(7) - (9)].s).value, NULL, NULL, false, true, false); ;} - break; - - case 38: -#line 261 "CMDgram.y" - { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[(1) - (10)].i).lineNumber, (yyvsp[(2) - (10)].expr), (yyvsp[(4) - (10)].expr), (yyvsp[(6) - (10)].expr), (yyvsp[(5) - (10)].s).value, (yyvsp[(9) - (10)].odcl).slots, (yyvsp[(9) - (10)].odcl).decls, false, false, true); ;} - break; - - case 39: -#line 263 "CMDgram.y" - { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[(1) - (7)].i).lineNumber, (yyvsp[(2) - (7)].expr), (yyvsp[(4) - (7)].expr), (yyvsp[(6) - (7)].expr), (yyvsp[(5) - (7)].s).value, NULL, NULL, false, false, true); ;} - break; - - case 40: -#line 268 "CMDgram.y" - { (yyval.s).value = NULL; ;} - break; - - case 41: -#line 270 "CMDgram.y" - { (yyval.s) = (yyvsp[(2) - (2)].s); ;} - break; - - case 42: -#line 275 "CMDgram.y" - { (yyval.expr) = StrConstNode::alloc( CodeBlock::smCurrentParser->getCurrentLine(), "", false); ;} - break; - - case 43: -#line 277 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 44: -#line 282 "CMDgram.y" - { (yyval.expr) = NULL; ;} - break; - - case 45: -#line 284 "CMDgram.y" - { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;} - break; - - case 46: -#line 289 "CMDgram.y" - { (yyval.odcl).slots = NULL; (yyval.odcl).decls = NULL; ;} - break; - - case 47: -#line 291 "CMDgram.y" - { (yyval.odcl).slots = (yyvsp[(1) - (1)].slist); (yyval.odcl).decls = NULL; ;} - break; - - case 48: -#line 293 "CMDgram.y" - { (yyval.odcl).slots = NULL; (yyval.odcl).decls = (yyvsp[(1) - (1)].od); ;} - break; - - case 49: -#line 295 "CMDgram.y" - { (yyval.odcl).slots = (yyvsp[(1) - (2)].slist); (yyval.odcl).decls = (yyvsp[(2) - (2)].od); ;} - break; - - case 50: -#line 300 "CMDgram.y" - { (yyval.od) = (yyvsp[(1) - (2)].od); ;} - break; - - case 51: -#line 302 "CMDgram.y" - { (yyvsp[(1) - (3)].od)->append((yyvsp[(2) - (3)].od)); (yyval.od) = (yyvsp[(1) - (3)].od); ;} - break; - - case 52: -#line 307 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(2) - (3)].stmt); ;} - break; - - case 53: -#line 309 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (1)].stmt); ;} - break; - - case 54: -#line 314 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(6) - (7)].ifnode); (yyvsp[(6) - (7)].ifnode)->propagateSwitchExpr((yyvsp[(3) - (7)].expr), false); ;} - break; - - case 55: -#line 316 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(6) - (7)].ifnode); (yyvsp[(6) - (7)].ifnode)->propagateSwitchExpr((yyvsp[(3) - (7)].expr), true); ;} - break; - - case 56: -#line 321 "CMDgram.y" - { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[(1) - (4)].i).lineNumber, (yyvsp[(2) - (4)].expr), (yyvsp[(4) - (4)].stmt), NULL, false); ;} - break; - - case 57: -#line 323 "CMDgram.y" - { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[(1) - (7)].i).lineNumber, (yyvsp[(2) - (7)].expr), (yyvsp[(4) - (7)].stmt), (yyvsp[(7) - (7)].stmt), false); ;} - break; - - case 58: -#line 325 "CMDgram.y" - { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[(1) - (5)].i).lineNumber, (yyvsp[(2) - (5)].expr), (yyvsp[(4) - (5)].stmt), (yyvsp[(5) - (5)].ifnode), true); ;} - break; - - case 59: -#line 330 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr);;} - break; - - case 60: -#line 332 "CMDgram.y" - { ((yyvsp[(1) - (3)].expr))->append((yyvsp[(3) - (3)].expr)); (yyval.expr)=(yyvsp[(1) - (3)].expr); ;} - break; - - case 61: -#line 337 "CMDgram.y" - { (yyval.stmt) = IfStmtNode::alloc((yyvsp[(1) - (5)].i).lineNumber, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].stmt), NULL, false); ;} - break; - - case 62: -#line 339 "CMDgram.y" - { (yyval.stmt) = IfStmtNode::alloc((yyvsp[(1) - (7)].i).lineNumber, (yyvsp[(3) - (7)].expr), (yyvsp[(5) - (7)].stmt), (yyvsp[(7) - (7)].stmt), false); ;} - break; - - case 63: -#line 344 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (5)].i).lineNumber, nil, (yyvsp[(3) - (5)].expr), nil, (yyvsp[(5) - (5)].stmt), false); ;} - break; - - case 64: -#line 346 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(3) - (6)].i).lineNumber, nil, (yyvsp[(5) - (6)].expr), nil, (yyvsp[(2) - (6)].stmt), true); ;} - break; - - case 65: -#line 351 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (9)].i).lineNumber, (yyvsp[(3) - (9)].expr), (yyvsp[(5) - (9)].expr), (yyvsp[(7) - (9)].expr), (yyvsp[(9) - (9)].stmt), false); ;} - break; - - case 66: -#line 353 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (8)].i).lineNumber, (yyvsp[(3) - (8)].expr), (yyvsp[(5) - (8)].expr), NULL, (yyvsp[(8) - (8)].stmt), false); ;} - break; - - case 67: -#line 355 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (8)].i).lineNumber, (yyvsp[(3) - (8)].expr), NULL, (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].stmt), false); ;} - break; - - case 68: -#line 357 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (7)].i).lineNumber, (yyvsp[(3) - (7)].expr), NULL, NULL, (yyvsp[(7) - (7)].stmt), false); ;} - break; - - case 69: -#line 359 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (8)].i).lineNumber, NULL, (yyvsp[(4) - (8)].expr), (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].stmt), false); ;} - break; - - case 70: -#line 361 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (7)].i).lineNumber, NULL, (yyvsp[(4) - (7)].expr), NULL, (yyvsp[(7) - (7)].stmt), false); ;} - break; - - case 71: -#line 363 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (7)].i).lineNumber, NULL, NULL, (yyvsp[(5) - (7)].expr), (yyvsp[(7) - (7)].stmt), false); ;} - break; - - case 72: -#line 365 "CMDgram.y" - { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[(1) - (6)].i).lineNumber, NULL, NULL, NULL, (yyvsp[(6) - (6)].stmt), false); ;} - break; - - case 73: -#line 370 "CMDgram.y" - { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[(1) - (7)].i).lineNumber, (yyvsp[(3) - (7)].s).value, (yyvsp[(5) - (7)].expr), (yyvsp[(7) - (7)].stmt), false ); ;} - break; - - case 74: -#line 372 "CMDgram.y" - { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[(1) - (7)].i).lineNumber, (yyvsp[(3) - (7)].s).value, (yyvsp[(5) - (7)].expr), (yyvsp[(7) - (7)].stmt), true ); ;} - break; - - case 75: -#line 377 "CMDgram.y" - { (yyval.stmt) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 76: -#line 382 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 77: -#line 384 "CMDgram.y" - { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;} - break; - - case 78: -#line 386 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 79: -#line 388 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 80: -#line 390 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 81: -#line 392 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 82: -#line 394 "CMDgram.y" - { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 83: -#line 396 "CMDgram.y" - { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 84: -#line 398 "CMDgram.y" - { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 85: -#line 400 "CMDgram.y" - { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 86: -#line 402 "CMDgram.y" - { (yyval.expr) = FloatUnaryExprNode::alloc( (yyvsp[(1) - (2)].i).lineNumber, (yyvsp[(1) - (2)].i).value, (yyvsp[(2) - (2)].expr)); ;} - break; - - case 87: -#line 404 "CMDgram.y" - { (yyval.expr) = TTagDerefNode::alloc( (yyvsp[(1) - (2)].i).lineNumber, (yyvsp[(2) - (2)].expr) ); ;} - break; - - case 88: -#line 406 "CMDgram.y" - { (yyval.expr) = TTagExprNode::alloc( (yyvsp[(1) - (1)].s).lineNumber, (yyvsp[(1) - (1)].s).value ); ;} - break; - - case 89: -#line 408 "CMDgram.y" - { (yyval.expr) = ConditionalExprNode::alloc( (yyvsp[(1) - (5)].expr)->dbgLineNumber, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;} - break; - - case 90: -#line 410 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 91: -#line 412 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 92: -#line 414 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 93: -#line 416 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 94: -#line 418 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 95: -#line 420 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 96: -#line 422 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 97: -#line 424 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 98: -#line 426 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 99: -#line 428 "CMDgram.y" - { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(2) - (3)].i).value, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - case 100: -#line 430 "CMDgram.y" - { (yyval.expr) = StreqExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), true); ;} - break; - - case 101: -#line 432 "CMDgram.y" - { (yyval.expr) = StreqExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), false); ;} - break; - - case 102: -#line 434 "CMDgram.y" - { (yyval.expr) = StrcatExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yyvsp[(2) - (3)].i).value); ;} - break; - - case 103: -#line 436 "CMDgram.y" - { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[(1) - (2)].i).lineNumber, (yyvsp[(1) - (2)].i).value, (yyvsp[(2) - (2)].expr)); ;} - break; - - case 104: -#line 438 "CMDgram.y" - { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[(1) - (2)].i).lineNumber, (yyvsp[(1) - (2)].i).value, (yyvsp[(2) - (2)].expr)); ;} - break; - - case 105: -#line 440 "CMDgram.y" - { (yyval.expr) = StrConstNode::alloc( (yyvsp[(1) - (1)].str).lineNumber, (yyvsp[(1) - (1)].str).value, true); ;} - break; - - case 106: -#line 442 "CMDgram.y" - { (yyval.expr) = FloatNode::alloc( (yyvsp[(1) - (1)].f).lineNumber, (yyvsp[(1) - (1)].f).value ); ;} - break; - - case 107: -#line 444 "CMDgram.y" - { (yyval.expr) = IntNode::alloc( (yyvsp[(1) - (1)].i).lineNumber, (yyvsp[(1) - (1)].i).value ); ;} - break; - - case 108: -#line 446 "CMDgram.y" - { (yyval.expr) = ConstantNode::alloc( (yyvsp[(1) - (1)].i).lineNumber, StringTable->insert("break")); ;} - break; - - case 109: -#line 448 "CMDgram.y" - { (yyval.expr) = SlotAccessNode::alloc( (yyvsp[(1) - (1)].slot).lineNumber, (yyvsp[(1) - (1)].slot).object, (yyvsp[(1) - (1)].slot).array, (yyvsp[(1) - (1)].slot).slotName ); ;} - break; - - case 110: -#line 450 "CMDgram.y" - { (yyval.expr) = InternalSlotAccessNode::alloc( (yyvsp[(1) - (1)].intslot).lineNumber, (yyvsp[(1) - (1)].intslot).object, (yyvsp[(1) - (1)].intslot).slotExpr, (yyvsp[(1) - (1)].intslot).recurse); ;} - break; - - case 111: -#line 452 "CMDgram.y" - { (yyval.expr) = ConstantNode::alloc( (yyvsp[(1) - (1)].s).lineNumber, (yyvsp[(1) - (1)].s).value ); ;} - break; - - case 112: -#line 454 "CMDgram.y" - { (yyval.expr) = StrConstNode::alloc( (yyvsp[(1) - (1)].str).lineNumber, (yyvsp[(1) - (1)].str).value, false); ;} - break; - - case 113: -#line 456 "CMDgram.y" - { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[(1) - (1)].s).lineNumber, (yyvsp[(1) - (1)].s).value, NULL); ;} - break; - - case 114: -#line 458 "CMDgram.y" - { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[(1) - (4)].s).lineNumber, (yyvsp[(1) - (4)].s).value, (yyvsp[(3) - (4)].expr) ); ;} - break; - - case 115: -#line 463 "CMDgram.y" - { (yyval.slot).lineNumber = (yyvsp[(1) - (3)].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[(1) - (3)].expr); (yyval.slot).slotName = (yyvsp[(3) - (3)].s).value; (yyval.slot).array = NULL; ;} - break; - - case 116: -#line 465 "CMDgram.y" - { (yyval.slot).lineNumber = (yyvsp[(1) - (6)].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[(1) - (6)].expr); (yyval.slot).slotName = (yyvsp[(3) - (6)].s).value; (yyval.slot).array = (yyvsp[(5) - (6)].expr); ;} - break; - - case 117: -#line 470 "CMDgram.y" - { (yyval.intslot).lineNumber = (yyvsp[(1) - (3)].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[(1) - (3)].expr); (yyval.intslot).slotExpr = (yyvsp[(3) - (3)].expr); (yyval.intslot).recurse = false; ;} - break; - - case 118: -#line 472 "CMDgram.y" - { (yyval.intslot).lineNumber = (yyvsp[(1) - (3)].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[(1) - (3)].expr); (yyval.intslot).slotExpr = (yyvsp[(3) - (3)].expr); (yyval.intslot).recurse = true; ;} - break; - - case 119: -#line 477 "CMDgram.y" - { (yyval.expr) = ConstantNode::alloc( (yyvsp[(1) - (1)].s).lineNumber, (yyvsp[(1) - (1)].s).value ); ;} - break; - - case 120: -#line 479 "CMDgram.y" - { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;} - break; - - case 121: -#line 484 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (1)].i).lineNumber; (yyval.asn).token = '+'; (yyval.asn).expr = FloatNode::alloc( (yyvsp[(1) - (1)].i).lineNumber, 1 ); ;} - break; - - case 122: -#line 486 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (1)].i).lineNumber; (yyval.asn).token = '-'; (yyval.asn).expr = FloatNode::alloc( (yyvsp[(1) - (1)].i).lineNumber, 1 ); ;} - break; - - case 123: -#line 488 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '+'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 124: -#line 490 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '-'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 125: -#line 492 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '*'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 126: -#line 494 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '/'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 127: -#line 496 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '%'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 128: -#line 498 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '&'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 129: -#line 500 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '^'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 130: -#line 502 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = '|'; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 131: -#line 504 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = opSHL; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 132: -#line 506 "CMDgram.y" - { (yyval.asn).lineNumber = (yyvsp[(1) - (2)].i).lineNumber; (yyval.asn).token = opSHR; (yyval.asn).expr = (yyvsp[(2) - (2)].expr); ;} - break; - - case 133: -#line 511 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 134: -#line 513 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 135: -#line 515 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].od); ;} - break; - - case 136: -#line 517 "CMDgram.y" - { (yyval.expr) = AssignExprNode::alloc( (yyvsp[(1) - (3)].s).lineNumber, (yyvsp[(1) - (3)].s).value, NULL, (yyvsp[(3) - (3)].expr)); ;} - break; - - case 137: -#line 519 "CMDgram.y" - { (yyval.expr) = AssignExprNode::alloc( (yyvsp[(1) - (6)].s).lineNumber, (yyvsp[(1) - (6)].s).value, (yyvsp[(3) - (6)].expr), (yyvsp[(6) - (6)].expr)); ;} - break; - - case 138: -#line 521 "CMDgram.y" - { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[(1) - (2)].s).lineNumber, (yyvsp[(1) - (2)].s).value, NULL, (yyvsp[(2) - (2)].asn).expr, (yyvsp[(2) - (2)].asn).token); ;} - break; - - case 139: -#line 523 "CMDgram.y" - { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[(1) - (5)].s).lineNumber, (yyvsp[(1) - (5)].s).value, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].asn).expr, (yyvsp[(5) - (5)].asn).token); ;} - break; - - case 140: -#line 525 "CMDgram.y" - { (yyval.expr) = SlotAssignOpNode::alloc( (yyvsp[(1) - (2)].slot).lineNumber, (yyvsp[(1) - (2)].slot).object, (yyvsp[(1) - (2)].slot).slotName, (yyvsp[(1) - (2)].slot).array, (yyvsp[(2) - (2)].asn).token, (yyvsp[(2) - (2)].asn).expr); ;} - break; - - case 141: -#line 527 "CMDgram.y" - { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[(1) - (3)].slot).lineNumber, (yyvsp[(1) - (3)].slot).object, (yyvsp[(1) - (3)].slot).array, (yyvsp[(1) - (3)].slot).slotName, (yyvsp[(3) - (3)].expr)); ;} - break; - - case 142: -#line 529 "CMDgram.y" - { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[(1) - (5)].slot).lineNumber, (yyvsp[(1) - (5)].slot).object, (yyvsp[(1) - (5)].slot).array, (yyvsp[(1) - (5)].slot).slotName, (yyvsp[(4) - (5)].expr)); ;} - break; - - case 143: -#line 534 "CMDgram.y" - { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[(1) - (4)].s).lineNumber, (yyvsp[(1) - (4)].s).value, NULL, (yyvsp[(3) - (4)].expr), false); ;} - break; - - case 144: -#line 536 "CMDgram.y" - { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[(1) - (6)].s).lineNumber, (yyvsp[(3) - (6)].s).value, (yyvsp[(1) - (6)].s).value, (yyvsp[(5) - (6)].expr), false); ;} - break; - - case 145: -#line 538 "CMDgram.y" - { (yyvsp[(1) - (6)].expr)->append((yyvsp[(5) - (6)].expr)); (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[(1) - (6)].expr)->dbgLineNumber, (yyvsp[(3) - (6)].s).value, NULL, (yyvsp[(1) - (6)].expr), true); ;} - break; - - case 146: -#line 543 "CMDgram.y" - { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[(1) - (4)].i).lineNumber, (yyvsp[(3) - (4)].expr), NULL ); ;} - break; - - case 147: -#line 545 "CMDgram.y" - { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[(1) - (6)].i).lineNumber, (yyvsp[(3) - (6)].expr), (yyvsp[(5) - (6)].str).value ); ;} - break; - - case 148: -#line 550 "CMDgram.y" - { (yyval.expr) = NULL; ;} - break; - - case 149: -#line 552 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 150: -#line 557 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 151: -#line 559 "CMDgram.y" - { ((yyvsp[(1) - (3)].expr))->append((yyvsp[(3) - (3)].expr)); (yyval.expr) = (yyvsp[(1) - (3)].expr); ;} - break; - - case 152: -#line 564 "CMDgram.y" - { (yyval.slist) = NULL; ;} - break; - - case 153: -#line 566 "CMDgram.y" - { (yyval.slist) = (yyvsp[(1) - (1)].slist); ;} - break; - - case 154: -#line 571 "CMDgram.y" - { (yyval.slist) = (yyvsp[(1) - (1)].slist); ;} - break; - - case 155: -#line 573 "CMDgram.y" - { (yyvsp[(1) - (2)].slist)->append((yyvsp[(2) - (2)].slist)); (yyval.slist) = (yyvsp[(1) - (2)].slist); ;} - break; - - case 156: -#line 578 "CMDgram.y" - { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[(1) - (4)].s).lineNumber, NULL, NULL, (yyvsp[(1) - (4)].s).value, (yyvsp[(3) - (4)].expr)); ;} - break; - - case 157: -#line 580 "CMDgram.y" - { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[(1) - (5)].i).lineNumber, NULL, NULL, (yyvsp[(2) - (5)].s).value, (yyvsp[(4) - (5)].expr), (yyvsp[(1) - (5)].i).value); ;} - break; - - case 158: -#line 582 "CMDgram.y" - { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[(1) - (4)].i).lineNumber, NULL, NULL, StringTable->insert("datablock"), (yyvsp[(3) - (4)].expr)); ;} - break; - - case 159: -#line 584 "CMDgram.y" - { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[(1) - (7)].s).lineNumber, NULL, (yyvsp[(3) - (7)].expr), (yyvsp[(1) - (7)].s).value, (yyvsp[(6) - (7)].expr)); ;} - break; - - case 160: -#line 586 "CMDgram.y" - { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[(1) - (8)].i).lineNumber, NULL, (yyvsp[(4) - (8)].expr), (yyvsp[(2) - (8)].s).value, (yyvsp[(7) - (8)].expr), (yyvsp[(1) - (8)].i).value); ;} - break; - - case 161: -#line 591 "CMDgram.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} - break; - - case 162: -#line 593 "CMDgram.y" - { (yyval.expr) = CommaCatExprNode::alloc( (yyvsp[(1) - (3)].expr)->dbgLineNumber, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} - break; - - -/* Line 1267 of yacc.c. */ -#line 3148 "cmdgram.cpp" - default: break; + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +#endif - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); + + switch (yyn) { + +case 1: +#line 162 "cmdgram.y" +{ ; + break;} +case 2: +#line 167 "cmdgram.y" +{ yyval.stmt = nil; ; + break;} +case 3: +#line 169 "cmdgram.y" +{ if(!gStatementList) { gStatementList = yyvsp[0].stmt; } else { gStatementList->append(yyvsp[0].stmt); } ; + break;} +case 4: +#line 174 "cmdgram.y" +{ yyval.stmt = yyvsp[0].stmt; ; + break;} +case 5: +#line 176 "cmdgram.y" +{ yyval.stmt = yyvsp[0].stmt; ; + break;} +case 6: +#line 178 "cmdgram.y" +{ yyval.stmt = yyvsp[0].stmt; ; + break;} +case 7: +#line 183 "cmdgram.y" +{ yyval.stmt = yyvsp[-2].stmt; for(StmtNode *walk = (yyvsp[-2].stmt);walk;walk = walk->getNext() ) walk->setPackage(yyvsp[-4].s.value); ; + break;} +case 8: +#line 188 "cmdgram.y" +{ yyval.stmt = yyvsp[0].stmt; ; + break;} +case 9: +#line 190 "cmdgram.y" +{ yyval.stmt = yyvsp[-1].stmt; (yyvsp[-1].stmt)->append(yyvsp[0].stmt); ; + break;} +case 10: +#line 195 "cmdgram.y" +{ yyval.stmt = nil; ; + break;} +case 11: +#line 197 "cmdgram.y" +{ if(!yyvsp[-1].stmt) { yyval.stmt = yyvsp[0].stmt; } else { (yyvsp[-1].stmt)->append(yyvsp[0].stmt); yyval.stmt = yyvsp[-1].stmt; } ; + break;} +case 18: +#line 208 "cmdgram.y" +{ yyval.stmt = BreakStmtNode::alloc( yyvsp[-1].i.lineNumber ); ; + break;} +case 19: +#line 210 "cmdgram.y" +{ yyval.stmt = ContinueStmtNode::alloc( yyvsp[-1].i.lineNumber ); ; + break;} +case 20: +#line 212 "cmdgram.y" +{ yyval.stmt = ReturnStmtNode::alloc( yyvsp[-1].i.lineNumber, NULL ); ; + break;} +case 21: +#line 214 "cmdgram.y" +{ yyval.stmt = ReturnStmtNode::alloc( yyvsp[-2].i.lineNumber, yyvsp[-1].expr ); ; + break;} +case 22: +#line 216 "cmdgram.y" +{ yyval.stmt = yyvsp[-1].stmt; ; + break;} +case 23: +#line 218 "cmdgram.y" +{ yyval.stmt = TTagSetStmtNode::alloc( yyvsp[-3].s.lineNumber, yyvsp[-3].s.value, yyvsp[-1].expr, NULL ); ; + break;} +case 24: +#line 220 "cmdgram.y" +{ yyval.stmt = TTagSetStmtNode::alloc( yyvsp[-5].s.lineNumber, yyvsp[-5].s.value, yyvsp[-3].expr, yyvsp[-1].expr ); ; + break;} +case 25: +#line 222 "cmdgram.y" +{ yyval.stmt = StrConstNode::alloc( yyvsp[0].str.lineNumber, yyvsp[0].str.value, false, true ); ; + break;} +case 26: +#line 227 "cmdgram.y" +{ yyval.stmt = FunctionDeclStmtNode::alloc( yyvsp[-7].i.lineNumber, yyvsp[-6].s.value, NULL, yyvsp[-4].var, yyvsp[-1].stmt ); ; + break;} +case 27: +#line 229 "cmdgram.y" +{ yyval.stmt = FunctionDeclStmtNode::alloc( yyvsp[-9].i.lineNumber, yyvsp[-6].s.value, yyvsp[-8].s.value, yyvsp[-4].var, yyvsp[-1].stmt ); ; + break;} +case 28: +#line 234 "cmdgram.y" +{ yyval.var = NULL; ; + break;} +case 29: +#line 236 "cmdgram.y" +{ yyval.var = yyvsp[0].var; ; + break;} +case 30: +#line 241 "cmdgram.y" +{ yyval.var = VarNode::alloc( yyvsp[0].s.lineNumber, yyvsp[0].s.value, NULL ); ; + break;} +case 31: +#line 243 "cmdgram.y" +{ yyval.var = yyvsp[-2].var; ((StmtNode*)(yyvsp[-2].var))->append((StmtNode*)VarNode::alloc( yyvsp[0].s.lineNumber, yyvsp[0].s.value, NULL ) ); ; + break;} +case 32: +#line 248 "cmdgram.y" +{ yyval.stmt = ObjectDeclNode::alloc( yyvsp[-9].i.lineNumber, yyvsp[-8].expr, yyvsp[-6].expr, NULL, yyvsp[-5].s.value, yyvsp[-2].slist, NULL, true, false, false); ; + break;} +case 33: +#line 253 "cmdgram.y" +{ yyval.od = ObjectDeclNode::alloc( yyvsp[-9].i.lineNumber, yyvsp[-8].expr, yyvsp[-6].expr, yyvsp[-4].expr, yyvsp[-5].s.value, yyvsp[-1].odcl.slots, yyvsp[-1].odcl.decls, false, false, false); ; + break;} +case 34: +#line 255 "cmdgram.y" +{ yyval.od = ObjectDeclNode::alloc( yyvsp[-6].i.lineNumber, yyvsp[-5].expr, yyvsp[-3].expr, yyvsp[-1].expr, yyvsp[-2].s.value, NULL, NULL, false, false, false); ; + break;} +case 35: +#line 257 "cmdgram.y" +{ yyval.od = ObjectDeclNode::alloc( yyvsp[-11].i.lineNumber, yyvsp[-10].expr, yyvsp[-7].expr, yyvsp[-4].expr, yyvsp[-5].s.value, yyvsp[-1].odcl.slots, yyvsp[-1].odcl.decls, false, true, false); ; + break;} +case 36: +#line 259 "cmdgram.y" +{ yyval.od = ObjectDeclNode::alloc( yyvsp[-8].i.lineNumber, yyvsp[-7].expr, yyvsp[-4].expr, yyvsp[-1].expr, yyvsp[-2].s.value, NULL, NULL, false, true, false); ; + break;} +case 37: +#line 261 "cmdgram.y" +{ yyval.od = ObjectDeclNode::alloc( yyvsp[-9].i.lineNumber, yyvsp[-8].expr, yyvsp[-6].expr, yyvsp[-4].expr, yyvsp[-5].s.value, yyvsp[-1].odcl.slots, yyvsp[-1].odcl.decls, false, false, true); ; + break;} +case 38: +#line 263 "cmdgram.y" +{ yyval.od = ObjectDeclNode::alloc( yyvsp[-6].i.lineNumber, yyvsp[-5].expr, yyvsp[-3].expr, yyvsp[-1].expr, yyvsp[-2].s.value, NULL, NULL, false, false, true); ; + break;} +case 39: +#line 268 "cmdgram.y" +{ yyval.s.value = NULL; ; + break;} +case 40: +#line 270 "cmdgram.y" +{ yyval.s = yyvsp[0].s; ; + break;} +case 41: +#line 275 "cmdgram.y" +{ yyval.expr = StrConstNode::alloc( CodeBlock::smCurrentParser->getCurrentLine(), "", false); ; + break;} +case 42: +#line 277 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 43: +#line 282 "cmdgram.y" +{ yyval.expr = NULL; ; + break;} +case 44: +#line 284 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 45: +#line 289 "cmdgram.y" +{ yyval.odcl.slots = NULL; yyval.odcl.decls = NULL; ; + break;} +case 46: +#line 291 "cmdgram.y" +{ yyval.odcl.slots = yyvsp[0].slist; yyval.odcl.decls = NULL; ; + break;} +case 47: +#line 293 "cmdgram.y" +{ yyval.odcl.slots = NULL; yyval.odcl.decls = yyvsp[0].od; ; + break;} +case 48: +#line 295 "cmdgram.y" +{ yyval.odcl.slots = yyvsp[-1].slist; yyval.odcl.decls = yyvsp[0].od; ; + break;} +case 49: +#line 300 "cmdgram.y" +{ yyval.od = yyvsp[-1].od; ; + break;} +case 50: +#line 302 "cmdgram.y" +{ yyvsp[-2].od->append(yyvsp[-1].od); yyval.od = yyvsp[-2].od; ; + break;} +case 51: +#line 307 "cmdgram.y" +{ yyval.stmt = yyvsp[-1].stmt; ; + break;} +case 52: +#line 309 "cmdgram.y" +{ yyval.stmt = yyvsp[0].stmt; ; + break;} +case 53: +#line 314 "cmdgram.y" +{ yyval.stmt = yyvsp[-1].ifnode; yyvsp[-1].ifnode->propagateSwitchExpr(yyvsp[-4].expr, false); ; + break;} +case 54: +#line 316 "cmdgram.y" +{ yyval.stmt = yyvsp[-1].ifnode; yyvsp[-1].ifnode->propagateSwitchExpr(yyvsp[-4].expr, true); ; + break;} +case 55: +#line 321 "cmdgram.y" +{ yyval.ifnode = IfStmtNode::alloc( yyvsp[-3].i.lineNumber, yyvsp[-2].expr, yyvsp[0].stmt, NULL, false); ; + break;} +case 56: +#line 323 "cmdgram.y" +{ yyval.ifnode = IfStmtNode::alloc( yyvsp[-6].i.lineNumber, yyvsp[-5].expr, yyvsp[-3].stmt, yyvsp[0].stmt, false); ; + break;} +case 57: +#line 325 "cmdgram.y" +{ yyval.ifnode = IfStmtNode::alloc( yyvsp[-4].i.lineNumber, yyvsp[-3].expr, yyvsp[-1].stmt, yyvsp[0].ifnode, true); ; + break;} +case 58: +#line 330 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr;; + break;} +case 59: +#line 332 "cmdgram.y" +{ (yyvsp[-2].expr)->append(yyvsp[0].expr); yyval.expr=yyvsp[-2].expr; ; + break;} +case 60: +#line 337 "cmdgram.y" +{ yyval.stmt = IfStmtNode::alloc(yyvsp[-4].i.lineNumber, yyvsp[-2].expr, yyvsp[0].stmt, NULL, false); ; + break;} +case 61: +#line 339 "cmdgram.y" +{ yyval.stmt = IfStmtNode::alloc(yyvsp[-6].i.lineNumber, yyvsp[-4].expr, yyvsp[-2].stmt, yyvsp[0].stmt, false); ; + break;} +case 62: +#line 344 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-4].i.lineNumber, nil, yyvsp[-2].expr, nil, yyvsp[0].stmt, false); ; + break;} +case 63: +#line 346 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-3].i.lineNumber, nil, yyvsp[-1].expr, nil, yyvsp[-4].stmt, true); ; + break;} +case 64: +#line 351 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-8].i.lineNumber, yyvsp[-6].expr, yyvsp[-4].expr, yyvsp[-2].expr, yyvsp[0].stmt, false); ; + break;} +case 65: +#line 353 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-7].i.lineNumber, yyvsp[-5].expr, yyvsp[-3].expr, NULL, yyvsp[0].stmt, false); ; + break;} +case 66: +#line 355 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-7].i.lineNumber, yyvsp[-5].expr, NULL, yyvsp[-2].expr, yyvsp[0].stmt, false); ; + break;} +case 67: +#line 357 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-6].i.lineNumber, yyvsp[-4].expr, NULL, NULL, yyvsp[0].stmt, false); ; + break;} +case 68: +#line 359 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-7].i.lineNumber, NULL, yyvsp[-4].expr, yyvsp[-2].expr, yyvsp[0].stmt, false); ; + break;} +case 69: +#line 361 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-6].i.lineNumber, NULL, yyvsp[-3].expr, NULL, yyvsp[0].stmt, false); ; + break;} +case 70: +#line 363 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-6].i.lineNumber, NULL, NULL, yyvsp[-2].expr, yyvsp[0].stmt, false); ; + break;} +case 71: +#line 365 "cmdgram.y" +{ yyval.stmt = LoopStmtNode::alloc(yyvsp[-5].i.lineNumber, NULL, NULL, NULL, yyvsp[0].stmt, false); ; + break;} +case 72: +#line 370 "cmdgram.y" +{ yyval.stmt = IterStmtNode::alloc( yyvsp[-6].i.lineNumber, yyvsp[-4].s.value, yyvsp[-2].expr, yyvsp[0].stmt, false ); ; + break;} +case 73: +#line 372 "cmdgram.y" +{ yyval.stmt = IterStmtNode::alloc( yyvsp[-6].i.lineNumber, yyvsp[-4].s.value, yyvsp[-2].expr, yyvsp[0].stmt, true ); ; + break;} +case 74: +#line 377 "cmdgram.y" +{ yyval.stmt = yyvsp[0].expr; ; + break;} +case 75: +#line 382 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 76: +#line 384 "cmdgram.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 77: +#line 386 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 78: +#line 388 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 79: +#line 390 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 80: +#line 392 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 81: +#line 394 "cmdgram.y" +{ yyval.expr = FloatBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 82: +#line 396 "cmdgram.y" +{ yyval.expr = FloatBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 83: +#line 398 "cmdgram.y" +{ yyval.expr = FloatBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 84: +#line 400 "cmdgram.y" +{ yyval.expr = FloatBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 85: +#line 402 "cmdgram.y" +{ yyval.expr = FloatUnaryExprNode::alloc( yyvsp[-1].i.lineNumber, yyvsp[-1].i.value, yyvsp[0].expr); ; + break;} +case 86: +#line 404 "cmdgram.y" +{ yyval.expr = TTagDerefNode::alloc( yyvsp[-1].i.lineNumber, yyvsp[0].expr ); ; + break;} +case 87: +#line 406 "cmdgram.y" +{ yyval.expr = TTagExprNode::alloc( yyvsp[0].s.lineNumber, yyvsp[0].s.value ); ; + break;} +case 88: +#line 408 "cmdgram.y" +{ yyval.expr = ConditionalExprNode::alloc( yyvsp[-4].expr->dbgLineNumber, yyvsp[-4].expr, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 89: +#line 410 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 90: +#line 412 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 91: +#line 414 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 92: +#line 416 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 93: +#line 418 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 94: +#line 420 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 95: +#line 422 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 96: +#line 424 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 97: +#line 426 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 98: +#line 428 "cmdgram.y" +{ yyval.expr = IntBinaryExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-1].i.value, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 99: +#line 430 "cmdgram.y" +{ yyval.expr = StreqExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-2].expr, yyvsp[0].expr, true); ; + break;} +case 100: +#line 432 "cmdgram.y" +{ yyval.expr = StreqExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-2].expr, yyvsp[0].expr, false); ; + break;} +case 101: +#line 434 "cmdgram.y" +{ yyval.expr = StrcatExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].i.value); ; + break;} +case 102: +#line 436 "cmdgram.y" +{ yyval.expr = IntUnaryExprNode::alloc(yyvsp[-1].i.lineNumber, yyvsp[-1].i.value, yyvsp[0].expr); ; + break;} +case 103: +#line 438 "cmdgram.y" +{ yyval.expr = IntUnaryExprNode::alloc(yyvsp[-1].i.lineNumber, yyvsp[-1].i.value, yyvsp[0].expr); ; + break;} +case 104: +#line 440 "cmdgram.y" +{ yyval.expr = StrConstNode::alloc( yyvsp[0].str.lineNumber, yyvsp[0].str.value, true); ; + break;} +case 105: +#line 442 "cmdgram.y" +{ yyval.expr = FloatNode::alloc( yyvsp[0].f.lineNumber, yyvsp[0].f.value ); ; + break;} +case 106: +#line 444 "cmdgram.y" +{ yyval.expr = IntNode::alloc( yyvsp[0].i.lineNumber, yyvsp[0].i.value ); ; + break;} +case 107: +#line 446 "cmdgram.y" +{ yyval.expr = ConstantNode::alloc( yyvsp[0].i.lineNumber, StringTable->insert("break")); ; + break;} +case 108: +#line 448 "cmdgram.y" +{ yyval.expr = SlotAccessNode::alloc( yyvsp[0].slot.lineNumber, yyvsp[0].slot.object, yyvsp[0].slot.array, yyvsp[0].slot.slotName ); ; + break;} +case 109: +#line 450 "cmdgram.y" +{ yyval.expr = InternalSlotAccessNode::alloc( yyvsp[0].intslot.lineNumber, yyvsp[0].intslot.object, yyvsp[0].intslot.slotExpr, yyvsp[0].intslot.recurse); ; + break;} +case 110: +#line 452 "cmdgram.y" +{ yyval.expr = ConstantNode::alloc( yyvsp[0].s.lineNumber, yyvsp[0].s.value ); ; + break;} +case 111: +#line 454 "cmdgram.y" +{ yyval.expr = StrConstNode::alloc( yyvsp[0].str.lineNumber, yyvsp[0].str.value, false); ; + break;} +case 112: +#line 456 "cmdgram.y" +{ yyval.expr = (ExprNode*)VarNode::alloc( yyvsp[0].s.lineNumber, yyvsp[0].s.value, NULL); ; + break;} +case 113: +#line 458 "cmdgram.y" +{ yyval.expr = (ExprNode*)VarNode::alloc( yyvsp[-3].s.lineNumber, yyvsp[-3].s.value, yyvsp[-1].expr ); ; + break;} +case 114: +#line 460 "cmdgram.y" +{ + String fnname = String("__anonymous_function_" + String::ToString(gAnonFunctionID++)); + StringTableEntry afnName = StringTable->insert(fnname.c_str()); + StmtNode *fndef = FunctionDeclStmtNode::alloc(yyvsp[-6].i.lineNumber, afnName, NULL, yyvsp[-4].var, yyvsp[-1].stmt); + + if(!gAnonFunctionList) + gAnonFunctionList = fndef; + else + gAnonFunctionList->append(fndef); + + yyval.expr = StrConstNode::alloc( yyvsp[-6].i.lineNumber, (UTF8*)fnname.utf8(), false ); + ; + break;} +case 115: +#line 476 "cmdgram.y" +{ yyval.slot.lineNumber = yyvsp[-2].expr->dbgLineNumber; yyval.slot.object = yyvsp[-2].expr; yyval.slot.slotName = yyvsp[0].s.value; yyval.slot.array = NULL; ; + break;} +case 116: +#line 478 "cmdgram.y" +{ yyval.slot.lineNumber = yyvsp[-5].expr->dbgLineNumber; yyval.slot.object = yyvsp[-5].expr; yyval.slot.slotName = yyvsp[-3].s.value; yyval.slot.array = yyvsp[-1].expr; ; + break;} +case 117: +#line 483 "cmdgram.y" +{ yyval.intslot.lineNumber = yyvsp[-2].expr->dbgLineNumber; yyval.intslot.object = yyvsp[-2].expr; yyval.intslot.slotExpr = yyvsp[0].expr; yyval.intslot.recurse = false; ; + break;} +case 118: +#line 485 "cmdgram.y" +{ yyval.intslot.lineNumber = yyvsp[-2].expr->dbgLineNumber; yyval.intslot.object = yyvsp[-2].expr; yyval.intslot.slotExpr = yyvsp[0].expr; yyval.intslot.recurse = true; ; + break;} +case 119: +#line 490 "cmdgram.y" +{ yyval.expr = ConstantNode::alloc( yyvsp[0].s.lineNumber, yyvsp[0].s.value ); ; + break;} +case 120: +#line 492 "cmdgram.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 121: +#line 497 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[0].i.lineNumber; yyval.asn.token = '+'; yyval.asn.expr = FloatNode::alloc( yyvsp[0].i.lineNumber, 1 ); ; + break;} +case 122: +#line 499 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[0].i.lineNumber; yyval.asn.token = '-'; yyval.asn.expr = FloatNode::alloc( yyvsp[0].i.lineNumber, 1 ); ; + break;} +case 123: +#line 501 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '+'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 124: +#line 503 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '-'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 125: +#line 505 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '*'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 126: +#line 507 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '/'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 127: +#line 509 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '%'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 128: +#line 511 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '&'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 129: +#line 513 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '^'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 130: +#line 515 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '|'; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 131: +#line 517 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = opSHL; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 132: +#line 519 "cmdgram.y" +{ yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = opSHR; yyval.asn.expr = yyvsp[0].expr; ; + break;} +case 133: +#line 524 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 134: +#line 526 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 135: +#line 528 "cmdgram.y" +{ yyval.expr = yyvsp[0].od; ; + break;} +case 136: +#line 530 "cmdgram.y" +{ yyval.expr = AssignExprNode::alloc( yyvsp[-2].s.lineNumber, yyvsp[-2].s.value, NULL, yyvsp[0].expr); ; + break;} +case 137: +#line 532 "cmdgram.y" +{ yyval.expr = AssignExprNode::alloc( yyvsp[-5].s.lineNumber, yyvsp[-5].s.value, yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 138: +#line 534 "cmdgram.y" +{ yyval.expr = AssignOpExprNode::alloc( yyvsp[-1].s.lineNumber, yyvsp[-1].s.value, NULL, yyvsp[0].asn.expr, yyvsp[0].asn.token); ; + break;} +case 139: +#line 536 "cmdgram.y" +{ yyval.expr = AssignOpExprNode::alloc( yyvsp[-4].s.lineNumber, yyvsp[-4].s.value, yyvsp[-2].expr, yyvsp[0].asn.expr, yyvsp[0].asn.token); ; + break;} +case 140: +#line 538 "cmdgram.y" +{ yyval.expr = SlotAssignOpNode::alloc( yyvsp[-1].slot.lineNumber, yyvsp[-1].slot.object, yyvsp[-1].slot.slotName, yyvsp[-1].slot.array, yyvsp[0].asn.token, yyvsp[0].asn.expr); ; + break;} +case 141: +#line 540 "cmdgram.y" +{ yyval.expr = SlotAssignNode::alloc( yyvsp[-2].slot.lineNumber, yyvsp[-2].slot.object, yyvsp[-2].slot.array, yyvsp[-2].slot.slotName, yyvsp[0].expr); ; + break;} +case 142: +#line 542 "cmdgram.y" +{ yyval.expr = SlotAssignNode::alloc( yyvsp[-4].slot.lineNumber, yyvsp[-4].slot.object, yyvsp[-4].slot.array, yyvsp[-4].slot.slotName, yyvsp[-1].expr); ; + break;} +case 143: +#line 547 "cmdgram.y" +{ yyval.expr = FuncCallExprNode::alloc( yyvsp[-3].s.lineNumber, yyvsp[-3].s.value, NULL, yyvsp[-1].expr, false); ; + break;} +case 144: +#line 549 "cmdgram.y" +{ yyval.expr = FuncCallExprNode::alloc( yyvsp[-5].s.lineNumber, yyvsp[-3].s.value, yyvsp[-5].s.value, yyvsp[-1].expr, false); ; + break;} +case 145: +#line 551 "cmdgram.y" +{ yyvsp[-5].expr->append(yyvsp[-1].expr); yyval.expr = FuncCallExprNode::alloc( yyvsp[-5].expr->dbgLineNumber, yyvsp[-3].s.value, NULL, yyvsp[-5].expr, true); ; + break;} +case 146: +#line 556 "cmdgram.y" +{ yyval.expr = AssertCallExprNode::alloc( yyvsp[-3].i.lineNumber, yyvsp[-1].expr, NULL ); ; + break;} +case 147: +#line 558 "cmdgram.y" +{ yyval.expr = AssertCallExprNode::alloc( yyvsp[-5].i.lineNumber, yyvsp[-3].expr, yyvsp[-1].str.value ); ; + break;} +case 148: +#line 563 "cmdgram.y" +{ yyval.expr = NULL; ; + break;} +case 149: +#line 565 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 150: +#line 570 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 151: +#line 572 "cmdgram.y" +{ (yyvsp[-2].expr)->append(yyvsp[0].expr); yyval.expr = yyvsp[-2].expr; ; + break;} +case 152: +#line 577 "cmdgram.y" +{ yyval.slist = NULL; ; + break;} +case 153: +#line 579 "cmdgram.y" +{ yyval.slist = yyvsp[0].slist; ; + break;} +case 154: +#line 584 "cmdgram.y" +{ yyval.slist = yyvsp[0].slist; ; + break;} +case 155: +#line 586 "cmdgram.y" +{ yyvsp[-1].slist->append(yyvsp[0].slist); yyval.slist = yyvsp[-1].slist; ; + break;} +case 156: +#line 591 "cmdgram.y" +{ yyval.slist = SlotAssignNode::alloc( yyvsp[-3].s.lineNumber, NULL, NULL, yyvsp[-3].s.value, yyvsp[-1].expr); ; + break;} +case 157: +#line 593 "cmdgram.y" +{ yyval.slist = SlotAssignNode::alloc( yyvsp[-4].i.lineNumber, NULL, NULL, yyvsp[-3].s.value, yyvsp[-1].expr, yyvsp[-4].i.value); ; + break;} +case 158: +#line 595 "cmdgram.y" +{ yyval.slist = SlotAssignNode::alloc( yyvsp[-3].i.lineNumber, NULL, NULL, StringTable->insert("datablock"), yyvsp[-1].expr); ; + break;} +case 159: +#line 597 "cmdgram.y" +{ yyval.slist = SlotAssignNode::alloc( yyvsp[-6].s.lineNumber, NULL, yyvsp[-4].expr, yyvsp[-6].s.value, yyvsp[-1].expr); ; + break;} +case 160: +#line 599 "cmdgram.y" +{ yyval.slist = SlotAssignNode::alloc( yyvsp[-7].i.lineNumber, NULL, yyvsp[-4].expr, yyvsp[-6].s.value, yyvsp[-1].expr, yyvsp[-7].i.value); ; + break;} +case 161: +#line 604 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 162: +#line 606 "cmdgram.y" +{ yyval.expr = CommaCatExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 487 "bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif *++yyvsp = yyval; +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTOKENS]; + yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; +yyerrlab: /* here on detecting error */ -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ { ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); } - + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ + /* if just tried and failed to reuse lookahead token after an error, discard it. */ - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse look-ahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) + /* return failure if at end of input */ + if (yychar == YYEOF) YYABORT; +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); + yychar = YYEMPTY; } + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + if (yyn == YYFINAL) YYACCEPT; +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif yystate = yyn; goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); } - - -#line 595 "CMDgram.y" - +#line 608 "cmdgram.y" diff --git a/Engine/source/console/cmdgram.h b/Engine/source/console/cmdgram.h index f08cde081..83736a565 100644 --- a/Engine/source/console/cmdgram.h +++ b/Engine/source/console/cmdgram.h @@ -1,199 +1,4 @@ -/* A Bison parser, made by GNU Bison 2.3. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - 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 2, 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, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - rwDEFINE = 258, - rwENDDEF = 259, - rwDECLARE = 260, - rwDECLARESINGLETON = 261, - rwBREAK = 262, - rwELSE = 263, - rwCONTINUE = 264, - rwGLOBAL = 265, - rwIF = 266, - rwNIL = 267, - rwRETURN = 268, - rwWHILE = 269, - rwDO = 270, - rwENDIF = 271, - rwENDWHILE = 272, - rwENDFOR = 273, - rwDEFAULT = 274, - rwFOR = 275, - rwFOREACH = 276, - rwFOREACHSTR = 277, - rwIN = 278, - rwDATABLOCK = 279, - rwSWITCH = 280, - rwCASE = 281, - rwSWITCHSTR = 282, - rwCASEOR = 283, - rwPACKAGE = 284, - rwNAMESPACE = 285, - rwCLASS = 286, - rwASSERT = 287, - ILLEGAL_TOKEN = 288, - CHRCONST = 289, - INTCONST = 290, - TTAG = 291, - VAR = 292, - IDENT = 293, - TYPEIDENT = 294, - DOCBLOCK = 295, - STRATOM = 296, - TAGATOM = 297, - FLTCONST = 298, - opINTNAME = 299, - opINTNAMER = 300, - opMINUSMINUS = 301, - opPLUSPLUS = 302, - STMT_SEP = 303, - opSHL = 304, - opSHR = 305, - opPLASN = 306, - opMIASN = 307, - opMLASN = 308, - opDVASN = 309, - opMODASN = 310, - opANDASN = 311, - opXORASN = 312, - opORASN = 313, - opSLASN = 314, - opSRASN = 315, - opCAT = 316, - opEQ = 317, - opNE = 318, - opGE = 319, - opLE = 320, - opAND = 321, - opOR = 322, - opSTREQ = 323, - opCOLONCOLON = 324, - opNTASN = 325, - opNDASN = 326, - opMDASN = 327, - opSTRNE = 328, - UNARY = 329 - }; -#endif -/* Tokens. */ -#define rwDEFINE 258 -#define rwENDDEF 259 -#define rwDECLARE 260 -#define rwDECLARESINGLETON 261 -#define rwBREAK 262 -#define rwELSE 263 -#define rwCONTINUE 264 -#define rwGLOBAL 265 -#define rwIF 266 -#define rwNIL 267 -#define rwRETURN 268 -#define rwWHILE 269 -#define rwDO 270 -#define rwENDIF 271 -#define rwENDWHILE 272 -#define rwENDFOR 273 -#define rwDEFAULT 274 -#define rwFOR 275 -#define rwFOREACH 276 -#define rwFOREACHSTR 277 -#define rwIN 278 -#define rwDATABLOCK 279 -#define rwSWITCH 280 -#define rwCASE 281 -#define rwSWITCHSTR 282 -#define rwCASEOR 283 -#define rwPACKAGE 284 -#define rwNAMESPACE 285 -#define rwCLASS 286 -#define rwASSERT 287 -#define ILLEGAL_TOKEN 288 -#define CHRCONST 289 -#define INTCONST 290 -#define TTAG 291 -#define VAR 292 -#define IDENT 293 -#define TYPEIDENT 294 -#define DOCBLOCK 295 -#define STRATOM 296 -#define TAGATOM 297 -#define FLTCONST 298 -#define opINTNAME 299 -#define opINTNAMER 300 -#define opMINUSMINUS 301 -#define opPLUSPLUS 302 -#define STMT_SEP 303 -#define opSHL 304 -#define opSHR 305 -#define opPLASN 306 -#define opMIASN 307 -#define opMLASN 308 -#define opDVASN 309 -#define opMODASN 310 -#define opANDASN 311 -#define opXORASN 312 -#define opORASN 313 -#define opSLASN 314 -#define opSRASN 315 -#define opCAT 316 -#define opEQ 317 -#define opNE 318 -#define opGE 319 -#define opLE 320 -#define opAND 321 -#define opOR 322 -#define opSTREQ 323 -#define opCOLONCOLON 324 -#define opNTASN 325 -#define opNDASN 326 -#define opMDASN 327 -#define opSTRNE 328 -#define UNARY 329 - - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 82 "CMDgram.y" -{ +typedef union { Token< char > c; Token< int > i; Token< const char* > s; @@ -209,14 +14,79 @@ typedef union YYSTYPE ObjectDeclNode* od; AssignDecl asn; IfStmtNode* ifnode; -} -/* Line 1529 of yacc.c. */ -#line 215 "cmdgram.h" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif +} YYSTYPE; +#define rwDEFINE 258 +#define rwENDDEF 259 +#define rwDECLARE 260 +#define rwDECLARESINGLETON 261 +#define rwBREAK 262 +#define rwELSE 263 +#define rwCONTINUE 264 +#define rwGLOBAL 265 +#define rwIF 266 +#define rwNIL 267 +#define rwRETURN 268 +#define rwWHILE 269 +#define rwDO 270 +#define rwENDIF 271 +#define rwENDWHILE 272 +#define rwENDFOR 273 +#define rwDEFAULT 274 +#define rwFOR 275 +#define rwFOREACH 276 +#define rwFOREACHSTR 277 +#define rwIN 278 +#define rwDATABLOCK 279 +#define rwSWITCH 280 +#define rwCASE 281 +#define rwSWITCHSTR 282 +#define rwCASEOR 283 +#define rwPACKAGE 284 +#define rwNAMESPACE 285 +#define rwCLASS 286 +#define rwASSERT 287 +#define ILLEGAL_TOKEN 288 +#define CHRCONST 289 +#define INTCONST 290 +#define TTAG 291 +#define VAR 292 +#define IDENT 293 +#define TYPEIDENT 294 +#define DOCBLOCK 295 +#define STRATOM 296 +#define TAGATOM 297 +#define FLTCONST 298 +#define opINTNAME 299 +#define opINTNAMER 300 +#define opMINUSMINUS 301 +#define opPLUSPLUS 302 +#define STMT_SEP 303 +#define opSHL 304 +#define opSHR 305 +#define opPLASN 306 +#define opMIASN 307 +#define opMLASN 308 +#define opDVASN 309 +#define opMODASN 310 +#define opANDASN 311 +#define opXORASN 312 +#define opORASN 313 +#define opSLASN 314 +#define opSRASN 315 +#define opCAT 316 +#define opEQ 317 +#define opNE 318 +#define opGE 319 +#define opLE 320 +#define opAND 321 +#define opOR 322 +#define opSTREQ 323 +#define opCOLONCOLON 324 +#define opMDASN 325 +#define opNDASN 326 +#define opNTASN 327 +#define opSTRNE 328 +#define UNARY 329 + extern YYSTYPE CMDlval; - From 170a4ea08fab58f11b62701fe89b08735e4c0629 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Mon, 29 Dec 2014 22:33:42 +1100 Subject: [PATCH 51/75] Add anonymous functions before other statements. --- Engine/source/console/codeBlock.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Engine/source/console/codeBlock.cpp b/Engine/source/console/codeBlock.cpp index c8cd57223..05a2ab798 100644 --- a/Engine/source/console/codeBlock.cpp +++ b/Engine/source/console/codeBlock.cpp @@ -482,7 +482,10 @@ bool CodeBlock::compile(const char *codeFileName, StringTableEntry fileName, con { if (gAnonFunctionList) { - gStatementList->append(gAnonFunctionList); + // Prepend anonymous functions to statement list, so they're defined already when + // the statements run. + gAnonFunctionList->append(gStatementList); + gStatementList = gAnonFunctionList; } } @@ -622,7 +625,10 @@ const char *CodeBlock::compileExec(StringTableEntry fileName, const char *inStri { if (gAnonFunctionList) { - gStatementList->append(gAnonFunctionList); + // Prepend anonymous functions to statement list, so they're defined already when + // the statements run. + gAnonFunctionList->append(gStatementList); + gStatementList = gAnonFunctionList; } } From 5a66f00697672f8dcbba2c75957766520c35b8b6 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Thu, 1 Jan 2015 10:33:35 +1100 Subject: [PATCH 52/75] Use a buffer on the stack. --- Engine/source/console/CMDgram.y | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Engine/source/console/CMDgram.y b/Engine/source/console/CMDgram.y index af0122e9b..5ebd9492b 100644 --- a/Engine/source/console/CMDgram.y +++ b/Engine/source/console/CMDgram.y @@ -458,16 +458,18 @@ expr { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, $3 ); } | rwDEFINE '(' var_list_decl ')' '{' statement_list '}' { - String fnname = String("__anonymous_function_" + String::ToString(gAnonFunctionID++)); - StringTableEntry afnName = StringTable->insert(fnname.c_str()); - StmtNode *fndef = FunctionDeclStmtNode::alloc($1.lineNumber, afnName, NULL, $3, $6); + const U32 bufLen = 64; + UTF8 buffer[bufLen]; + dSprintf(buffer, bufLen, "__anonymous_function%d", gAnonFunctionID++); + StringTableEntry fName = StringTable->insert(buffer); + StmtNode *fndef = FunctionDeclStmtNode::alloc($1.lineNumber, fName, NULL, $3, $6); if(!gAnonFunctionList) gAnonFunctionList = fndef; else gAnonFunctionList->append(fndef); - $$ = StrConstNode::alloc( $1.lineNumber, (UTF8*)fnname.utf8(), false ); + $$ = StrConstNode::alloc( $1.lineNumber, (UTF8*)fName, false ); } ; From dd9e416b00e74d66f40795e3d74f9e15c4a45d7f Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Thu, 1 Jan 2015 10:33:50 +1100 Subject: [PATCH 53/75] Regenerate flex/bison files. --- Engine/source/console/cmdgram.cpp | 130 +++++++++++++++--------------- 1 file changed, 66 insertions(+), 64 deletions(-) diff --git a/Engine/source/console/cmdgram.cpp b/Engine/source/console/cmdgram.cpp index e24576307..c7aeaa095 100644 --- a/Engine/source/console/cmdgram.cpp +++ b/Engine/source/console/cmdgram.cpp @@ -332,12 +332,12 @@ static const short yyrline[] = { 0, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 445, 447, 449, 451, - 453, 455, 457, 459, 475, 477, 482, 484, 489, 491, - 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, - 516, 518, 523, 525, 527, 529, 531, 533, 535, 537, - 539, 541, 546, 548, 550, 555, 557, 562, 564, 569, - 571, 576, 578, 583, 585, 590, 592, 594, 596, 598, - 603, 605 + 453, 455, 457, 459, 477, 479, 484, 486, 491, 493, + 498, 500, 502, 504, 506, 508, 510, 512, 514, 516, + 518, 520, 525, 527, 529, 531, 533, 535, 537, 539, + 541, 543, 548, 550, 552, 557, 559, 564, 566, 571, + 573, 578, 580, 585, 587, 592, 594, 596, 598, 600, + 605, 607 }; static const char * const yytname[] = { "$","error","$undefined.","rwDEFINE", @@ -2042,209 +2042,211 @@ case 113: break;} case 114: #line 460 "cmdgram.y" -{ - String fnname = String("__anonymous_function_" + String::ToString(gAnonFunctionID++)); - StringTableEntry afnName = StringTable->insert(fnname.c_str()); - StmtNode *fndef = FunctionDeclStmtNode::alloc(yyvsp[-6].i.lineNumber, afnName, NULL, yyvsp[-4].var, yyvsp[-1].stmt); +{ + const U32 bufLen = 64; + UTF8 buffer[bufLen]; + dSprintf(buffer, bufLen, "__anonymous_function%d", gAnonFunctionID++); + StringTableEntry fName = StringTable->insert(buffer); + StmtNode *fndef = FunctionDeclStmtNode::alloc(yyvsp[-6].i.lineNumber, fName, NULL, yyvsp[-4].var, yyvsp[-1].stmt); if(!gAnonFunctionList) - gAnonFunctionList = fndef; + gAnonFunctionList = fndef; else - gAnonFunctionList->append(fndef); + gAnonFunctionList->append(fndef); - yyval.expr = StrConstNode::alloc( yyvsp[-6].i.lineNumber, (UTF8*)fnname.utf8(), false ); + yyval.expr = StrConstNode::alloc( yyvsp[-6].i.lineNumber, (UTF8*)fName, false ); ; break;} case 115: -#line 476 "cmdgram.y" +#line 478 "cmdgram.y" { yyval.slot.lineNumber = yyvsp[-2].expr->dbgLineNumber; yyval.slot.object = yyvsp[-2].expr; yyval.slot.slotName = yyvsp[0].s.value; yyval.slot.array = NULL; ; break;} case 116: -#line 478 "cmdgram.y" +#line 480 "cmdgram.y" { yyval.slot.lineNumber = yyvsp[-5].expr->dbgLineNumber; yyval.slot.object = yyvsp[-5].expr; yyval.slot.slotName = yyvsp[-3].s.value; yyval.slot.array = yyvsp[-1].expr; ; break;} case 117: -#line 483 "cmdgram.y" +#line 485 "cmdgram.y" { yyval.intslot.lineNumber = yyvsp[-2].expr->dbgLineNumber; yyval.intslot.object = yyvsp[-2].expr; yyval.intslot.slotExpr = yyvsp[0].expr; yyval.intslot.recurse = false; ; break;} case 118: -#line 485 "cmdgram.y" +#line 487 "cmdgram.y" { yyval.intslot.lineNumber = yyvsp[-2].expr->dbgLineNumber; yyval.intslot.object = yyvsp[-2].expr; yyval.intslot.slotExpr = yyvsp[0].expr; yyval.intslot.recurse = true; ; break;} case 119: -#line 490 "cmdgram.y" +#line 492 "cmdgram.y" { yyval.expr = ConstantNode::alloc( yyvsp[0].s.lineNumber, yyvsp[0].s.value ); ; break;} case 120: -#line 492 "cmdgram.y" +#line 494 "cmdgram.y" { yyval.expr = yyvsp[-1].expr; ; break;} case 121: -#line 497 "cmdgram.y" +#line 499 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[0].i.lineNumber; yyval.asn.token = '+'; yyval.asn.expr = FloatNode::alloc( yyvsp[0].i.lineNumber, 1 ); ; break;} case 122: -#line 499 "cmdgram.y" +#line 501 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[0].i.lineNumber; yyval.asn.token = '-'; yyval.asn.expr = FloatNode::alloc( yyvsp[0].i.lineNumber, 1 ); ; break;} case 123: -#line 501 "cmdgram.y" +#line 503 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '+'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 124: -#line 503 "cmdgram.y" +#line 505 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '-'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 125: -#line 505 "cmdgram.y" +#line 507 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '*'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 126: -#line 507 "cmdgram.y" +#line 509 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '/'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 127: -#line 509 "cmdgram.y" +#line 511 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '%'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 128: -#line 511 "cmdgram.y" +#line 513 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '&'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 129: -#line 513 "cmdgram.y" +#line 515 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '^'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 130: -#line 515 "cmdgram.y" +#line 517 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = '|'; yyval.asn.expr = yyvsp[0].expr; ; break;} case 131: -#line 517 "cmdgram.y" +#line 519 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = opSHL; yyval.asn.expr = yyvsp[0].expr; ; break;} case 132: -#line 519 "cmdgram.y" +#line 521 "cmdgram.y" { yyval.asn.lineNumber = yyvsp[-1].i.lineNumber; yyval.asn.token = opSHR; yyval.asn.expr = yyvsp[0].expr; ; break;} case 133: -#line 524 "cmdgram.y" -{ yyval.expr = yyvsp[0].expr; ; - break;} -case 134: #line 526 "cmdgram.y" { yyval.expr = yyvsp[0].expr; ; break;} -case 135: +case 134: #line 528 "cmdgram.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 135: +#line 530 "cmdgram.y" { yyval.expr = yyvsp[0].od; ; break;} case 136: -#line 530 "cmdgram.y" +#line 532 "cmdgram.y" { yyval.expr = AssignExprNode::alloc( yyvsp[-2].s.lineNumber, yyvsp[-2].s.value, NULL, yyvsp[0].expr); ; break;} case 137: -#line 532 "cmdgram.y" +#line 534 "cmdgram.y" { yyval.expr = AssignExprNode::alloc( yyvsp[-5].s.lineNumber, yyvsp[-5].s.value, yyvsp[-3].expr, yyvsp[0].expr); ; break;} case 138: -#line 534 "cmdgram.y" +#line 536 "cmdgram.y" { yyval.expr = AssignOpExprNode::alloc( yyvsp[-1].s.lineNumber, yyvsp[-1].s.value, NULL, yyvsp[0].asn.expr, yyvsp[0].asn.token); ; break;} case 139: -#line 536 "cmdgram.y" +#line 538 "cmdgram.y" { yyval.expr = AssignOpExprNode::alloc( yyvsp[-4].s.lineNumber, yyvsp[-4].s.value, yyvsp[-2].expr, yyvsp[0].asn.expr, yyvsp[0].asn.token); ; break;} case 140: -#line 538 "cmdgram.y" +#line 540 "cmdgram.y" { yyval.expr = SlotAssignOpNode::alloc( yyvsp[-1].slot.lineNumber, yyvsp[-1].slot.object, yyvsp[-1].slot.slotName, yyvsp[-1].slot.array, yyvsp[0].asn.token, yyvsp[0].asn.expr); ; break;} case 141: -#line 540 "cmdgram.y" +#line 542 "cmdgram.y" { yyval.expr = SlotAssignNode::alloc( yyvsp[-2].slot.lineNumber, yyvsp[-2].slot.object, yyvsp[-2].slot.array, yyvsp[-2].slot.slotName, yyvsp[0].expr); ; break;} case 142: -#line 542 "cmdgram.y" +#line 544 "cmdgram.y" { yyval.expr = SlotAssignNode::alloc( yyvsp[-4].slot.lineNumber, yyvsp[-4].slot.object, yyvsp[-4].slot.array, yyvsp[-4].slot.slotName, yyvsp[-1].expr); ; break;} case 143: -#line 547 "cmdgram.y" +#line 549 "cmdgram.y" { yyval.expr = FuncCallExprNode::alloc( yyvsp[-3].s.lineNumber, yyvsp[-3].s.value, NULL, yyvsp[-1].expr, false); ; break;} case 144: -#line 549 "cmdgram.y" +#line 551 "cmdgram.y" { yyval.expr = FuncCallExprNode::alloc( yyvsp[-5].s.lineNumber, yyvsp[-3].s.value, yyvsp[-5].s.value, yyvsp[-1].expr, false); ; break;} case 145: -#line 551 "cmdgram.y" +#line 553 "cmdgram.y" { yyvsp[-5].expr->append(yyvsp[-1].expr); yyval.expr = FuncCallExprNode::alloc( yyvsp[-5].expr->dbgLineNumber, yyvsp[-3].s.value, NULL, yyvsp[-5].expr, true); ; break;} case 146: -#line 556 "cmdgram.y" +#line 558 "cmdgram.y" { yyval.expr = AssertCallExprNode::alloc( yyvsp[-3].i.lineNumber, yyvsp[-1].expr, NULL ); ; break;} case 147: -#line 558 "cmdgram.y" +#line 560 "cmdgram.y" { yyval.expr = AssertCallExprNode::alloc( yyvsp[-5].i.lineNumber, yyvsp[-3].expr, yyvsp[-1].str.value ); ; break;} case 148: -#line 563 "cmdgram.y" +#line 565 "cmdgram.y" { yyval.expr = NULL; ; break;} case 149: -#line 565 "cmdgram.y" +#line 567 "cmdgram.y" { yyval.expr = yyvsp[0].expr; ; break;} case 150: -#line 570 "cmdgram.y" +#line 572 "cmdgram.y" { yyval.expr = yyvsp[0].expr; ; break;} case 151: -#line 572 "cmdgram.y" +#line 574 "cmdgram.y" { (yyvsp[-2].expr)->append(yyvsp[0].expr); yyval.expr = yyvsp[-2].expr; ; break;} case 152: -#line 577 "cmdgram.y" +#line 579 "cmdgram.y" { yyval.slist = NULL; ; break;} case 153: -#line 579 "cmdgram.y" +#line 581 "cmdgram.y" { yyval.slist = yyvsp[0].slist; ; break;} case 154: -#line 584 "cmdgram.y" +#line 586 "cmdgram.y" { yyval.slist = yyvsp[0].slist; ; break;} case 155: -#line 586 "cmdgram.y" +#line 588 "cmdgram.y" { yyvsp[-1].slist->append(yyvsp[0].slist); yyval.slist = yyvsp[-1].slist; ; break;} case 156: -#line 591 "cmdgram.y" +#line 593 "cmdgram.y" { yyval.slist = SlotAssignNode::alloc( yyvsp[-3].s.lineNumber, NULL, NULL, yyvsp[-3].s.value, yyvsp[-1].expr); ; break;} case 157: -#line 593 "cmdgram.y" +#line 595 "cmdgram.y" { yyval.slist = SlotAssignNode::alloc( yyvsp[-4].i.lineNumber, NULL, NULL, yyvsp[-3].s.value, yyvsp[-1].expr, yyvsp[-4].i.value); ; break;} case 158: -#line 595 "cmdgram.y" +#line 597 "cmdgram.y" { yyval.slist = SlotAssignNode::alloc( yyvsp[-3].i.lineNumber, NULL, NULL, StringTable->insert("datablock"), yyvsp[-1].expr); ; break;} case 159: -#line 597 "cmdgram.y" +#line 599 "cmdgram.y" { yyval.slist = SlotAssignNode::alloc( yyvsp[-6].s.lineNumber, NULL, yyvsp[-4].expr, yyvsp[-6].s.value, yyvsp[-1].expr); ; break;} case 160: -#line 599 "cmdgram.y" +#line 601 "cmdgram.y" { yyval.slist = SlotAssignNode::alloc( yyvsp[-7].i.lineNumber, NULL, yyvsp[-4].expr, yyvsp[-6].s.value, yyvsp[-1].expr, yyvsp[-7].i.value); ; break;} case 161: -#line 604 "cmdgram.y" +#line 606 "cmdgram.y" { yyval.expr = yyvsp[0].expr; ; break;} case 162: -#line 606 "cmdgram.y" +#line 608 "cmdgram.y" { yyval.expr = CommaCatExprNode::alloc( yyvsp[-2].expr->dbgLineNumber, yyvsp[-2].expr, yyvsp[0].expr); ; break;} } @@ -2445,6 +2447,6 @@ yyerrhandle: yystate = yyn; goto yynewstate; } -#line 608 "cmdgram.y" +#line 610 "cmdgram.y" From f1da30f2853114807754eed51d0d3fa9aa58119e Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Fri, 2 Jan 2015 19:38:05 +1100 Subject: [PATCH 54/75] Those are ints, not floats. --- Engine/source/gui/core/guiControl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Engine/source/gui/core/guiControl.cpp b/Engine/source/gui/core/guiControl.cpp index f61a3b6dc..86dfbee6e 100644 --- a/Engine/source/gui/core/guiControl.cpp +++ b/Engine/source/gui/core/guiControl.cpp @@ -2816,11 +2816,11 @@ DefineConsoleMethod( GuiControl, setExtent, void, ( const char* extOrX, const ch { Point2I extent; if(!dStrIsEmpty(extOrX) && dStrIsEmpty(y)) - dSscanf(extOrX, "%f %f", &extent.x, &extent.y); + dSscanf(extOrX, "%d %d", &extent.x, &extent.y); else if(!dStrIsEmpty(extOrX) && !dStrIsEmpty(y)) { - extent.x = dAtof(extOrX); - extent.y = dAtof(y); + extent.x = dAtoi(extOrX); + extent.y = dAtoi(y); } object->setExtent( extent ); } From 3574ef838b7926ceea41372efbd096efa1194d8e Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Tue, 6 Jan 2015 00:42:09 -0500 Subject: [PATCH 55/75] Fix erroneous include guards --- Engine/source/T3D/turret/turretShape.h | 2 +- Engine/source/forest/ts/tsForestCellBatch.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/source/T3D/turret/turretShape.h b/Engine/source/T3D/turret/turretShape.h index 37af57ecf..7bc177eb6 100644 --- a/Engine/source/T3D/turret/turretShape.h +++ b/Engine/source/T3D/turret/turretShape.h @@ -23,7 +23,7 @@ #ifndef _TURRETSHAPE_H_ #define _TURRETSHAPE_H_ -#ifndef _SHAPEBASE_H_ +#ifndef _ITEM_H_ #include "T3D/item.h" #endif diff --git a/Engine/source/forest/ts/tsForestCellBatch.h b/Engine/source/forest/ts/tsForestCellBatch.h index a4c79d098..a2911addc 100644 --- a/Engine/source/forest/ts/tsForestCellBatch.h +++ b/Engine/source/forest/ts/tsForestCellBatch.h @@ -23,7 +23,7 @@ #ifndef _TSFORESTCELLBATCH_H_ #define _TSFORESTCELLBATCH_H_ -#ifndef _FORESTCELLBATCH_H_ +#ifndef _IMPOSTERRENDERMGR_H_ #include "renderInstance/renderImposterMgr.h" #endif #ifndef _FORESTCELLBATCH_H_ From b2b950c84a4b48d3fa9be49a2faa40c5aeb82db0 Mon Sep 17 00:00:00 2001 From: Ben Payne Date: Tue, 6 Jan 2015 00:42:33 -0500 Subject: [PATCH 56/75] Add missing include guards to some headers --- Engine/source/gfx/D3D9/videoCaptureD3D9.h | 7 ++++++- Engine/source/math/mPolyhedron.impl.h | 5 +++++ Engine/source/scene/mixin/sceneAmbientSoundObject.impl.h | 5 +++++ Engine/source/scene/mixin/scenePolyhedralObject.impl.h | 4 ++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Engine/source/gfx/D3D9/videoCaptureD3D9.h b/Engine/source/gfx/D3D9/videoCaptureD3D9.h index f9c5e9f1d..eb3b7e19f 100644 --- a/Engine/source/gfx/D3D9/videoCaptureD3D9.h +++ b/Engine/source/gfx/D3D9/videoCaptureD3D9.h @@ -20,6 +20,9 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef _GFX_D3D_VIDEOCAPTURED3D9_H_ +#define _GFX_D3D_VIDEOCAPTURED3D9_H_ + #ifndef _VIDEOCAPTURE_H_ #include "gfx/video/videoCapture.h" #endif @@ -79,4 +82,6 @@ protected: public: VideoFrameGrabberD3D9(); ~VideoFrameGrabberD3D9(); -}; \ No newline at end of file +}; + +#endif // _GFX_D3D_VIDEOCAPTURED3D9_H_ diff --git a/Engine/source/math/mPolyhedron.impl.h b/Engine/source/math/mPolyhedron.impl.h index b36debcaa..ef74995ab 100644 --- a/Engine/source/math/mPolyhedron.impl.h +++ b/Engine/source/math/mPolyhedron.impl.h @@ -20,6 +20,9 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef _MPOLYHEDRON_IMPL_H_ +#define _MPOLYHEDRON_IMPL_H_ + #include "math/mPlaneTransformer.h" @@ -503,3 +506,5 @@ void PolyhedronData::buildBoxData( Polyhedron& poly, const MatrixF& mat, const B edge ++; } } + +#endif // _MPOLYHEDRON_IMPL_H_ diff --git a/Engine/source/scene/mixin/sceneAmbientSoundObject.impl.h b/Engine/source/scene/mixin/sceneAmbientSoundObject.impl.h index b975a2d41..8953ac73c 100644 --- a/Engine/source/scene/mixin/sceneAmbientSoundObject.impl.h +++ b/Engine/source/scene/mixin/sceneAmbientSoundObject.impl.h @@ -20,6 +20,9 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef _SCENEAMBIENTSOUNDOBJECT_IMPL_H_ +#define _SCENEAMBIENTSOUNDOBJECT_IMPL_H_ + #include "platform/platform.h" #include "scene/mixin/sceneAmbientSoundObject.h" @@ -112,3 +115,5 @@ bool SceneAmbientSoundObject< Base >::_setSoundAmbience( void* object, const cha p->setSoundAmbience( ambience ); return false; } + +#endif // _SCENEAMBIENTSOUNDOBJECT_IMPL_H_ diff --git a/Engine/source/scene/mixin/scenePolyhedralObject.impl.h b/Engine/source/scene/mixin/scenePolyhedralObject.impl.h index 43a1e3e9f..b01eb9691 100644 --- a/Engine/source/scene/mixin/scenePolyhedralObject.impl.h +++ b/Engine/source/scene/mixin/scenePolyhedralObject.impl.h @@ -19,6 +19,8 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef _SCENEPOLYHEDRALOBJECT_IMPL_H_ +#define _SCENEPOLYHEDRALOBJECT_IMPL_H_ #include "platform/platform.h" #include "scene/mixin/scenePolyhedralObject.h" @@ -393,3 +395,5 @@ bool ScenePolyhedralObject< Base, P >::_setEdge( void* object, const char* index return false; } + +#endif // _SCENEPOLYHEDRALOBJECT_IMPL_H_ From 674133ac863e1f406085c1592edf7d0dba501468 Mon Sep 17 00:00:00 2001 From: LuisAntonRebollo Date: Sun, 18 Jan 2015 21:05:38 +0100 Subject: [PATCH 57/75] Add library SDL2 --- Engine/lib/sdl/Android.mk | 69 + Engine/lib/sdl/BUGS.txt | 16 + Engine/lib/sdl/CMakeLists.txt | 1309 + Engine/lib/sdl/COPYING.txt | 20 + Engine/lib/sdl/CREDITS.txt | 53 + Engine/lib/sdl/INSTALL.txt | 40 + Engine/lib/sdl/Makefile.in | 219 + Engine/lib/sdl/Makefile.minimal | 42 + Engine/lib/sdl/Makefile.pandora | 37 + Engine/lib/sdl/Makefile.psp | 92 + Engine/lib/sdl/Makefile.wiz | 61 + Engine/lib/sdl/README-SDL.txt | 13 + Engine/lib/sdl/README-android.txt | 438 + Engine/lib/sdl/README-cmake.txt | 31 + Engine/lib/sdl/README-directfb.txt | 106 + Engine/lib/sdl/README-dynapi.txt | 130 + Engine/lib/sdl/README-gesture.txt | 72 + Engine/lib/sdl/README-hg.txt | 23 + Engine/lib/sdl/README-ios.txt | 222 + Engine/lib/sdl/README-linux.txt | 80 + Engine/lib/sdl/README-macosx.txt | 226 + Engine/lib/sdl/README-pandora.txt | 16 + Engine/lib/sdl/README-platforms.txt | 30 + Engine/lib/sdl/README-porting.txt | 61 + Engine/lib/sdl/README-psp.txt | 17 + Engine/lib/sdl/README-raspberrypi.txt | 161 + Engine/lib/sdl/README-touch.txt | 84 + Engine/lib/sdl/README-wince.txt | 8 + Engine/lib/sdl/README-windows.txt | 42 + Engine/lib/sdl/README.txt | 42 + Engine/lib/sdl/SDL2.spec | 112 + Engine/lib/sdl/SDL2.spec.in | 112 + Engine/lib/sdl/TODO.txt | 10 + Engine/lib/sdl/VisualC.html | 148 + Engine/lib/sdl/VisualC/clean.sh | 5 + Engine/lib/sdl/WhatsNew.txt | 108 + Engine/lib/sdl/Xcode-iOS/Demos/Default.png | Bin 0 -> 18383 bytes .../Demos/Demos.xcodeproj/project.pbxproj | 1019 + Engine/lib/sdl/Xcode-iOS/Demos/Icon.png | Bin 0 -> 2409 bytes Engine/lib/sdl/Xcode-iOS/Demos/Info.plist | 30 + Engine/lib/sdl/Xcode-iOS/Demos/README | 43 + .../Demos/data/bitmapfont/kromasky_16x16.bmp | Bin 0 -> 45368 bytes .../Demos/data/bitmapfont/license.txt | 258 + .../Demos/data/drums/ds_brush_snare.wav | Bin 0 -> 194604 bytes .../Xcode-iOS/Demos/data/drums/ds_china.wav | Bin 0 -> 984604 bytes .../Demos/data/drums/ds_kick_big_amb.wav | Bin 0 -> 307080 bytes .../Demos/data/drums/ds_loose_skin_mute.wav | Bin 0 -> 127052 bytes Engine/lib/sdl/Xcode-iOS/Demos/data/icon.bmp | Bin 0 -> 578 bytes Engine/lib/sdl/Xcode-iOS/Demos/data/ship.bmp | Bin 0 -> 12344 bytes Engine/lib/sdl/Xcode-iOS/Demos/data/space.bmp | Bin 0 -> 460856 bytes .../lib/sdl/Xcode-iOS/Demos/data/stroke.bmp | Bin 0 -> 3128 bytes .../sdl/Xcode-iOS/Demos/src/accelerometer.c | 239 + Engine/lib/sdl/Xcode-iOS/Demos/src/common.c | 36 + Engine/lib/sdl/Xcode-iOS/Demos/src/common.h | 12 + .../lib/sdl/Xcode-iOS/Demos/src/fireworks.c | 475 + Engine/lib/sdl/Xcode-iOS/Demos/src/happy.c | 177 + Engine/lib/sdl/Xcode-iOS/Demos/src/keyboard.c | 310 + Engine/lib/sdl/Xcode-iOS/Demos/src/mixer.c | 353 + .../lib/sdl/Xcode-iOS/Demos/src/rectangles.c | 81 + Engine/lib/sdl/Xcode-iOS/Demos/src/touch.c | 125 + .../SDL/SDL.xcodeproj/project.pbxproj | 1335 + .../SDL2test.xcodeproj/project.pbxproj | 272 + .../Template/SDL iOS Application/Default.png | Bin 0 -> 18383 bytes .../Template/SDL iOS Application/Icon.png | Bin 0 -> 2409 bytes .../Template/SDL iOS Application/Info.plist | 28 + .../TemplateIcon.icns | Bin 0 -> 34248 bytes .../TemplateInfo.plist | 10 + .../project.pbxproj | 403 + .../Template/SDL iOS Application/main.c | 98 + Engine/lib/sdl/Xcode-iOS/Test/Info.plist | 28 + Engine/lib/sdl/Xcode-iOS/Test/README | 22 + .../TestiPhoneOS.xcodeproj/project.pbxproj | 2267 ++ Engine/lib/sdl/Xcode/SDL/Info-Framework.plist | 28 + .../Xcode/SDL/SDL.xcodeproj/project.pbxproj | 2955 ++ Engine/lib/sdl/Xcode/SDL/pkg-support/SDL.info | 15 + .../SDL/pkg-support/codesign-frameworks.sh | 43 + .../SDL/pkg-support/resources/License.txt | 19 + .../SDL/pkg-support/resources/ReadMe.txt | 32 + .../SDL/pkg-support/resources/SDL_DS_Store | Bin 0 -> 15364 bytes .../sdl/Xcode/SDL/pkg-support/sdl_logo.pdf | Bin 0 -> 163800 bytes .../SDLTest/SDLTest.xcodeproj/project.pbxproj | 4780 +++ .../sdl/Xcode/SDLTest/TestDropFile-Info.plist | 35 + Engine/lib/sdl/Xcode/XcodeDocSet/Doxyfile | 1558 + Engine/lib/sdl/acinclude/ac_check_define.m4 | 14 + Engine/lib/sdl/acinclude/alsa.m4 | 145 + .../sdl/acinclude/ax_check_compiler_flags.m4 | 76 + Engine/lib/sdl/acinclude/ax_gcc_archflag.m4 | 215 + .../lib/sdl/acinclude/ax_gcc_x86_cpuid.m4.htm | 79 + Engine/lib/sdl/acinclude/esd.m4 | 168 + Engine/lib/sdl/acinclude/libtool.m4 | 7988 +++++ Engine/lib/sdl/acinclude/ltoptions.m4 | 384 + Engine/lib/sdl/acinclude/ltsugar.m4 | 123 + Engine/lib/sdl/acinclude/ltversion.m4 | 23 + Engine/lib/sdl/acinclude/lt~obsolete.m4 | 98 + .../sdl/android-project/AndroidManifest.xml | 44 + Engine/lib/sdl/android-project/ant.properties | 17 + .../lib/sdl/android-project/build.properties | 17 + Engine/lib/sdl/android-project/build.xml | 93 + .../sdl/android-project/default.properties | 11 + Engine/lib/sdl/android-project/jni/Android.mk | 1 + .../sdl/android-project/jni/Application.mk | 6 + .../sdl/android-project/jni/src/Android.mk | 19 + .../android-project/jni/src/Android_static.mk | 12 + .../sdl/android-project/proguard-project.txt | 20 + .../sdl/android-project/project.properties | 14 + .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 2683 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 0 -> 1698 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 3872 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 6874 bytes .../sdl/android-project/res/layout/main.xml | 13 + .../android-project/res/values/strings.xml | 4 + .../src/org/libsdl/app/SDLActivity.java | 1074 + Engine/lib/sdl/autogen.sh | 19 + Engine/lib/sdl/build-scripts/androidbuild.sh | 135 + Engine/lib/sdl/build-scripts/config.guess | 1541 + Engine/lib/sdl/build-scripts/config.sub | 1786 ++ Engine/lib/sdl/build-scripts/g++-fat.sh | 101 + Engine/lib/sdl/build-scripts/gcc-fat.sh | 102 + Engine/lib/sdl/build-scripts/install-sh | 323 + Engine/lib/sdl/build-scripts/iosbuild.sh | 277 + Engine/lib/sdl/build-scripts/ltmain.sh | 9655 ++++++ Engine/lib/sdl/build-scripts/mkinstalldirs | 99 + .../sdl/build-scripts/raspberrypi-buildbot.sh | 60 + Engine/lib/sdl/build-scripts/showrev.sh | 7 + Engine/lib/sdl/build-scripts/strip_fPIC.sh | 21 + Engine/lib/sdl/build-scripts/updaterev.sh | 20 + Engine/lib/sdl/cmake/macros.cmake | 73 + Engine/lib/sdl/cmake/sdlchecks.cmake | 926 + Engine/lib/sdl/configure | 25755 ++++++++++++++++ Engine/lib/sdl/configure.in | 3255 ++ Engine/lib/sdl/debian/changelog | 84 + Engine/lib/sdl/debian/compat | 1 + Engine/lib/sdl/debian/control | 75 + Engine/lib/sdl/debian/copyright | 362 + Engine/lib/sdl/debian/docs | 4 + Engine/lib/sdl/debian/libsdl2-dev.install | 8 + Engine/lib/sdl/debian/libsdl2-dev.manpages | 1 + Engine/lib/sdl/debian/libsdl2.install | 1 + Engine/lib/sdl/debian/rules | 41 + Engine/lib/sdl/debian/sdl2-config.1 | 86 + Engine/lib/sdl/debian/source/format | 1 + Engine/lib/sdl/debian/watch | 2 + Engine/lib/sdl/include/SDL.h | 163 + Engine/lib/sdl/include/SDL_assert.h | 284 + Engine/lib/sdl/include/SDL_atomic.h | 260 + Engine/lib/sdl/include/SDL_audio.h | 506 + Engine/lib/sdl/include/SDL_bits.h | 97 + Engine/lib/sdl/include/SDL_blendmode.h | 63 + Engine/lib/sdl/include/SDL_clipboard.h | 71 + Engine/lib/sdl/include/SDL_config.h | 55 + Engine/lib/sdl/include/SDL_config.h.cmake | 395 + Engine/lib/sdl/include/SDL_config.h.in | 333 + Engine/lib/sdl/include/SDL_config_android.h | 144 + Engine/lib/sdl/include/SDL_config_iphoneos.h | 155 + Engine/lib/sdl/include/SDL_config_macosx.h | 184 + Engine/lib/sdl/include/SDL_config_minimal.h | 81 + Engine/lib/sdl/include/SDL_config_pandora.h | 124 + Engine/lib/sdl/include/SDL_config_psp.h | 140 + Engine/lib/sdl/include/SDL_config_windows.h | 210 + Engine/lib/sdl/include/SDL_config_winrt.h | 190 + Engine/lib/sdl/include/SDL_config_wiz.h | 118 + Engine/lib/sdl/include/SDL_copying.h | 20 + Engine/lib/sdl/include/SDL_cpuinfo.h | 156 + Engine/lib/sdl/include/SDL_egl.h | 1396 + Engine/lib/sdl/include/SDL_endian.h | 239 + Engine/lib/sdl/include/SDL_error.h | 76 + Engine/lib/sdl/include/SDL_events.h | 723 + Engine/lib/sdl/include/SDL_filesystem.h | 136 + Engine/lib/sdl/include/SDL_gamecontroller.h | 316 + Engine/lib/sdl/include/SDL_gesture.h | 87 + Engine/lib/sdl/include/SDL_haptic.h | 1225 + Engine/lib/sdl/include/SDL_hints.h | 517 + Engine/lib/sdl/include/SDL_joystick.h | 253 + Engine/lib/sdl/include/SDL_keyboard.h | 217 + Engine/lib/sdl/include/SDL_keycode.h | 341 + Engine/lib/sdl/include/SDL_loadso.h | 81 + Engine/lib/sdl/include/SDL_log.h | 211 + Engine/lib/sdl/include/SDL_main.h | 155 + Engine/lib/sdl/include/SDL_messagebox.h | 144 + Engine/lib/sdl/include/SDL_mouse.h | 224 + Engine/lib/sdl/include/SDL_mutex.h | 251 + Engine/lib/sdl/include/SDL_name.h | 33 + Engine/lib/sdl/include/SDL_opengl.h | 11126 +++++++ Engine/lib/sdl/include/SDL_opengles.h | 38 + Engine/lib/sdl/include/SDL_opengles2.h | 2790 ++ Engine/lib/sdl/include/SDL_pixels.h | 429 + Engine/lib/sdl/include/SDL_platform.h | 164 + Engine/lib/sdl/include/SDL_power.h | 75 + Engine/lib/sdl/include/SDL_quit.h | 58 + Engine/lib/sdl/include/SDL_rect.h | 138 + Engine/lib/sdl/include/SDL_render.h | 870 + Engine/lib/sdl/include/SDL_revision.h | 2 + Engine/lib/sdl/include/SDL_rwops.h | 232 + Engine/lib/sdl/include/SDL_scancode.h | 401 + Engine/lib/sdl/include/SDL_shape.h | 143 + Engine/lib/sdl/include/SDL_stdinc.h | 405 + Engine/lib/sdl/include/SDL_surface.h | 503 + Engine/lib/sdl/include/SDL_system.h | 191 + Engine/lib/sdl/include/SDL_syswm.h | 272 + Engine/lib/sdl/include/SDL_test.h | 68 + Engine/lib/sdl/include/SDL_test_assert.h | 105 + Engine/lib/sdl/include/SDL_test_common.h | 188 + Engine/lib/sdl/include/SDL_test_compare.h | 69 + Engine/lib/sdl/include/SDL_test_crc32.h | 124 + Engine/lib/sdl/include/SDL_test_font.h | 76 + Engine/lib/sdl/include/SDL_test_fuzzer.h | 384 + Engine/lib/sdl/include/SDL_test_harness.h | 123 + Engine/lib/sdl/include/SDL_test_images.h | 78 + Engine/lib/sdl/include/SDL_test_log.h | 67 + Engine/lib/sdl/include/SDL_test_md5.h | 129 + Engine/lib/sdl/include/SDL_test_random.h | 115 + Engine/lib/sdl/include/SDL_thread.h | 287 + Engine/lib/sdl/include/SDL_timer.h | 115 + Engine/lib/sdl/include/SDL_touch.h | 86 + Engine/lib/sdl/include/SDL_types.h | 29 + Engine/lib/sdl/include/SDL_version.h | 162 + Engine/lib/sdl/include/SDL_video.h | 979 + Engine/lib/sdl/include/begin_code.h | 140 + Engine/lib/sdl/include/close_code.h | 37 + Engine/lib/sdl/include/doxyfile | 1555 + Engine/lib/sdl/linux/libSDL-1.2.so.0 | Bin 359800 -> 0 bytes Engine/lib/sdl/linux/readme.txt | 10 - Engine/lib/sdl/sdl2-config.in | 60 + Engine/lib/sdl/sdl2.m4 | 202 + Engine/lib/sdl/sdl2.pc.in | 15 + Engine/lib/sdl/src/SDL.c | 471 + Engine/lib/sdl/src/SDL_assert.c | 384 + Engine/lib/sdl/src/SDL_assert_c.h | 24 + Engine/lib/sdl/src/SDL_error.c | 257 + Engine/lib/sdl/src/SDL_error_c.h | 64 + Engine/lib/sdl/src/SDL_hints.c | 217 + Engine/lib/sdl/src/SDL_internal.h | 38 + Engine/lib/sdl/src/SDL_log.c | 439 + Engine/lib/sdl/src/atomic/SDL_atomic.c | 221 + Engine/lib/sdl/src/atomic/SDL_spinlock.c | 126 + Engine/lib/sdl/src/audio/SDL_audio.c | 1293 + Engine/lib/sdl/src/audio/SDL_audio_c.h | 55 + Engine/lib/sdl/src/audio/SDL_audiocvt.c | 1121 + Engine/lib/sdl/src/audio/SDL_audiodev.c | 113 + Engine/lib/sdl/src/audio/SDL_audiodev_c.h | 39 + Engine/lib/sdl/src/audio/SDL_audiomem.h | 25 + Engine/lib/sdl/src/audio/SDL_audiotypecvt.c | 16015 ++++++++++ Engine/lib/sdl/src/audio/SDL_mixer.c | 321 + Engine/lib/sdl/src/audio/SDL_sysaudio.h | 138 + Engine/lib/sdl/src/audio/SDL_wave.c | 623 + Engine/lib/sdl/src/audio/SDL_wave.h | 65 + .../lib/sdl/src/audio/alsa/SDL_alsa_audio.c | 685 + .../lib/sdl/src/audio/alsa/SDL_alsa_audio.h | 45 + .../sdl/src/audio/android/SDL_androidaudio.c | 141 + .../sdl/src/audio/android/SDL_androidaudio.h | 39 + Engine/lib/sdl/src/audio/arts/SDL_artsaudio.c | 384 + Engine/lib/sdl/src/audio/arts/SDL_artsaudio.h | 52 + Engine/lib/sdl/src/audio/bsd/SDL_bsdaudio.c | 361 + Engine/lib/sdl/src/audio/bsd/SDL_bsdaudio.h | 51 + .../sdl/src/audio/coreaudio/SDL_coreaudio.c | 559 + .../sdl/src/audio/coreaudio/SDL_coreaudio.h | 57 + .../src/audio/directsound/SDL_directsound.c | 550 + .../src/audio/directsound/SDL_directsound.h | 46 + .../lib/sdl/src/audio/directsound/directx.h | 102 + Engine/lib/sdl/src/audio/disk/SDL_diskaudio.c | 163 + Engine/lib/sdl/src/audio/disk/SDL_diskaudio.h | 42 + Engine/lib/sdl/src/audio/dsp/SDL_dspaudio.c | 306 + Engine/lib/sdl/src/audio/dsp/SDL_dspaudio.h | 43 + .../lib/sdl/src/audio/dummy/SDL_dummyaudio.c | 48 + .../lib/sdl/src/audio/dummy/SDL_dummyaudio.h | 41 + Engine/lib/sdl/src/audio/esd/SDL_esdaudio.c | 345 + Engine/lib/sdl/src/audio/esd/SDL_esdaudio.h | 50 + .../sdl/src/audio/fusionsound/SDL_fsaudio.c | 345 + .../sdl/src/audio/fusionsound/SDL_fsaudio.h | 49 + .../lib/sdl/src/audio/haiku/SDL_haikuaudio.cc | 240 + .../lib/sdl/src/audio/haiku/SDL_haikuaudio.h | 38 + Engine/lib/sdl/src/audio/nas/SDL_nasaudio.c | 397 + Engine/lib/sdl/src/audio/nas/SDL_nasaudio.h | 56 + Engine/lib/sdl/src/audio/paudio/SDL_paudio.c | 541 + Engine/lib/sdl/src/audio/paudio/SDL_paudio.h | 47 + Engine/lib/sdl/src/audio/psp/SDL_pspaudio.c | 195 + Engine/lib/sdl/src/audio/psp/SDL_pspaudio.h | 45 + .../sdl/src/audio/pulseaudio/SDL_pulseaudio.c | 554 + .../sdl/src/audio/pulseaudio/SDL_pulseaudio.h | 48 + Engine/lib/sdl/src/audio/qsa/SDL_qsa_audio.c | 857 + Engine/lib/sdl/src/audio/qsa/SDL_qsa_audio.h | 57 + Engine/lib/sdl/src/audio/sdlgenaudiocvt.pl | 760 + .../lib/sdl/src/audio/sndio/SDL_sndioaudio.c | 327 + .../lib/sdl/src/audio/sndio/SDL_sndioaudio.h | 45 + Engine/lib/sdl/src/audio/sun/SDL_sunaudio.c | 426 + Engine/lib/sdl/src/audio/sun/SDL_sunaudio.h | 47 + Engine/lib/sdl/src/audio/winmm/SDL_winmm.c | 400 + Engine/lib/sdl/src/audio/winmm/SDL_winmm.h | 45 + .../lib/sdl/src/audio/xaudio2/SDL_xaudio2.c | 542 + .../xaudio2/SDL_xaudio2_winrthelpers.cpp | 90 + .../audio/xaudio2/SDL_xaudio2_winrthelpers.h | 70 + Engine/lib/sdl/src/core/android/SDL_android.c | 1496 + Engine/lib/sdl/src/core/android/SDL_android.h | 90 + Engine/lib/sdl/src/core/linux/SDL_evdev.c | 805 + Engine/lib/sdl/src/core/linux/SDL_evdev.h | 59 + Engine/lib/sdl/src/core/linux/SDL_udev.c | 398 + Engine/lib/sdl/src/core/linux/SDL_udev.h | 115 + Engine/lib/sdl/src/core/windows/SDL_windows.c | 93 + Engine/lib/sdl/src/core/windows/SDL_windows.h | 61 + .../src/core/winrt/SDL_winrtapp_common.cpp | 37 + .../sdl/src/core/winrt/SDL_winrtapp_common.h | 31 + .../src/core/winrt/SDL_winrtapp_direct3d.cpp | 699 + .../src/core/winrt/SDL_winrtapp_direct3d.h | 80 + .../sdl/src/core/winrt/SDL_winrtapp_xaml.cpp | 160 + .../sdl/src/core/winrt/SDL_winrtapp_xaml.h | 33 + Engine/lib/sdl/src/cpuinfo/SDL_cpuinfo.c | 727 + Engine/lib/sdl/src/dynapi/SDL_dynapi.c | 302 + Engine/lib/sdl/src/dynapi/SDL_dynapi.h | 56 + .../lib/sdl/src/dynapi/SDL_dynapi_overrides.h | 577 + Engine/lib/sdl/src/dynapi/SDL_dynapi_procs.h | 608 + Engine/lib/sdl/src/dynapi/gendynapi.pl | 141 + .../lib/sdl/src/events/SDL_clipboardevents.c | 46 + .../sdl/src/events/SDL_clipboardevents_c.h | 30 + Engine/lib/sdl/src/events/SDL_dropevents.c | 46 + Engine/lib/sdl/src/events/SDL_dropevents_c.h | 30 + Engine/lib/sdl/src/events/SDL_events.c | 651 + Engine/lib/sdl/src/events/SDL_events_c.h | 50 + Engine/lib/sdl/src/events/SDL_gesture.c | 639 + Engine/lib/sdl/src/events/SDL_gesture_c.h | 34 + Engine/lib/sdl/src/events/SDL_keyboard.c | 1013 + Engine/lib/sdl/src/events/SDL_keyboard_c.h | 67 + Engine/lib/sdl/src/events/SDL_mouse.c | 810 + Engine/lib/sdl/src/events/SDL_mouse_c.h | 121 + Engine/lib/sdl/src/events/SDL_quit.c | 120 + Engine/lib/sdl/src/events/SDL_sysevents.h | 36 + Engine/lib/sdl/src/events/SDL_touch.c | 362 + Engine/lib/sdl/src/events/SDL_touch_c.h | 61 + Engine/lib/sdl/src/events/SDL_windowevents.c | 210 + .../lib/sdl/src/events/SDL_windowevents_c.h | 31 + Engine/lib/sdl/src/events/blank_cursor.h | 33 + Engine/lib/sdl/src/events/default_cursor.h | 114 + Engine/lib/sdl/src/events/scancodes_darwin.h | 159 + Engine/lib/sdl/src/events/scancodes_linux.h | 263 + Engine/lib/sdl/src/events/scancodes_windows.h | 55 + Engine/lib/sdl/src/events/scancodes_xfree86.h | 421 + Engine/lib/sdl/src/file/SDL_rwops.c | 765 + .../src/file/cocoa/SDL_rwopsbundlesupport.h | 30 + .../src/file/cocoa/SDL_rwopsbundlesupport.m | 70 + .../src/filesystem/cocoa/SDL_sysfilesystem.m | 105 + .../src/filesystem/dummy/SDL_sysfilesystem.c | 47 + .../src/filesystem/haiku/SDL_sysfilesystem.cc | 93 + .../src/filesystem/unix/SDL_sysfilesystem.c | 210 + .../filesystem/windows/SDL_sysfilesystem.c | 140 + .../filesystem/winrt/SDL_sysfilesystem.cpp | 174 + Engine/lib/sdl/src/haptic/SDL_haptic.c | 847 + Engine/lib/sdl/src/haptic/SDL_haptic_c.h | 25 + Engine/lib/sdl/src/haptic/SDL_syshaptic.h | 210 + .../lib/sdl/src/haptic/darwin/SDL_syshaptic.c | 1409 + .../sdl/src/haptic/darwin/SDL_syshaptic_c.h | 26 + .../lib/sdl/src/haptic/dummy/SDL_syshaptic.c | 184 + .../lib/sdl/src/haptic/linux/SDL_syshaptic.c | 1162 + .../sdl/src/haptic/windows/SDL_syshaptic.c | 1792 ++ .../sdl/src/haptic/windows/SDL_syshaptic_c.h | 28 + .../lib/sdl/src/joystick/SDL_gamecontroller.c | 1333 + .../sdl/src/joystick/SDL_gamecontrollerdb.h | 76 + Engine/lib/sdl/src/joystick/SDL_joystick.c | 854 + Engine/lib/sdl/src/joystick/SDL_joystick_c.h | 51 + Engine/lib/sdl/src/joystick/SDL_sysjoystick.h | 117 + .../src/joystick/android/SDL_sysjoystick.c | 582 + .../src/joystick/android/SDL_sysjoystick_c.h | 52 + .../sdl/src/joystick/bsd/SDL_sysjoystick.c | 660 + .../sdl/src/joystick/darwin/SDL_sysjoystick.c | 824 + .../src/joystick/darwin/SDL_sysjoystick_c.h | 73 + .../sdl/src/joystick/dummy/SDL_sysjoystick.c | 133 + .../src/joystick/haiku/SDL_haikujoystick.cc | 281 + .../iphoneos/SDLUIAccelerationDelegate.h | 44 + .../iphoneos/SDLUIAccelerationDelegate.m | 141 + .../src/joystick/iphoneos/SDL_sysjoystick.m | 153 + .../sdl/src/joystick/linux/SDL_sysjoystick.c | 894 + .../src/joystick/linux/SDL_sysjoystick_c.h | 57 + .../sdl/src/joystick/psp/SDL_sysjoystick.c | 274 + .../lib/sdl/src/joystick/sort_controllers.py | 63 + .../sdl/src/joystick/windows/SDL_dxjoystick.c | 1683 + .../src/joystick/windows/SDL_dxjoystick_c.h | 150 + .../sdl/src/joystick/windows/SDL_mmjoystick.c | 475 + .../src/joystick/winrt/SDL_xinputjoystick.c | 537 + Engine/lib/sdl/src/libm/e_atan2.c | 116 + Engine/lib/sdl/src/libm/e_log.c | 167 + Engine/lib/sdl/src/libm/e_pow.c | 342 + Engine/lib/sdl/src/libm/e_rem_pio2.c | 201 + Engine/lib/sdl/src/libm/e_sqrt.c | 464 + Engine/lib/sdl/src/libm/k_cos.c | 100 + Engine/lib/sdl/src/libm/k_rem_pio2.c | 358 + Engine/lib/sdl/src/libm/k_sin.c | 87 + Engine/lib/sdl/src/libm/math_libm.h | 37 + Engine/lib/sdl/src/libm/math_private.h | 220 + Engine/lib/sdl/src/libm/s_atan.c | 115 + Engine/lib/sdl/src/libm/s_copysign.c | 42 + Engine/lib/sdl/src/libm/s_cos.c | 91 + Engine/lib/sdl/src/libm/s_fabs.c | 39 + Engine/lib/sdl/src/libm/s_floor.c | 96 + Engine/lib/sdl/src/libm/s_scalbn.c | 79 + Engine/lib/sdl/src/libm/s_sin.c | 91 + .../lib/sdl/src/loadso/dlopen/SDL_sysloadso.c | 74 + .../lib/sdl/src/loadso/dummy/SDL_sysloadso.c | 54 + .../lib/sdl/src/loadso/haiku/SDL_sysloadso.c | 71 + .../sdl/src/loadso/windows/SDL_sysloadso.c | 80 + .../sdl/src/main/android/SDL_android_main.c | 40 + .../lib/sdl/src/main/dummy/SDL_dummy_main.c | 28 + Engine/lib/sdl/src/main/haiku/SDL_BApp.h | 380 + Engine/lib/sdl/src/main/haiku/SDL_BeApp.cc | 136 + Engine/lib/sdl/src/main/haiku/SDL_BeApp.h | 40 + Engine/lib/sdl/src/main/psp/SDL_psp_main.c | 63 + .../sdl/src/main/windows/SDL_windows_main.c | 189 + Engine/lib/sdl/src/main/windows/version.rc | 38 + .../src/main/winrt/SDL_winrt_main_NonXAML.cpp | 59 + Engine/lib/sdl/src/power/SDL_power.c | 120 + .../lib/sdl/src/power/android/SDL_syspower.c | 63 + Engine/lib/sdl/src/power/haiku/SDL_syspower.c | 126 + Engine/lib/sdl/src/power/linux/SDL_syspower.c | 429 + .../lib/sdl/src/power/macosx/SDL_syspower.c | 192 + Engine/lib/sdl/src/power/psp/SDL_syspower.c | 68 + Engine/lib/sdl/src/power/uikit/SDL_syspower.h | 32 + Engine/lib/sdl/src/power/uikit/SDL_syspower.m | 97 + .../lib/sdl/src/power/windows/SDL_syspower.c | 76 + .../lib/sdl/src/power/winrt/SDL_syspower.cpp | 44 + Engine/lib/sdl/src/render/SDL_d3dmath.c | 131 + Engine/lib/sdl/src/render/SDL_d3dmath.h | 69 + Engine/lib/sdl/src/render/SDL_render.c | 1891 ++ Engine/lib/sdl/src/render/SDL_sysrender.h | 198 + Engine/lib/sdl/src/render/SDL_yuv_mmx.c | 431 + Engine/lib/sdl/src/render/SDL_yuv_sw.c | 1400 + Engine/lib/sdl/src/render/SDL_yuv_sw_c.h | 72 + .../sdl/src/render/direct3d/SDL_render_d3d.c | 1889 ++ .../src/render/direct3d11/SDL_render_d3d11.c | 2879 ++ .../render/direct3d11/SDL_render_winrt.cpp | 119 + .../src/render/direct3d11/SDL_render_winrt.h | 40 + Engine/lib/sdl/src/render/mmx.h | 642 + .../lib/sdl/src/render/opengl/SDL_glfuncs.h | 477 + .../lib/sdl/src/render/opengl/SDL_render_gl.c | 1503 + .../sdl/src/render/opengl/SDL_shaders_gl.c | 358 + .../sdl/src/render/opengl/SDL_shaders_gl.h | 39 + .../sdl/src/render/opengles/SDL_glesfuncs.h | 63 + .../sdl/src/render/opengles/SDL_render_gles.c | 1186 + .../sdl/src/render/opengles2/SDL_gles2funcs.h | 71 + .../src/render/opengles2/SDL_render_gles2.c | 1897 ++ .../src/render/opengles2/SDL_shaders_gles2.c | 785 + .../src/render/opengles2/SDL_shaders_gles2.h | 60 + .../lib/sdl/src/render/psp/SDL_render_psp.c | 1020 + .../src/render/software/SDL_blendfillrect.c | 336 + .../src/render/software/SDL_blendfillrect.h | 27 + .../sdl/src/render/software/SDL_blendline.c | 777 + .../sdl/src/render/software/SDL_blendline.h | 27 + .../sdl/src/render/software/SDL_blendpoint.c | 343 + .../sdl/src/render/software/SDL_blendpoint.h | 27 + Engine/lib/sdl/src/render/software/SDL_draw.h | 575 + .../sdl/src/render/software/SDL_drawline.c | 209 + .../sdl/src/render/software/SDL_drawline.h | 27 + .../sdl/src/render/software/SDL_drawpoint.c | 114 + .../sdl/src/render/software/SDL_drawpoint.h | 27 + .../sdl/src/render/software/SDL_render_sw.c | 727 + .../sdl/src/render/software/SDL_render_sw_c.h | 24 + .../lib/sdl/src/render/software/SDL_rotate.c | 501 + .../lib/sdl/src/render/software/SDL_rotate.h | 28 + Engine/lib/sdl/src/stdlib/SDL_getenv.c | 272 + Engine/lib/sdl/src/stdlib/SDL_iconv.c | 924 + Engine/lib/sdl/src/stdlib/SDL_malloc.c | 5258 ++++ Engine/lib/sdl/src/stdlib/SDL_qsort.c | 476 + Engine/lib/sdl/src/stdlib/SDL_stdlib.c | 945 + Engine/lib/sdl/src/stdlib/SDL_string.c | 1635 + Engine/lib/sdl/src/test/SDL_test_assert.c | 150 + Engine/lib/sdl/src/test/SDL_test_common.c | 1548 + Engine/lib/sdl/src/test/SDL_test_compare.c | 107 + Engine/lib/sdl/src/test/SDL_test_crc32.c | 165 + Engine/lib/sdl/src/test/SDL_test_font.c | 3238 ++ Engine/lib/sdl/src/test/SDL_test_fuzzer.c | 524 + Engine/lib/sdl/src/test/SDL_test_harness.c | 675 + Engine/lib/sdl/src/test/SDL_test_imageBlit.c | 1557 + .../sdl/src/test/SDL_test_imageBlitBlend.c | 2843 ++ Engine/lib/sdl/src/test/SDL_test_imageFace.c | 246 + .../sdl/src/test/SDL_test_imagePrimitives.c | 512 + .../src/test/SDL_test_imagePrimitivesBlend.c | 694 + Engine/lib/sdl/src/test/SDL_test_log.c | 102 + Engine/lib/sdl/src/test/SDL_test_md5.c | 336 + Engine/lib/sdl/src/test/SDL_test_random.c | 94 + Engine/lib/sdl/src/thread/SDL_systhread.h | 65 + Engine/lib/sdl/src/thread/SDL_thread.c | 456 + Engine/lib/sdl/src/thread/SDL_thread_c.h | 94 + .../lib/sdl/src/thread/generic/SDL_syscond.c | 220 + .../lib/sdl/src/thread/generic/SDL_sysmutex.c | 165 + .../sdl/src/thread/generic/SDL_sysmutex_c.h | 22 + .../lib/sdl/src/thread/generic/SDL_syssem.c | 217 + .../sdl/src/thread/generic/SDL_systhread.c | 71 + .../sdl/src/thread/generic/SDL_systhread_c.h | 26 + .../lib/sdl/src/thread/generic/SDL_systls.c | 38 + Engine/lib/sdl/src/thread/psp/SDL_syscond.c | 220 + Engine/lib/sdl/src/thread/psp/SDL_sysmutex.c | 132 + .../lib/sdl/src/thread/psp/SDL_sysmutex_c.h | 22 + Engine/lib/sdl/src/thread/psp/SDL_syssem.c | 156 + Engine/lib/sdl/src/thread/psp/SDL_systhread.c | 108 + .../lib/sdl/src/thread/psp/SDL_systhread_c.h | 24 + .../lib/sdl/src/thread/pthread/SDL_syscond.c | 148 + .../lib/sdl/src/thread/pthread/SDL_sysmutex.c | 193 + .../sdl/src/thread/pthread/SDL_sysmutex_c.h | 32 + .../lib/sdl/src/thread/pthread/SDL_syssem.c | 199 + .../sdl/src/thread/pthread/SDL_systhread.c | 222 + .../sdl/src/thread/pthread/SDL_systhread_c.h | 27 + .../lib/sdl/src/thread/pthread/SDL_systls.c | 69 + .../lib/sdl/src/thread/stdcpp/SDL_syscond.cpp | 164 + .../sdl/src/thread/stdcpp/SDL_sysmutex.cpp | 111 + .../sdl/src/thread/stdcpp/SDL_sysmutex_c.h | 30 + .../sdl/src/thread/stdcpp/SDL_systhread.cpp | 167 + .../sdl/src/thread/stdcpp/SDL_systhread_c.h | 26 + .../lib/sdl/src/thread/windows/SDL_sysmutex.c | 106 + .../lib/sdl/src/thread/windows/SDL_syssem.c | 148 + .../sdl/src/thread/windows/SDL_systhread.c | 245 + .../sdl/src/thread/windows/SDL_systhread_c.h | 32 + .../lib/sdl/src/thread/windows/SDL_systls.c | 72 + Engine/lib/sdl/src/timer/SDL_timer.c | 389 + Engine/lib/sdl/src/timer/SDL_timer_c.h | 34 + Engine/lib/sdl/src/timer/dummy/SDL_systimer.c | 75 + Engine/lib/sdl/src/timer/haiku/SDL_systimer.c | 80 + Engine/lib/sdl/src/timer/psp/SDL_systimer.c | 86 + Engine/lib/sdl/src/timer/unix/SDL_systimer.c | 217 + .../lib/sdl/src/timer/windows/SDL_systimer.c | 210 + Engine/lib/sdl/src/video/SDL_RLEaccel.c | 1566 + Engine/lib/sdl/src/video/SDL_RLEaccel_c.h | 31 + Engine/lib/sdl/src/video/SDL_blit.c | 286 + Engine/lib/sdl/src/video/SDL_blit.h | 552 + Engine/lib/sdl/src/video/SDL_blit_0.c | 483 + Engine/lib/sdl/src/video/SDL_blit_1.c | 550 + Engine/lib/sdl/src/video/SDL_blit_A.c | 1388 + Engine/lib/sdl/src/video/SDL_blit_N.c | 2601 ++ Engine/lib/sdl/src/video/SDL_blit_auto.c | 7563 +++++ Engine/lib/sdl/src/video/SDL_blit_auto.h | 30 + Engine/lib/sdl/src/video/SDL_blit_copy.c | 152 + Engine/lib/sdl/src/video/SDL_blit_copy.h | 24 + Engine/lib/sdl/src/video/SDL_blit_slow.c | 161 + Engine/lib/sdl/src/video/SDL_blit_slow.h | 25 + Engine/lib/sdl/src/video/SDL_bmp.c | 612 + Engine/lib/sdl/src/video/SDL_clipboard.c | 76 + Engine/lib/sdl/src/video/SDL_egl.c | 509 + Engine/lib/sdl/src/video/SDL_egl_c.h | 130 + Engine/lib/sdl/src/video/SDL_fillrect.c | 335 + Engine/lib/sdl/src/video/SDL_pixels.c | 1127 + Engine/lib/sdl/src/video/SDL_pixels_c.h | 41 + Engine/lib/sdl/src/video/SDL_rect.c | 525 + Engine/lib/sdl/src/video/SDL_rect_c.h | 25 + Engine/lib/sdl/src/video/SDL_shape.c | 286 + .../lib/sdl/src/video/SDL_shape_internals.h | 69 + Engine/lib/sdl/src/video/SDL_stretch.c | 353 + Engine/lib/sdl/src/video/SDL_surface.c | 1094 + Engine/lib/sdl/src/video/SDL_sysvideo.h | 410 + Engine/lib/sdl/src/video/SDL_video.c | 3345 ++ .../src/video/android/SDL_androidclipboard.c | 48 + .../src/video/android/SDL_androidclipboard.h | 32 + .../sdl/src/video/android/SDL_androidevents.c | 112 + .../sdl/src/video/android/SDL_androidevents.h | 27 + .../lib/sdl/src/video/android/SDL_androidgl.c | 57 + .../src/video/android/SDL_androidkeyboard.c | 334 + .../src/video/android/SDL_androidkeyboard.h | 36 + .../sdl/src/video/android/SDL_androidtouch.c | 125 + .../sdl/src/video/android/SDL_androidtouch.h | 28 + .../sdl/src/video/android/SDL_androidvideo.c | 195 + .../sdl/src/video/android/SDL_androidvideo.h | 49 + .../sdl/src/video/android/SDL_androidwindow.c | 120 + .../sdl/src/video/android/SDL_androidwindow.h | 43 + .../sdl/src/video/cocoa/SDL_cocoaclipboard.h | 36 + .../sdl/src/video/cocoa/SDL_cocoaclipboard.m | 127 + .../lib/sdl/src/video/cocoa/SDL_cocoaevents.h | 31 + .../lib/sdl/src/video/cocoa/SDL_cocoaevents.m | 349 + .../sdl/src/video/cocoa/SDL_cocoakeyboard.h | 36 + .../sdl/src/video/cocoa/SDL_cocoakeyboard.m | 630 + .../sdl/src/video/cocoa/SDL_cocoamessagebox.h | 29 + .../sdl/src/video/cocoa/SDL_cocoamessagebox.m | 145 + .../lib/sdl/src/video/cocoa/SDL_cocoamodes.h | 44 + .../lib/sdl/src/video/cocoa/SDL_cocoamodes.m | 465 + .../lib/sdl/src/video/cocoa/SDL_cocoamouse.h | 52 + .../lib/sdl/src/video/cocoa/SDL_cocoamouse.m | 407 + .../sdl/src/video/cocoa/SDL_cocoamousetap.h | 33 + .../sdl/src/video/cocoa/SDL_cocoamousetap.m | 259 + .../lib/sdl/src/video/cocoa/SDL_cocoaopengl.h | 68 + .../lib/sdl/src/video/cocoa/SDL_cocoaopengl.m | 440 + .../lib/sdl/src/video/cocoa/SDL_cocoashape.h | 43 + .../lib/sdl/src/video/cocoa/SDL_cocoashape.m | 113 + .../lib/sdl/src/video/cocoa/SDL_cocoavideo.h | 62 + .../lib/sdl/src/video/cocoa/SDL_cocoavideo.m | 242 + .../lib/sdl/src/video/cocoa/SDL_cocoawindow.h | 146 + .../lib/sdl/src/video/cocoa/SDL_cocoawindow.m | 1550 + .../sdl/src/video/directfb/SDL_DirectFB_WM.c | 413 + .../sdl/src/video/directfb/SDL_DirectFB_WM.h | 56 + .../sdl/src/video/directfb/SDL_DirectFB_dyn.c | 117 + .../sdl/src/video/directfb/SDL_DirectFB_dyn.h | 39 + .../src/video/directfb/SDL_DirectFB_events.c | 751 + .../src/video/directfb/SDL_DirectFB_events.h | 32 + .../src/video/directfb/SDL_DirectFB_modes.c | 414 + .../src/video/directfb/SDL_DirectFB_modes.h | 59 + .../src/video/directfb/SDL_DirectFB_mouse.c | 394 + .../src/video/directfb/SDL_DirectFB_mouse.h | 44 + .../src/video/directfb/SDL_DirectFB_opengl.c | 345 + .../src/video/directfb/SDL_DirectFB_opengl.h | 64 + .../src/video/directfb/SDL_DirectFB_render.c | 1328 + .../src/video/directfb/SDL_DirectFB_render.h | 25 + .../src/video/directfb/SDL_DirectFB_shape.c | 134 + .../src/video/directfb/SDL_DirectFB_shape.h | 39 + .../src/video/directfb/SDL_DirectFB_video.c | 424 + .../src/video/directfb/SDL_DirectFB_video.h | 170 + .../src/video/directfb/SDL_DirectFB_window.c | 532 + .../src/video/directfb/SDL_DirectFB_window.h | 81 + .../lib/sdl/src/video/dummy/SDL_nullevents.c | 41 + .../sdl/src/video/dummy/SDL_nullevents_c.h | 27 + .../sdl/src/video/dummy/SDL_nullframebuffer.c | 89 + .../src/video/dummy/SDL_nullframebuffer_c.h | 27 + .../lib/sdl/src/video/dummy/SDL_nullvideo.c | 144 + .../lib/sdl/src/video/dummy/SDL_nullvideo.h | 30 + Engine/lib/sdl/src/video/haiku/SDL_BWin.h | 638 + .../lib/sdl/src/video/haiku/SDL_bclipboard.cc | 95 + .../lib/sdl/src/video/haiku/SDL_bclipboard.h | 31 + Engine/lib/sdl/src/video/haiku/SDL_bevents.cc | 39 + Engine/lib/sdl/src/video/haiku/SDL_bevents.h | 37 + .../sdl/src/video/haiku/SDL_bframebuffer.cc | 254 + .../sdl/src/video/haiku/SDL_bframebuffer.h | 45 + .../lib/sdl/src/video/haiku/SDL_bkeyboard.cc | 188 + .../lib/sdl/src/video/haiku/SDL_bkeyboard.h | 42 + Engine/lib/sdl/src/video/haiku/SDL_bmodes.cc | 331 + Engine/lib/sdl/src/video/haiku/SDL_bmodes.h | 46 + Engine/lib/sdl/src/video/haiku/SDL_bopengl.cc | 219 + Engine/lib/sdl/src/video/haiku/SDL_bopengl.h | 49 + Engine/lib/sdl/src/video/haiku/SDL_bvideo.cc | 174 + Engine/lib/sdl/src/video/haiku/SDL_bvideo.h | 42 + Engine/lib/sdl/src/video/haiku/SDL_bwindow.cc | 223 + Engine/lib/sdl/src/video/haiku/SDL_bwindow.h | 53 + Engine/lib/sdl/src/video/mir/SDL_mirdyn.c | 177 + Engine/lib/sdl/src/video/mir/SDL_mirdyn.h | 53 + Engine/lib/sdl/src/video/mir/SDL_mirevents.c | 260 + Engine/lib/sdl/src/video/mir/SDL_mirevents.h | 37 + .../sdl/src/video/mir/SDL_mirframebuffer.c | 157 + .../sdl/src/video/mir/SDL_mirframebuffer.h | 47 + Engine/lib/sdl/src/video/mir/SDL_mirmouse.c | 154 + Engine/lib/sdl/src/video/mir/SDL_mirmouse.h | 37 + Engine/lib/sdl/src/video/mir/SDL_miropengl.c | 96 + Engine/lib/sdl/src/video/mir/SDL_miropengl.h | 58 + Engine/lib/sdl/src/video/mir/SDL_mirsym.h | 48 + Engine/lib/sdl/src/video/mir/SDL_mirvideo.c | 345 + Engine/lib/sdl/src/video/mir/SDL_mirvideo.h | 39 + Engine/lib/sdl/src/video/mir/SDL_mirwindow.c | 227 + Engine/lib/sdl/src/video/mir/SDL_mirwindow.h | 69 + .../lib/sdl/src/video/pandora/SDL_pandora.c | 850 + .../lib/sdl/src/video/pandora/SDL_pandora.h | 101 + .../src/video/pandora/SDL_pandora_events.c | 38 + .../src/video/pandora/SDL_pandora_events.h | 25 + Engine/lib/sdl/src/video/psp/SDL_pspevents.c | 284 + .../lib/sdl/src/video/psp/SDL_pspevents_c.h | 31 + Engine/lib/sdl/src/video/psp/SDL_pspgl.c | 205 + Engine/lib/sdl/src/video/psp/SDL_pspgl_c.h | 52 + Engine/lib/sdl/src/video/psp/SDL_pspmouse.c | 35 + Engine/lib/sdl/src/video/psp/SDL_pspmouse_c.h | 24 + Engine/lib/sdl/src/video/psp/SDL_pspvideo.c | 328 + Engine/lib/sdl/src/video/psp/SDL_pspvideo.h | 102 + .../sdl/src/video/raspberry/SDL_rpievents.c | 45 + .../sdl/src/video/raspberry/SDL_rpievents_c.h | 31 + .../sdl/src/video/raspberry/SDL_rpimouse.c | 277 + .../sdl/src/video/raspberry/SDL_rpimouse.h | 43 + .../sdl/src/video/raspberry/SDL_rpiopengles.c | 42 + .../sdl/src/video/raspberry/SDL_rpiopengles.h | 48 + .../sdl/src/video/raspberry/SDL_rpivideo.c | 372 + .../sdl/src/video/raspberry/SDL_rpivideo.h | 98 + Engine/lib/sdl/src/video/sdlgenblit.pl | 476 + .../src/video/uikit/SDL_uikitappdelegate.h | 32 + .../src/video/uikit/SDL_uikitappdelegate.m | 290 + .../lib/sdl/src/video/uikit/SDL_uikitevents.h | 30 + .../lib/sdl/src/video/uikit/SDL_uikitevents.m | 68 + .../sdl/src/video/uikit/SDL_uikitmessagebox.h | 31 + .../sdl/src/video/uikit/SDL_uikitmessagebox.m | 114 + .../lib/sdl/src/video/uikit/SDL_uikitmodes.h | 51 + .../lib/sdl/src/video/uikit/SDL_uikitmodes.m | 322 + .../sdl/src/video/uikit/SDL_uikitopengles.h | 36 + .../sdl/src/video/uikit/SDL_uikitopengles.m | 181 + .../sdl/src/video/uikit/SDL_uikitopenglview.h | 86 + .../sdl/src/video/uikit/SDL_uikitopenglview.m | 246 + .../lib/sdl/src/video/uikit/SDL_uikitvideo.h | 45 + .../lib/sdl/src/video/uikit/SDL_uikitvideo.m | 146 + .../lib/sdl/src/video/uikit/SDL_uikitview.h | 78 + .../lib/sdl/src/video/uikit/SDL_uikitview.m | 463 + .../src/video/uikit/SDL_uikitviewcontroller.h | 40 + .../src/video/uikit/SDL_uikitviewcontroller.m | 135 + .../lib/sdl/src/video/uikit/SDL_uikitwindow.h | 51 + .../lib/sdl/src/video/uikit/SDL_uikitwindow.m | 333 + Engine/lib/sdl/src/video/uikit/keyinfotable.h | 174 + .../sdl/src/video/wayland/SDL_waylanddyn.c | 195 + .../sdl/src/video/wayland/SDL_waylanddyn.h | 104 + .../sdl/src/video/wayland/SDL_waylandevents.c | 404 + .../src/video/wayland/SDL_waylandevents_c.h | 37 + .../sdl/src/video/wayland/SDL_waylandmouse.c | 414 + .../sdl/src/video/wayland/SDL_waylandmouse.h | 31 + .../src/video/wayland/SDL_waylandopengles.c | 91 + .../src/video/wayland/SDL_waylandopengles.h | 46 + .../sdl/src/video/wayland/SDL_waylandsym.h | 106 + .../sdl/src/video/wayland/SDL_waylandtouch.c | 264 + .../sdl/src/video/wayland/SDL_waylandtouch.h | 352 + .../sdl/src/video/wayland/SDL_waylandvideo.c | 437 + .../sdl/src/video/wayland/SDL_waylandvideo.h | 74 + .../sdl/src/video/wayland/SDL_waylandwindow.c | 243 + .../sdl/src/video/wayland/SDL_waylandwindow.h | 61 + Engine/lib/sdl/src/video/windows/SDL_msctf.h | 242 + Engine/lib/sdl/src/video/windows/SDL_vkeys.h | 76 + .../src/video/windows/SDL_windowsclipboard.c | 160 + .../src/video/windows/SDL_windowsclipboard.h | 36 + .../sdl/src/video/windows/SDL_windowsevents.c | 981 + .../sdl/src/video/windows/SDL_windowsevents.h | 36 + .../video/windows/SDL_windowsframebuffer.c | 124 + .../video/windows/SDL_windowsframebuffer.h | 27 + .../src/video/windows/SDL_windowskeyboard.c | 1524 + .../src/video/windows/SDL_windowskeyboard.h | 38 + .../src/video/windows/SDL_windowsmessagebox.c | 479 + .../src/video/windows/SDL_windowsmessagebox.h | 29 + .../sdl/src/video/windows/SDL_windowsmodes.c | 310 + .../sdl/src/video/windows/SDL_windowsmodes.h | 46 + .../sdl/src/video/windows/SDL_windowsmouse.c | 252 + .../sdl/src/video/windows/SDL_windowsmouse.h | 33 + .../sdl/src/video/windows/SDL_windowsopengl.c | 786 + .../sdl/src/video/windows/SDL_windowsopengl.h | 130 + .../src/video/windows/SDL_windowsopengles.c | 139 + .../src/video/windows/SDL_windowsopengles.h | 51 + .../sdl/src/video/windows/SDL_windowsshape.c | 110 + .../sdl/src/video/windows/SDL_windowsshape.h | 40 + .../sdl/src/video/windows/SDL_windowsvideo.c | 335 + .../sdl/src/video/windows/SDL_windowsvideo.h | 180 + .../sdl/src/video/windows/SDL_windowswindow.c | 786 + .../sdl/src/video/windows/SDL_windowswindow.h | 74 + Engine/lib/sdl/src/video/windows/wmmsg.h | 1052 + .../sdl/src/video/winrt/SDL_winrtevents.cpp | 153 + .../sdl/src/video/winrt/SDL_winrtevents_c.h | 72 + .../sdl/src/video/winrt/SDL_winrtkeyboard.cpp | 301 + .../sdl/src/video/winrt/SDL_winrtmouse.cpp | 165 + .../sdl/src/video/winrt/SDL_winrtmouse_c.h | 40 + .../sdl/src/video/winrt/SDL_winrtopengles.cpp | 50 + .../sdl/src/video/winrt/SDL_winrtopengles.h | 48 + .../src/video/winrt/SDL_winrtpointerinput.cpp | 394 + .../sdl/src/video/winrt/SDL_winrtvideo.cpp | 409 + .../sdl/src/video/winrt/SDL_winrtvideo_cpp.h | 79 + .../lib/sdl/src/video/x11/SDL_x11clipboard.c | 176 + .../lib/sdl/src/video/x11/SDL_x11clipboard.h | 32 + Engine/lib/sdl/src/video/x11/SDL_x11dyn.c | 227 + Engine/lib/sdl/src/video/x11/SDL_x11dyn.h | 114 + Engine/lib/sdl/src/video/x11/SDL_x11events.c | 1062 + Engine/lib/sdl/src/video/x11/SDL_x11events.h | 31 + .../sdl/src/video/x11/SDL_x11framebuffer.c | 257 + .../sdl/src/video/x11/SDL_x11framebuffer.h | 31 + .../lib/sdl/src/video/x11/SDL_x11keyboard.c | 321 + .../lib/sdl/src/video/x11/SDL_x11keyboard.h | 32 + .../lib/sdl/src/video/x11/SDL_x11messagebox.c | 762 + .../lib/sdl/src/video/x11/SDL_x11messagebox.h | 28 + Engine/lib/sdl/src/video/x11/SDL_x11modes.c | 889 + Engine/lib/sdl/src/video/x11/SDL_x11modes.h | 80 + Engine/lib/sdl/src/video/x11/SDL_x11mouse.c | 356 + Engine/lib/sdl/src/video/x11/SDL_x11mouse.h | 31 + Engine/lib/sdl/src/video/x11/SDL_x11opengl.c | 825 + Engine/lib/sdl/src/video/x11/SDL_x11opengl.h | 70 + .../lib/sdl/src/video/x11/SDL_x11opengles.c | 109 + .../lib/sdl/src/video/x11/SDL_x11opengles.h | 53 + Engine/lib/sdl/src/video/x11/SDL_x11shape.c | 121 + Engine/lib/sdl/src/video/x11/SDL_x11shape.h | 40 + Engine/lib/sdl/src/video/x11/SDL_x11sym.h | 303 + Engine/lib/sdl/src/video/x11/SDL_x11touch.c | 47 + Engine/lib/sdl/src/video/x11/SDL_x11touch.h | 31 + Engine/lib/sdl/src/video/x11/SDL_x11video.c | 674 + Engine/lib/sdl/src/video/x11/SDL_x11video.h | 129 + Engine/lib/sdl/src/video/x11/SDL_x11window.c | 1450 + Engine/lib/sdl/src/video/x11/SDL_x11window.h | 99 + Engine/lib/sdl/src/video/x11/SDL_x11xinput2.c | 260 + Engine/lib/sdl/src/video/x11/SDL_x11xinput2.h | 42 + Engine/lib/sdl/src/video/x11/edid-parse.c | 752 + Engine/lib/sdl/src/video/x11/edid.h | 167 + Engine/lib/sdl/src/video/x11/imKStoUCS.c | 350 + Engine/lib/sdl/src/video/x11/imKStoUCS.h | 31 + Engine/lib/sdl/test/README | 30 + 767 files changed, 295058 insertions(+), 10 deletions(-) create mode 100644 Engine/lib/sdl/Android.mk create mode 100644 Engine/lib/sdl/BUGS.txt create mode 100644 Engine/lib/sdl/CMakeLists.txt create mode 100644 Engine/lib/sdl/COPYING.txt create mode 100644 Engine/lib/sdl/CREDITS.txt create mode 100644 Engine/lib/sdl/INSTALL.txt create mode 100644 Engine/lib/sdl/Makefile.in create mode 100644 Engine/lib/sdl/Makefile.minimal create mode 100644 Engine/lib/sdl/Makefile.pandora create mode 100644 Engine/lib/sdl/Makefile.psp create mode 100644 Engine/lib/sdl/Makefile.wiz create mode 100644 Engine/lib/sdl/README-SDL.txt create mode 100644 Engine/lib/sdl/README-android.txt create mode 100644 Engine/lib/sdl/README-cmake.txt create mode 100644 Engine/lib/sdl/README-directfb.txt create mode 100644 Engine/lib/sdl/README-dynapi.txt create mode 100644 Engine/lib/sdl/README-gesture.txt create mode 100644 Engine/lib/sdl/README-hg.txt create mode 100644 Engine/lib/sdl/README-ios.txt create mode 100644 Engine/lib/sdl/README-linux.txt create mode 100644 Engine/lib/sdl/README-macosx.txt create mode 100644 Engine/lib/sdl/README-pandora.txt create mode 100644 Engine/lib/sdl/README-platforms.txt create mode 100644 Engine/lib/sdl/README-porting.txt create mode 100644 Engine/lib/sdl/README-psp.txt create mode 100644 Engine/lib/sdl/README-raspberrypi.txt create mode 100644 Engine/lib/sdl/README-touch.txt create mode 100644 Engine/lib/sdl/README-wince.txt create mode 100644 Engine/lib/sdl/README-windows.txt create mode 100644 Engine/lib/sdl/README.txt create mode 100644 Engine/lib/sdl/SDL2.spec create mode 100644 Engine/lib/sdl/SDL2.spec.in create mode 100644 Engine/lib/sdl/TODO.txt create mode 100644 Engine/lib/sdl/VisualC.html create mode 100644 Engine/lib/sdl/VisualC/clean.sh create mode 100644 Engine/lib/sdl/WhatsNew.txt create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/Default.png create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/Demos.xcodeproj/project.pbxproj create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/Icon.png create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/Info.plist create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/README create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/bitmapfont/kromasky_16x16.bmp create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/bitmapfont/license.txt create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/drums/ds_brush_snare.wav create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/drums/ds_china.wav create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/drums/ds_kick_big_amb.wav create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/drums/ds_loose_skin_mute.wav create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/icon.bmp create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/ship.bmp create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/space.bmp create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/data/stroke.bmp create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/accelerometer.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/common.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/common.h create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/fireworks.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/happy.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/keyboard.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/mixer.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/rectangles.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Demos/src/touch.c create mode 100644 Engine/lib/sdl/Xcode-iOS/SDL/SDL.xcodeproj/project.pbxproj create mode 100644 Engine/lib/sdl/Xcode-iOS/SDLtest/SDL2test.xcodeproj/project.pbxproj create mode 100644 Engine/lib/sdl/Xcode-iOS/Template/SDL iOS Application/Default.png create mode 100644 Engine/lib/sdl/Xcode-iOS/Template/SDL iOS Application/Icon.png create mode 100644 Engine/lib/sdl/Xcode-iOS/Template/SDL iOS Application/Info.plist create mode 100644 Engine/lib/sdl/Xcode-iOS/Template/SDL iOS Application/___PROJECTNAME___.xcodeproj/TemplateIcon.icns create mode 100644 Engine/lib/sdl/Xcode-iOS/Template/SDL iOS Application/___PROJECTNAME___.xcodeproj/TemplateInfo.plist create mode 100644 Engine/lib/sdl/Xcode-iOS/Template/SDL iOS Application/___PROJECTNAME___.xcodeproj/project.pbxproj create mode 100644 Engine/lib/sdl/Xcode-iOS/Template/SDL iOS Application/main.c create mode 100644 Engine/lib/sdl/Xcode-iOS/Test/Info.plist create mode 100644 Engine/lib/sdl/Xcode-iOS/Test/README create mode 100644 Engine/lib/sdl/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj create mode 100644 Engine/lib/sdl/Xcode/SDL/Info-Framework.plist create mode 100644 Engine/lib/sdl/Xcode/SDL/SDL.xcodeproj/project.pbxproj create mode 100644 Engine/lib/sdl/Xcode/SDL/pkg-support/SDL.info create mode 100644 Engine/lib/sdl/Xcode/SDL/pkg-support/codesign-frameworks.sh create mode 100644 Engine/lib/sdl/Xcode/SDL/pkg-support/resources/License.txt create mode 100644 Engine/lib/sdl/Xcode/SDL/pkg-support/resources/ReadMe.txt create mode 100644 Engine/lib/sdl/Xcode/SDL/pkg-support/resources/SDL_DS_Store create mode 100644 Engine/lib/sdl/Xcode/SDL/pkg-support/sdl_logo.pdf create mode 100644 Engine/lib/sdl/Xcode/SDLTest/SDLTest.xcodeproj/project.pbxproj create mode 100644 Engine/lib/sdl/Xcode/SDLTest/TestDropFile-Info.plist create mode 100644 Engine/lib/sdl/Xcode/XcodeDocSet/Doxyfile create mode 100644 Engine/lib/sdl/acinclude/ac_check_define.m4 create mode 100644 Engine/lib/sdl/acinclude/alsa.m4 create mode 100644 Engine/lib/sdl/acinclude/ax_check_compiler_flags.m4 create mode 100644 Engine/lib/sdl/acinclude/ax_gcc_archflag.m4 create mode 100644 Engine/lib/sdl/acinclude/ax_gcc_x86_cpuid.m4.htm create mode 100644 Engine/lib/sdl/acinclude/esd.m4 create mode 100644 Engine/lib/sdl/acinclude/libtool.m4 create mode 100644 Engine/lib/sdl/acinclude/ltoptions.m4 create mode 100644 Engine/lib/sdl/acinclude/ltsugar.m4 create mode 100644 Engine/lib/sdl/acinclude/ltversion.m4 create mode 100644 Engine/lib/sdl/acinclude/lt~obsolete.m4 create mode 100644 Engine/lib/sdl/android-project/AndroidManifest.xml create mode 100644 Engine/lib/sdl/android-project/ant.properties create mode 100644 Engine/lib/sdl/android-project/build.properties create mode 100644 Engine/lib/sdl/android-project/build.xml create mode 100644 Engine/lib/sdl/android-project/default.properties create mode 100644 Engine/lib/sdl/android-project/jni/Android.mk create mode 100644 Engine/lib/sdl/android-project/jni/Application.mk create mode 100644 Engine/lib/sdl/android-project/jni/src/Android.mk create mode 100644 Engine/lib/sdl/android-project/jni/src/Android_static.mk create mode 100644 Engine/lib/sdl/android-project/proguard-project.txt create mode 100644 Engine/lib/sdl/android-project/project.properties create mode 100644 Engine/lib/sdl/android-project/res/drawable-hdpi/ic_launcher.png create mode 100644 Engine/lib/sdl/android-project/res/drawable-mdpi/ic_launcher.png create mode 100644 Engine/lib/sdl/android-project/res/drawable-xhdpi/ic_launcher.png create mode 100644 Engine/lib/sdl/android-project/res/drawable-xxhdpi/ic_launcher.png create mode 100644 Engine/lib/sdl/android-project/res/layout/main.xml create mode 100644 Engine/lib/sdl/android-project/res/values/strings.xml create mode 100644 Engine/lib/sdl/android-project/src/org/libsdl/app/SDLActivity.java create mode 100644 Engine/lib/sdl/autogen.sh create mode 100644 Engine/lib/sdl/build-scripts/androidbuild.sh create mode 100644 Engine/lib/sdl/build-scripts/config.guess create mode 100644 Engine/lib/sdl/build-scripts/config.sub create mode 100644 Engine/lib/sdl/build-scripts/g++-fat.sh create mode 100644 Engine/lib/sdl/build-scripts/gcc-fat.sh create mode 100644 Engine/lib/sdl/build-scripts/install-sh create mode 100644 Engine/lib/sdl/build-scripts/iosbuild.sh create mode 100644 Engine/lib/sdl/build-scripts/ltmain.sh create mode 100644 Engine/lib/sdl/build-scripts/mkinstalldirs create mode 100644 Engine/lib/sdl/build-scripts/raspberrypi-buildbot.sh create mode 100644 Engine/lib/sdl/build-scripts/showrev.sh create mode 100644 Engine/lib/sdl/build-scripts/strip_fPIC.sh create mode 100644 Engine/lib/sdl/build-scripts/updaterev.sh create mode 100644 Engine/lib/sdl/cmake/macros.cmake create mode 100644 Engine/lib/sdl/cmake/sdlchecks.cmake create mode 100644 Engine/lib/sdl/configure create mode 100644 Engine/lib/sdl/configure.in create mode 100644 Engine/lib/sdl/debian/changelog create mode 100644 Engine/lib/sdl/debian/compat create mode 100644 Engine/lib/sdl/debian/control create mode 100644 Engine/lib/sdl/debian/copyright create mode 100644 Engine/lib/sdl/debian/docs create mode 100644 Engine/lib/sdl/debian/libsdl2-dev.install create mode 100644 Engine/lib/sdl/debian/libsdl2-dev.manpages create mode 100644 Engine/lib/sdl/debian/libsdl2.install create mode 100644 Engine/lib/sdl/debian/rules create mode 100644 Engine/lib/sdl/debian/sdl2-config.1 create mode 100644 Engine/lib/sdl/debian/source/format create mode 100644 Engine/lib/sdl/debian/watch create mode 100644 Engine/lib/sdl/include/SDL.h create mode 100644 Engine/lib/sdl/include/SDL_assert.h create mode 100644 Engine/lib/sdl/include/SDL_atomic.h create mode 100644 Engine/lib/sdl/include/SDL_audio.h create mode 100644 Engine/lib/sdl/include/SDL_bits.h create mode 100644 Engine/lib/sdl/include/SDL_blendmode.h create mode 100644 Engine/lib/sdl/include/SDL_clipboard.h create mode 100644 Engine/lib/sdl/include/SDL_config.h create mode 100644 Engine/lib/sdl/include/SDL_config.h.cmake create mode 100644 Engine/lib/sdl/include/SDL_config.h.in create mode 100644 Engine/lib/sdl/include/SDL_config_android.h create mode 100644 Engine/lib/sdl/include/SDL_config_iphoneos.h create mode 100644 Engine/lib/sdl/include/SDL_config_macosx.h create mode 100644 Engine/lib/sdl/include/SDL_config_minimal.h create mode 100644 Engine/lib/sdl/include/SDL_config_pandora.h create mode 100644 Engine/lib/sdl/include/SDL_config_psp.h create mode 100644 Engine/lib/sdl/include/SDL_config_windows.h create mode 100644 Engine/lib/sdl/include/SDL_config_winrt.h create mode 100644 Engine/lib/sdl/include/SDL_config_wiz.h create mode 100644 Engine/lib/sdl/include/SDL_copying.h create mode 100644 Engine/lib/sdl/include/SDL_cpuinfo.h create mode 100644 Engine/lib/sdl/include/SDL_egl.h create mode 100644 Engine/lib/sdl/include/SDL_endian.h create mode 100644 Engine/lib/sdl/include/SDL_error.h create mode 100644 Engine/lib/sdl/include/SDL_events.h create mode 100644 Engine/lib/sdl/include/SDL_filesystem.h create mode 100644 Engine/lib/sdl/include/SDL_gamecontroller.h create mode 100644 Engine/lib/sdl/include/SDL_gesture.h create mode 100644 Engine/lib/sdl/include/SDL_haptic.h create mode 100644 Engine/lib/sdl/include/SDL_hints.h create mode 100644 Engine/lib/sdl/include/SDL_joystick.h create mode 100644 Engine/lib/sdl/include/SDL_keyboard.h create mode 100644 Engine/lib/sdl/include/SDL_keycode.h create mode 100644 Engine/lib/sdl/include/SDL_loadso.h create mode 100644 Engine/lib/sdl/include/SDL_log.h create mode 100644 Engine/lib/sdl/include/SDL_main.h create mode 100644 Engine/lib/sdl/include/SDL_messagebox.h create mode 100644 Engine/lib/sdl/include/SDL_mouse.h create mode 100644 Engine/lib/sdl/include/SDL_mutex.h create mode 100644 Engine/lib/sdl/include/SDL_name.h create mode 100644 Engine/lib/sdl/include/SDL_opengl.h create mode 100644 Engine/lib/sdl/include/SDL_opengles.h create mode 100644 Engine/lib/sdl/include/SDL_opengles2.h create mode 100644 Engine/lib/sdl/include/SDL_pixels.h create mode 100644 Engine/lib/sdl/include/SDL_platform.h create mode 100644 Engine/lib/sdl/include/SDL_power.h create mode 100644 Engine/lib/sdl/include/SDL_quit.h create mode 100644 Engine/lib/sdl/include/SDL_rect.h create mode 100644 Engine/lib/sdl/include/SDL_render.h create mode 100644 Engine/lib/sdl/include/SDL_revision.h create mode 100644 Engine/lib/sdl/include/SDL_rwops.h create mode 100644 Engine/lib/sdl/include/SDL_scancode.h create mode 100644 Engine/lib/sdl/include/SDL_shape.h create mode 100644 Engine/lib/sdl/include/SDL_stdinc.h create mode 100644 Engine/lib/sdl/include/SDL_surface.h create mode 100644 Engine/lib/sdl/include/SDL_system.h create mode 100644 Engine/lib/sdl/include/SDL_syswm.h create mode 100644 Engine/lib/sdl/include/SDL_test.h create mode 100644 Engine/lib/sdl/include/SDL_test_assert.h create mode 100644 Engine/lib/sdl/include/SDL_test_common.h create mode 100644 Engine/lib/sdl/include/SDL_test_compare.h create mode 100644 Engine/lib/sdl/include/SDL_test_crc32.h create mode 100644 Engine/lib/sdl/include/SDL_test_font.h create mode 100644 Engine/lib/sdl/include/SDL_test_fuzzer.h create mode 100644 Engine/lib/sdl/include/SDL_test_harness.h create mode 100644 Engine/lib/sdl/include/SDL_test_images.h create mode 100644 Engine/lib/sdl/include/SDL_test_log.h create mode 100644 Engine/lib/sdl/include/SDL_test_md5.h create mode 100644 Engine/lib/sdl/include/SDL_test_random.h create mode 100644 Engine/lib/sdl/include/SDL_thread.h create mode 100644 Engine/lib/sdl/include/SDL_timer.h create mode 100644 Engine/lib/sdl/include/SDL_touch.h create mode 100644 Engine/lib/sdl/include/SDL_types.h create mode 100644 Engine/lib/sdl/include/SDL_version.h create mode 100644 Engine/lib/sdl/include/SDL_video.h create mode 100644 Engine/lib/sdl/include/begin_code.h create mode 100644 Engine/lib/sdl/include/close_code.h create mode 100644 Engine/lib/sdl/include/doxyfile delete mode 100644 Engine/lib/sdl/linux/libSDL-1.2.so.0 delete mode 100644 Engine/lib/sdl/linux/readme.txt create mode 100644 Engine/lib/sdl/sdl2-config.in create mode 100644 Engine/lib/sdl/sdl2.m4 create mode 100644 Engine/lib/sdl/sdl2.pc.in create mode 100644 Engine/lib/sdl/src/SDL.c create mode 100644 Engine/lib/sdl/src/SDL_assert.c create mode 100644 Engine/lib/sdl/src/SDL_assert_c.h create mode 100644 Engine/lib/sdl/src/SDL_error.c create mode 100644 Engine/lib/sdl/src/SDL_error_c.h create mode 100644 Engine/lib/sdl/src/SDL_hints.c create mode 100644 Engine/lib/sdl/src/SDL_internal.h create mode 100644 Engine/lib/sdl/src/SDL_log.c create mode 100644 Engine/lib/sdl/src/atomic/SDL_atomic.c create mode 100644 Engine/lib/sdl/src/atomic/SDL_spinlock.c create mode 100644 Engine/lib/sdl/src/audio/SDL_audio.c create mode 100644 Engine/lib/sdl/src/audio/SDL_audio_c.h create mode 100644 Engine/lib/sdl/src/audio/SDL_audiocvt.c create mode 100644 Engine/lib/sdl/src/audio/SDL_audiodev.c create mode 100644 Engine/lib/sdl/src/audio/SDL_audiodev_c.h create mode 100644 Engine/lib/sdl/src/audio/SDL_audiomem.h create mode 100644 Engine/lib/sdl/src/audio/SDL_audiotypecvt.c create mode 100644 Engine/lib/sdl/src/audio/SDL_mixer.c create mode 100644 Engine/lib/sdl/src/audio/SDL_sysaudio.h create mode 100644 Engine/lib/sdl/src/audio/SDL_wave.c create mode 100644 Engine/lib/sdl/src/audio/SDL_wave.h create mode 100644 Engine/lib/sdl/src/audio/alsa/SDL_alsa_audio.c create mode 100644 Engine/lib/sdl/src/audio/alsa/SDL_alsa_audio.h create mode 100644 Engine/lib/sdl/src/audio/android/SDL_androidaudio.c create mode 100644 Engine/lib/sdl/src/audio/android/SDL_androidaudio.h create mode 100644 Engine/lib/sdl/src/audio/arts/SDL_artsaudio.c create mode 100644 Engine/lib/sdl/src/audio/arts/SDL_artsaudio.h create mode 100644 Engine/lib/sdl/src/audio/bsd/SDL_bsdaudio.c create mode 100644 Engine/lib/sdl/src/audio/bsd/SDL_bsdaudio.h create mode 100644 Engine/lib/sdl/src/audio/coreaudio/SDL_coreaudio.c create mode 100644 Engine/lib/sdl/src/audio/coreaudio/SDL_coreaudio.h create mode 100644 Engine/lib/sdl/src/audio/directsound/SDL_directsound.c create mode 100644 Engine/lib/sdl/src/audio/directsound/SDL_directsound.h create mode 100644 Engine/lib/sdl/src/audio/directsound/directx.h create mode 100644 Engine/lib/sdl/src/audio/disk/SDL_diskaudio.c create mode 100644 Engine/lib/sdl/src/audio/disk/SDL_diskaudio.h create mode 100644 Engine/lib/sdl/src/audio/dsp/SDL_dspaudio.c create mode 100644 Engine/lib/sdl/src/audio/dsp/SDL_dspaudio.h create mode 100644 Engine/lib/sdl/src/audio/dummy/SDL_dummyaudio.c create mode 100644 Engine/lib/sdl/src/audio/dummy/SDL_dummyaudio.h create mode 100644 Engine/lib/sdl/src/audio/esd/SDL_esdaudio.c create mode 100644 Engine/lib/sdl/src/audio/esd/SDL_esdaudio.h create mode 100644 Engine/lib/sdl/src/audio/fusionsound/SDL_fsaudio.c create mode 100644 Engine/lib/sdl/src/audio/fusionsound/SDL_fsaudio.h create mode 100644 Engine/lib/sdl/src/audio/haiku/SDL_haikuaudio.cc create mode 100644 Engine/lib/sdl/src/audio/haiku/SDL_haikuaudio.h create mode 100644 Engine/lib/sdl/src/audio/nas/SDL_nasaudio.c create mode 100644 Engine/lib/sdl/src/audio/nas/SDL_nasaudio.h create mode 100644 Engine/lib/sdl/src/audio/paudio/SDL_paudio.c create mode 100644 Engine/lib/sdl/src/audio/paudio/SDL_paudio.h create mode 100644 Engine/lib/sdl/src/audio/psp/SDL_pspaudio.c create mode 100644 Engine/lib/sdl/src/audio/psp/SDL_pspaudio.h create mode 100644 Engine/lib/sdl/src/audio/pulseaudio/SDL_pulseaudio.c create mode 100644 Engine/lib/sdl/src/audio/pulseaudio/SDL_pulseaudio.h create mode 100644 Engine/lib/sdl/src/audio/qsa/SDL_qsa_audio.c create mode 100644 Engine/lib/sdl/src/audio/qsa/SDL_qsa_audio.h create mode 100644 Engine/lib/sdl/src/audio/sdlgenaudiocvt.pl create mode 100644 Engine/lib/sdl/src/audio/sndio/SDL_sndioaudio.c create mode 100644 Engine/lib/sdl/src/audio/sndio/SDL_sndioaudio.h create mode 100644 Engine/lib/sdl/src/audio/sun/SDL_sunaudio.c create mode 100644 Engine/lib/sdl/src/audio/sun/SDL_sunaudio.h create mode 100644 Engine/lib/sdl/src/audio/winmm/SDL_winmm.c create mode 100644 Engine/lib/sdl/src/audio/winmm/SDL_winmm.h create mode 100644 Engine/lib/sdl/src/audio/xaudio2/SDL_xaudio2.c create mode 100644 Engine/lib/sdl/src/audio/xaudio2/SDL_xaudio2_winrthelpers.cpp create mode 100644 Engine/lib/sdl/src/audio/xaudio2/SDL_xaudio2_winrthelpers.h create mode 100644 Engine/lib/sdl/src/core/android/SDL_android.c create mode 100644 Engine/lib/sdl/src/core/android/SDL_android.h create mode 100644 Engine/lib/sdl/src/core/linux/SDL_evdev.c create mode 100644 Engine/lib/sdl/src/core/linux/SDL_evdev.h create mode 100644 Engine/lib/sdl/src/core/linux/SDL_udev.c create mode 100644 Engine/lib/sdl/src/core/linux/SDL_udev.h create mode 100644 Engine/lib/sdl/src/core/windows/SDL_windows.c create mode 100644 Engine/lib/sdl/src/core/windows/SDL_windows.h create mode 100644 Engine/lib/sdl/src/core/winrt/SDL_winrtapp_common.cpp create mode 100644 Engine/lib/sdl/src/core/winrt/SDL_winrtapp_common.h create mode 100644 Engine/lib/sdl/src/core/winrt/SDL_winrtapp_direct3d.cpp create mode 100644 Engine/lib/sdl/src/core/winrt/SDL_winrtapp_direct3d.h create mode 100644 Engine/lib/sdl/src/core/winrt/SDL_winrtapp_xaml.cpp create mode 100644 Engine/lib/sdl/src/core/winrt/SDL_winrtapp_xaml.h create mode 100644 Engine/lib/sdl/src/cpuinfo/SDL_cpuinfo.c create mode 100644 Engine/lib/sdl/src/dynapi/SDL_dynapi.c create mode 100644 Engine/lib/sdl/src/dynapi/SDL_dynapi.h create mode 100644 Engine/lib/sdl/src/dynapi/SDL_dynapi_overrides.h create mode 100644 Engine/lib/sdl/src/dynapi/SDL_dynapi_procs.h create mode 100644 Engine/lib/sdl/src/dynapi/gendynapi.pl create mode 100644 Engine/lib/sdl/src/events/SDL_clipboardevents.c create mode 100644 Engine/lib/sdl/src/events/SDL_clipboardevents_c.h create mode 100644 Engine/lib/sdl/src/events/SDL_dropevents.c create mode 100644 Engine/lib/sdl/src/events/SDL_dropevents_c.h create mode 100644 Engine/lib/sdl/src/events/SDL_events.c create mode 100644 Engine/lib/sdl/src/events/SDL_events_c.h create mode 100644 Engine/lib/sdl/src/events/SDL_gesture.c create mode 100644 Engine/lib/sdl/src/events/SDL_gesture_c.h create mode 100644 Engine/lib/sdl/src/events/SDL_keyboard.c create mode 100644 Engine/lib/sdl/src/events/SDL_keyboard_c.h create mode 100644 Engine/lib/sdl/src/events/SDL_mouse.c create mode 100644 Engine/lib/sdl/src/events/SDL_mouse_c.h create mode 100644 Engine/lib/sdl/src/events/SDL_quit.c create mode 100644 Engine/lib/sdl/src/events/SDL_sysevents.h create mode 100644 Engine/lib/sdl/src/events/SDL_touch.c create mode 100644 Engine/lib/sdl/src/events/SDL_touch_c.h create mode 100644 Engine/lib/sdl/src/events/SDL_windowevents.c create mode 100644 Engine/lib/sdl/src/events/SDL_windowevents_c.h create mode 100644 Engine/lib/sdl/src/events/blank_cursor.h create mode 100644 Engine/lib/sdl/src/events/default_cursor.h create mode 100644 Engine/lib/sdl/src/events/scancodes_darwin.h create mode 100644 Engine/lib/sdl/src/events/scancodes_linux.h create mode 100644 Engine/lib/sdl/src/events/scancodes_windows.h create mode 100644 Engine/lib/sdl/src/events/scancodes_xfree86.h create mode 100644 Engine/lib/sdl/src/file/SDL_rwops.c create mode 100644 Engine/lib/sdl/src/file/cocoa/SDL_rwopsbundlesupport.h create mode 100644 Engine/lib/sdl/src/file/cocoa/SDL_rwopsbundlesupport.m create mode 100644 Engine/lib/sdl/src/filesystem/cocoa/SDL_sysfilesystem.m create mode 100644 Engine/lib/sdl/src/filesystem/dummy/SDL_sysfilesystem.c create mode 100644 Engine/lib/sdl/src/filesystem/haiku/SDL_sysfilesystem.cc create mode 100644 Engine/lib/sdl/src/filesystem/unix/SDL_sysfilesystem.c create mode 100644 Engine/lib/sdl/src/filesystem/windows/SDL_sysfilesystem.c create mode 100644 Engine/lib/sdl/src/filesystem/winrt/SDL_sysfilesystem.cpp create mode 100644 Engine/lib/sdl/src/haptic/SDL_haptic.c create mode 100644 Engine/lib/sdl/src/haptic/SDL_haptic_c.h create mode 100644 Engine/lib/sdl/src/haptic/SDL_syshaptic.h create mode 100644 Engine/lib/sdl/src/haptic/darwin/SDL_syshaptic.c create mode 100644 Engine/lib/sdl/src/haptic/darwin/SDL_syshaptic_c.h create mode 100644 Engine/lib/sdl/src/haptic/dummy/SDL_syshaptic.c create mode 100644 Engine/lib/sdl/src/haptic/linux/SDL_syshaptic.c create mode 100644 Engine/lib/sdl/src/haptic/windows/SDL_syshaptic.c create mode 100644 Engine/lib/sdl/src/haptic/windows/SDL_syshaptic_c.h create mode 100644 Engine/lib/sdl/src/joystick/SDL_gamecontroller.c create mode 100644 Engine/lib/sdl/src/joystick/SDL_gamecontrollerdb.h create mode 100644 Engine/lib/sdl/src/joystick/SDL_joystick.c create mode 100644 Engine/lib/sdl/src/joystick/SDL_joystick_c.h create mode 100644 Engine/lib/sdl/src/joystick/SDL_sysjoystick.h create mode 100644 Engine/lib/sdl/src/joystick/android/SDL_sysjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/android/SDL_sysjoystick_c.h create mode 100644 Engine/lib/sdl/src/joystick/bsd/SDL_sysjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/darwin/SDL_sysjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/darwin/SDL_sysjoystick_c.h create mode 100644 Engine/lib/sdl/src/joystick/dummy/SDL_sysjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/haiku/SDL_haikujoystick.cc create mode 100644 Engine/lib/sdl/src/joystick/iphoneos/SDLUIAccelerationDelegate.h create mode 100644 Engine/lib/sdl/src/joystick/iphoneos/SDLUIAccelerationDelegate.m create mode 100644 Engine/lib/sdl/src/joystick/iphoneos/SDL_sysjoystick.m create mode 100644 Engine/lib/sdl/src/joystick/linux/SDL_sysjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/linux/SDL_sysjoystick_c.h create mode 100644 Engine/lib/sdl/src/joystick/psp/SDL_sysjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/sort_controllers.py create mode 100644 Engine/lib/sdl/src/joystick/windows/SDL_dxjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/windows/SDL_dxjoystick_c.h create mode 100644 Engine/lib/sdl/src/joystick/windows/SDL_mmjoystick.c create mode 100644 Engine/lib/sdl/src/joystick/winrt/SDL_xinputjoystick.c create mode 100644 Engine/lib/sdl/src/libm/e_atan2.c create mode 100644 Engine/lib/sdl/src/libm/e_log.c create mode 100644 Engine/lib/sdl/src/libm/e_pow.c create mode 100644 Engine/lib/sdl/src/libm/e_rem_pio2.c create mode 100644 Engine/lib/sdl/src/libm/e_sqrt.c create mode 100644 Engine/lib/sdl/src/libm/k_cos.c create mode 100644 Engine/lib/sdl/src/libm/k_rem_pio2.c create mode 100644 Engine/lib/sdl/src/libm/k_sin.c create mode 100644 Engine/lib/sdl/src/libm/math_libm.h create mode 100644 Engine/lib/sdl/src/libm/math_private.h create mode 100644 Engine/lib/sdl/src/libm/s_atan.c create mode 100644 Engine/lib/sdl/src/libm/s_copysign.c create mode 100644 Engine/lib/sdl/src/libm/s_cos.c create mode 100644 Engine/lib/sdl/src/libm/s_fabs.c create mode 100644 Engine/lib/sdl/src/libm/s_floor.c create mode 100644 Engine/lib/sdl/src/libm/s_scalbn.c create mode 100644 Engine/lib/sdl/src/libm/s_sin.c create mode 100644 Engine/lib/sdl/src/loadso/dlopen/SDL_sysloadso.c create mode 100644 Engine/lib/sdl/src/loadso/dummy/SDL_sysloadso.c create mode 100644 Engine/lib/sdl/src/loadso/haiku/SDL_sysloadso.c create mode 100644 Engine/lib/sdl/src/loadso/windows/SDL_sysloadso.c create mode 100644 Engine/lib/sdl/src/main/android/SDL_android_main.c create mode 100644 Engine/lib/sdl/src/main/dummy/SDL_dummy_main.c create mode 100644 Engine/lib/sdl/src/main/haiku/SDL_BApp.h create mode 100644 Engine/lib/sdl/src/main/haiku/SDL_BeApp.cc create mode 100644 Engine/lib/sdl/src/main/haiku/SDL_BeApp.h create mode 100644 Engine/lib/sdl/src/main/psp/SDL_psp_main.c create mode 100644 Engine/lib/sdl/src/main/windows/SDL_windows_main.c create mode 100644 Engine/lib/sdl/src/main/windows/version.rc create mode 100644 Engine/lib/sdl/src/main/winrt/SDL_winrt_main_NonXAML.cpp create mode 100644 Engine/lib/sdl/src/power/SDL_power.c create mode 100644 Engine/lib/sdl/src/power/android/SDL_syspower.c create mode 100644 Engine/lib/sdl/src/power/haiku/SDL_syspower.c create mode 100644 Engine/lib/sdl/src/power/linux/SDL_syspower.c create mode 100644 Engine/lib/sdl/src/power/macosx/SDL_syspower.c create mode 100644 Engine/lib/sdl/src/power/psp/SDL_syspower.c create mode 100644 Engine/lib/sdl/src/power/uikit/SDL_syspower.h create mode 100644 Engine/lib/sdl/src/power/uikit/SDL_syspower.m create mode 100644 Engine/lib/sdl/src/power/windows/SDL_syspower.c create mode 100644 Engine/lib/sdl/src/power/winrt/SDL_syspower.cpp create mode 100644 Engine/lib/sdl/src/render/SDL_d3dmath.c create mode 100644 Engine/lib/sdl/src/render/SDL_d3dmath.h create mode 100644 Engine/lib/sdl/src/render/SDL_render.c create mode 100644 Engine/lib/sdl/src/render/SDL_sysrender.h create mode 100644 Engine/lib/sdl/src/render/SDL_yuv_mmx.c create mode 100644 Engine/lib/sdl/src/render/SDL_yuv_sw.c create mode 100644 Engine/lib/sdl/src/render/SDL_yuv_sw_c.h create mode 100644 Engine/lib/sdl/src/render/direct3d/SDL_render_d3d.c create mode 100644 Engine/lib/sdl/src/render/direct3d11/SDL_render_d3d11.c create mode 100644 Engine/lib/sdl/src/render/direct3d11/SDL_render_winrt.cpp create mode 100644 Engine/lib/sdl/src/render/direct3d11/SDL_render_winrt.h create mode 100644 Engine/lib/sdl/src/render/mmx.h create mode 100644 Engine/lib/sdl/src/render/opengl/SDL_glfuncs.h create mode 100644 Engine/lib/sdl/src/render/opengl/SDL_render_gl.c create mode 100644 Engine/lib/sdl/src/render/opengl/SDL_shaders_gl.c create mode 100644 Engine/lib/sdl/src/render/opengl/SDL_shaders_gl.h create mode 100644 Engine/lib/sdl/src/render/opengles/SDL_glesfuncs.h create mode 100644 Engine/lib/sdl/src/render/opengles/SDL_render_gles.c create mode 100644 Engine/lib/sdl/src/render/opengles2/SDL_gles2funcs.h create mode 100644 Engine/lib/sdl/src/render/opengles2/SDL_render_gles2.c create mode 100644 Engine/lib/sdl/src/render/opengles2/SDL_shaders_gles2.c create mode 100644 Engine/lib/sdl/src/render/opengles2/SDL_shaders_gles2.h create mode 100644 Engine/lib/sdl/src/render/psp/SDL_render_psp.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_blendfillrect.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_blendfillrect.h create mode 100644 Engine/lib/sdl/src/render/software/SDL_blendline.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_blendline.h create mode 100644 Engine/lib/sdl/src/render/software/SDL_blendpoint.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_blendpoint.h create mode 100644 Engine/lib/sdl/src/render/software/SDL_draw.h create mode 100644 Engine/lib/sdl/src/render/software/SDL_drawline.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_drawline.h create mode 100644 Engine/lib/sdl/src/render/software/SDL_drawpoint.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_drawpoint.h create mode 100644 Engine/lib/sdl/src/render/software/SDL_render_sw.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_render_sw_c.h create mode 100644 Engine/lib/sdl/src/render/software/SDL_rotate.c create mode 100644 Engine/lib/sdl/src/render/software/SDL_rotate.h create mode 100644 Engine/lib/sdl/src/stdlib/SDL_getenv.c create mode 100644 Engine/lib/sdl/src/stdlib/SDL_iconv.c create mode 100644 Engine/lib/sdl/src/stdlib/SDL_malloc.c create mode 100644 Engine/lib/sdl/src/stdlib/SDL_qsort.c create mode 100644 Engine/lib/sdl/src/stdlib/SDL_stdlib.c create mode 100644 Engine/lib/sdl/src/stdlib/SDL_string.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_assert.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_common.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_compare.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_crc32.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_font.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_fuzzer.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_harness.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_imageBlit.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_imageBlitBlend.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_imageFace.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_imagePrimitives.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_imagePrimitivesBlend.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_log.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_md5.c create mode 100644 Engine/lib/sdl/src/test/SDL_test_random.c create mode 100644 Engine/lib/sdl/src/thread/SDL_systhread.h create mode 100644 Engine/lib/sdl/src/thread/SDL_thread.c create mode 100644 Engine/lib/sdl/src/thread/SDL_thread_c.h create mode 100644 Engine/lib/sdl/src/thread/generic/SDL_syscond.c create mode 100644 Engine/lib/sdl/src/thread/generic/SDL_sysmutex.c create mode 100644 Engine/lib/sdl/src/thread/generic/SDL_sysmutex_c.h create mode 100644 Engine/lib/sdl/src/thread/generic/SDL_syssem.c create mode 100644 Engine/lib/sdl/src/thread/generic/SDL_systhread.c create mode 100644 Engine/lib/sdl/src/thread/generic/SDL_systhread_c.h create mode 100644 Engine/lib/sdl/src/thread/generic/SDL_systls.c create mode 100644 Engine/lib/sdl/src/thread/psp/SDL_syscond.c create mode 100644 Engine/lib/sdl/src/thread/psp/SDL_sysmutex.c create mode 100644 Engine/lib/sdl/src/thread/psp/SDL_sysmutex_c.h create mode 100644 Engine/lib/sdl/src/thread/psp/SDL_syssem.c create mode 100644 Engine/lib/sdl/src/thread/psp/SDL_systhread.c create mode 100644 Engine/lib/sdl/src/thread/psp/SDL_systhread_c.h create mode 100644 Engine/lib/sdl/src/thread/pthread/SDL_syscond.c create mode 100644 Engine/lib/sdl/src/thread/pthread/SDL_sysmutex.c create mode 100644 Engine/lib/sdl/src/thread/pthread/SDL_sysmutex_c.h create mode 100644 Engine/lib/sdl/src/thread/pthread/SDL_syssem.c create mode 100644 Engine/lib/sdl/src/thread/pthread/SDL_systhread.c create mode 100644 Engine/lib/sdl/src/thread/pthread/SDL_systhread_c.h create mode 100644 Engine/lib/sdl/src/thread/pthread/SDL_systls.c create mode 100644 Engine/lib/sdl/src/thread/stdcpp/SDL_syscond.cpp create mode 100644 Engine/lib/sdl/src/thread/stdcpp/SDL_sysmutex.cpp create mode 100644 Engine/lib/sdl/src/thread/stdcpp/SDL_sysmutex_c.h create mode 100644 Engine/lib/sdl/src/thread/stdcpp/SDL_systhread.cpp create mode 100644 Engine/lib/sdl/src/thread/stdcpp/SDL_systhread_c.h create mode 100644 Engine/lib/sdl/src/thread/windows/SDL_sysmutex.c create mode 100644 Engine/lib/sdl/src/thread/windows/SDL_syssem.c create mode 100644 Engine/lib/sdl/src/thread/windows/SDL_systhread.c create mode 100644 Engine/lib/sdl/src/thread/windows/SDL_systhread_c.h create mode 100644 Engine/lib/sdl/src/thread/windows/SDL_systls.c create mode 100644 Engine/lib/sdl/src/timer/SDL_timer.c create mode 100644 Engine/lib/sdl/src/timer/SDL_timer_c.h create mode 100644 Engine/lib/sdl/src/timer/dummy/SDL_systimer.c create mode 100644 Engine/lib/sdl/src/timer/haiku/SDL_systimer.c create mode 100644 Engine/lib/sdl/src/timer/psp/SDL_systimer.c create mode 100644 Engine/lib/sdl/src/timer/unix/SDL_systimer.c create mode 100644 Engine/lib/sdl/src/timer/windows/SDL_systimer.c create mode 100644 Engine/lib/sdl/src/video/SDL_RLEaccel.c create mode 100644 Engine/lib/sdl/src/video/SDL_RLEaccel_c.h create mode 100644 Engine/lib/sdl/src/video/SDL_blit.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit.h create mode 100644 Engine/lib/sdl/src/video/SDL_blit_0.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit_1.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit_A.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit_N.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit_auto.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit_auto.h create mode 100644 Engine/lib/sdl/src/video/SDL_blit_copy.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit_copy.h create mode 100644 Engine/lib/sdl/src/video/SDL_blit_slow.c create mode 100644 Engine/lib/sdl/src/video/SDL_blit_slow.h create mode 100644 Engine/lib/sdl/src/video/SDL_bmp.c create mode 100644 Engine/lib/sdl/src/video/SDL_clipboard.c create mode 100644 Engine/lib/sdl/src/video/SDL_egl.c create mode 100644 Engine/lib/sdl/src/video/SDL_egl_c.h create mode 100644 Engine/lib/sdl/src/video/SDL_fillrect.c create mode 100644 Engine/lib/sdl/src/video/SDL_pixels.c create mode 100644 Engine/lib/sdl/src/video/SDL_pixels_c.h create mode 100644 Engine/lib/sdl/src/video/SDL_rect.c create mode 100644 Engine/lib/sdl/src/video/SDL_rect_c.h create mode 100644 Engine/lib/sdl/src/video/SDL_shape.c create mode 100644 Engine/lib/sdl/src/video/SDL_shape_internals.h create mode 100644 Engine/lib/sdl/src/video/SDL_stretch.c create mode 100644 Engine/lib/sdl/src/video/SDL_surface.c create mode 100644 Engine/lib/sdl/src/video/SDL_sysvideo.h create mode 100644 Engine/lib/sdl/src/video/SDL_video.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidclipboard.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidclipboard.h create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidevents.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidevents.h create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidgl.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidkeyboard.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidkeyboard.h create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidtouch.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidtouch.h create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidvideo.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidvideo.h create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidwindow.c create mode 100644 Engine/lib/sdl/src/video/android/SDL_androidwindow.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoaclipboard.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoaclipboard.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoaevents.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoaevents.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoakeyboard.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoakeyboard.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamessagebox.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamessagebox.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamodes.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamodes.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamouse.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamouse.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamousetap.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoamousetap.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengl.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengl.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoashape.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoashape.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoavideo.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoavideo.m create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoawindow.h create mode 100644 Engine/lib/sdl/src/video/cocoa/SDL_cocoawindow.m create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_WM.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_WM.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_dyn.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_dyn.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_events.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_events.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_modes.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_modes.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_mouse.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_mouse.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_opengl.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_opengl.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_render.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_render.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_shape.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_shape.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_video.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_video.h create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_window.c create mode 100644 Engine/lib/sdl/src/video/directfb/SDL_DirectFB_window.h create mode 100644 Engine/lib/sdl/src/video/dummy/SDL_nullevents.c create mode 100644 Engine/lib/sdl/src/video/dummy/SDL_nullevents_c.h create mode 100644 Engine/lib/sdl/src/video/dummy/SDL_nullframebuffer.c create mode 100644 Engine/lib/sdl/src/video/dummy/SDL_nullframebuffer_c.h create mode 100644 Engine/lib/sdl/src/video/dummy/SDL_nullvideo.c create mode 100644 Engine/lib/sdl/src/video/dummy/SDL_nullvideo.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_BWin.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bclipboard.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bclipboard.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bevents.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bevents.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bframebuffer.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bframebuffer.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bkeyboard.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bkeyboard.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bmodes.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bmodes.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bopengl.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bopengl.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bvideo.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bvideo.h create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bwindow.cc create mode 100644 Engine/lib/sdl/src/video/haiku/SDL_bwindow.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirdyn.c create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirdyn.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirevents.c create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirevents.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirframebuffer.c create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirframebuffer.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirmouse.c create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirmouse.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_miropengl.c create mode 100644 Engine/lib/sdl/src/video/mir/SDL_miropengl.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirsym.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirvideo.c create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirvideo.h create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirwindow.c create mode 100644 Engine/lib/sdl/src/video/mir/SDL_mirwindow.h create mode 100644 Engine/lib/sdl/src/video/pandora/SDL_pandora.c create mode 100644 Engine/lib/sdl/src/video/pandora/SDL_pandora.h create mode 100644 Engine/lib/sdl/src/video/pandora/SDL_pandora_events.c create mode 100644 Engine/lib/sdl/src/video/pandora/SDL_pandora_events.h create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspevents.c create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspevents_c.h create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspgl.c create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspgl_c.h create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspmouse.c create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspmouse_c.h create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspvideo.c create mode 100644 Engine/lib/sdl/src/video/psp/SDL_pspvideo.h create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpievents.c create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpievents_c.h create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpimouse.c create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpimouse.h create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpiopengles.c create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpiopengles.h create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpivideo.c create mode 100644 Engine/lib/sdl/src/video/raspberry/SDL_rpivideo.h create mode 100644 Engine/lib/sdl/src/video/sdlgenblit.pl create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitappdelegate.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitappdelegate.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitevents.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitevents.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitmessagebox.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitmessagebox.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitmodes.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitmodes.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitopengles.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitopengles.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitopenglview.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitopenglview.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitvideo.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitvideo.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitview.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitview.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitviewcontroller.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitviewcontroller.m create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitwindow.h create mode 100644 Engine/lib/sdl/src/video/uikit/SDL_uikitwindow.m create mode 100644 Engine/lib/sdl/src/video/uikit/keyinfotable.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylanddyn.c create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylanddyn.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandevents.c create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandevents_c.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandmouse.c create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandmouse.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandopengles.c create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandopengles.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandsym.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandtouch.c create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandtouch.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandvideo.c create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandvideo.h create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandwindow.c create mode 100644 Engine/lib/sdl/src/video/wayland/SDL_waylandwindow.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_msctf.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_vkeys.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsclipboard.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsclipboard.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsevents.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsevents.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsframebuffer.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsframebuffer.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowskeyboard.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowskeyboard.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsmessagebox.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsmessagebox.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsmodes.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsmodes.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsmouse.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsmouse.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsopengl.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsopengl.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsopengles.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsopengles.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsshape.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsshape.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsvideo.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowsvideo.h create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowswindow.c create mode 100644 Engine/lib/sdl/src/video/windows/SDL_windowswindow.h create mode 100644 Engine/lib/sdl/src/video/windows/wmmsg.h create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtevents.cpp create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtevents_c.h create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtkeyboard.cpp create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtmouse.cpp create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtmouse_c.h create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtopengles.cpp create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtopengles.h create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtpointerinput.cpp create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtvideo.cpp create mode 100644 Engine/lib/sdl/src/video/winrt/SDL_winrtvideo_cpp.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11clipboard.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11clipboard.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11dyn.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11dyn.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11events.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11events.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11framebuffer.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11framebuffer.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11keyboard.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11keyboard.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11messagebox.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11messagebox.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11modes.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11modes.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11mouse.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11mouse.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11opengl.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11opengl.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11opengles.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11opengles.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11shape.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11shape.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11sym.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11touch.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11touch.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11video.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11video.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11window.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11window.h create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11xinput2.c create mode 100644 Engine/lib/sdl/src/video/x11/SDL_x11xinput2.h create mode 100644 Engine/lib/sdl/src/video/x11/edid-parse.c create mode 100644 Engine/lib/sdl/src/video/x11/edid.h create mode 100644 Engine/lib/sdl/src/video/x11/imKStoUCS.c create mode 100644 Engine/lib/sdl/src/video/x11/imKStoUCS.h create mode 100644 Engine/lib/sdl/test/README diff --git a/Engine/lib/sdl/Android.mk b/Engine/lib/sdl/Android.mk new file mode 100644 index 000000000..4f9408204 --- /dev/null +++ b/Engine/lib/sdl/Android.mk @@ -0,0 +1,69 @@ +LOCAL_PATH := $(call my-dir) + +########################### +# +# SDL shared library +# +########################### + +include $(CLEAR_VARS) + +LOCAL_MODULE := SDL2 + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/include + +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES) + +LOCAL_SRC_FILES := \ + $(subst $(LOCAL_PATH)/,, \ + $(wildcard $(LOCAL_PATH)/src/*.c) \ + $(wildcard $(LOCAL_PATH)/src/audio/*.c) \ + $(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \ + $(LOCAL_PATH)/src/atomic/SDL_atomic.c \ + $(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \ + $(wildcard $(LOCAL_PATH)/src/core/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \ + $(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \ + $(wildcard $(LOCAL_PATH)/src/events/*.c) \ + $(wildcard $(LOCAL_PATH)/src/file/*.c) \ + $(wildcard $(LOCAL_PATH)/src/haptic/*.c) \ + $(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c) \ + $(wildcard $(LOCAL_PATH)/src/joystick/*.c) \ + $(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \ + $(wildcard $(LOCAL_PATH)/src/power/*.c) \ + $(wildcard $(LOCAL_PATH)/src/power/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/filesystem/dummy/*.c) \ + $(wildcard $(LOCAL_PATH)/src/render/*.c) \ + $(wildcard $(LOCAL_PATH)/src/render/*/*.c) \ + $(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \ + $(wildcard $(LOCAL_PATH)/src/thread/*.c) \ + $(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \ + $(wildcard $(LOCAL_PATH)/src/timer/*.c) \ + $(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \ + $(wildcard $(LOCAL_PATH)/src/video/*.c) \ + $(wildcard $(LOCAL_PATH)/src/video/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/test/*.c)) + +LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES +LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroid + +include $(BUILD_SHARED_LIBRARY) + +########################### +# +# SDL static library +# +########################### + +LOCAL_MODULE := SDL2_static + +LOCAL_MODULE_FILENAME := libSDL2 + +LOCAL_SRC_FILES += $(LOCAL_PATH)/src/main/android/SDL_android_main.c + +LOCAL_LDLIBS := +LOCAL_EXPORT_LDLIBS := -Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit -ldl -lGLESv1_CM -lGLESv2 -llog -landroid + +include $(BUILD_STATIC_LIBRARY) diff --git a/Engine/lib/sdl/BUGS.txt b/Engine/lib/sdl/BUGS.txt new file mode 100644 index 000000000..c5ed3af23 --- /dev/null +++ b/Engine/lib/sdl/BUGS.txt @@ -0,0 +1,16 @@ + +Bugs are now managed in the SDL bug tracker, here: + + http://bugzilla.libsdl.org/ + +You may report bugs there, and search to see if a given issue has already + been reported, discussed, and maybe even fixed. + + +You may also find help on the SDL mailing list. Subscription information: + + http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org + +Bug reports are welcome here, but we really appreciate if you use Bugzilla, as + bugs discussed on the mailing list may be forgotten or missed. + diff --git a/Engine/lib/sdl/CMakeLists.txt b/Engine/lib/sdl/CMakeLists.txt new file mode 100644 index 000000000..75a89378b --- /dev/null +++ b/Engine/lib/sdl/CMakeLists.txt @@ -0,0 +1,1309 @@ +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) + message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL source code and call cmake from there") +endif() + +cmake_minimum_required(VERSION 2.6) +project(SDL2 C) +include(CheckFunctionExists) +include(CheckLibraryExists) +include(CheckIncludeFiles) +include(CheckIncludeFile) +include(CheckSymbolExists) +include(CheckCSourceRuns) +include(CheckCCompilerFlag) +include(CheckTypeSize) +include(CheckStructHasMember) +include(CMakeDependentOption) +include(FindPkgConfig) +set(CMAKE_MODULE_PATH "${SDL2_SOURCE_DIR}/cmake") +include(${SDL2_SOURCE_DIR}/cmake/macros.cmake) +include(${SDL2_SOURCE_DIR}/cmake/sdlchecks.cmake) + +# General settings +# Edit include/SDL_version.h and change the version, then: +# SDL_MICRO_VERSION += 1; +# SDL_INTERFACE_AGE += 1; +# SDL_BINARY_AGE += 1; +# if any functions have been added, set SDL_INTERFACE_AGE to 0. +# if backwards compatibility has been broken, +# set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0. +set(SDL_MAJOR_VERSION 2) +set(SDL_MINOR_VERSION 0) +set(SDL_MICRO_VERSION 3) +set(SDL_INTERFACE_AGE 1) +set(SDL_BINARY_AGE 3) +set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}") + +# Calculate a libtool-like version number +math(EXPR LT_CURRENT "${SDL_MICRO_VERSION} - ${SDL_INTERFACE_AGE}") +math(EXPR LT_AGE "${SDL_BINARY_AGE} - ${SDL_INTERFACE_AGE}") +math(EXPR LT_MAJOR "${LT_CURRENT}- ${LT_AGE}") +set(LT_REVISION "${SDL_INTERFACE_AGE}") +set(LT_RELEASE "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}") +set(LT_VERSION "${LT_MAJOR}.${LT_AGE}.${LT_REVISION}") + +message(STATUS "${LT_VERSION} :: ${LT_AGE} :: ${LT_REVISION} :: ${LT_CURRENT} :: ${LT_RELEASE}") + +# General settings & flags +set(LIBRARY_OUTPUT_DIRECTORY "build") +# Check for 64 or 32 bit +set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P}) +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCH_64 TRUE) + set(PROCESSOR_ARCH "x64") +else() + set(ARCH_64 FALSE) + set(PROCESSOR_ARCH "x86") +endif() +set(LIBNAME SDL2) +if(NOT LIBTYPE) + set(LIBTYPE SHARED) +endif() + +# Get the platform +if(WIN32) + if(NOT WINDOWS) + set(WINDOWS TRUE) + endif() +elseif(UNIX AND NOT APPLE) + if(CMAKE_SYSTEM_NAME MATCHES ".*Linux") + set(LINUX TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*") + set(FREEBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") + set(NETBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") + set(OPENBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*") + set(GNU TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") + set(BSDI TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") + set(FREEBSD TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*") + set(SYSV5 TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*") + set(SOLARIS TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*") + set(HPUX TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*") + set(AIX TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*") + set(MINIX TRUE) + endif() +elseif(APPLE) + if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*") + set(DARWIN TRUE) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*") + set(MACOSX TRUE) + endif() + # TODO: iOS? +elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*") + message_error("BeOS support has been removed as of SDL 2.0.2.") +elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*") + set(HAIKU TRUE) +endif() + +# Don't mistake osx for unix +if(UNIX AND NOT APPLE) + set(UNIX_SYS ON) +else() + set(UNIX_SYS OFF) +endif() + +if(UNIX OR APPLE) + set(UNIX_OR_MAC_SYS ON) +else() + set(UNIX_OR_MAC_SYS OFF) +endif() + +# Default option knobs +if(APPLE OR ARCH_64) + set(OPT_DEF_SSEMATH ON) +endif() +if(UNIX OR MINGW OR MSYS) + set(OPT_DEF_LIBC ON) +endif() + +# Compiler info +if(CMAKE_COMPILER_IS_GNUCC) + set(USE_GCC TRUE) + set(OPT_DEF_ASM TRUE) +elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") + set(USE_CLANG TRUE) + set(OPT_DEF_ASM TRUE) +elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+ + set(OPT_DEF_ASM TRUE) + #set(CMAKE_C_FLAGS "/ZI /WX- / +else() + set(OPT_DEF_ASM FALSE) +endif() + +# Default flags, if not set otherwise +if("$ENV{CFLAGS}" STREQUAL "") + if(USE_GCC OR USE_CLANG) + set(CMAKE_C_FLAGS "-g -O3") + endif() +else("$ENV{CFLAGS}" STREQUAL "") + set(CMAKE_C_FLAGS "$ENV{CFLAGS}") + list(APPEND EXTRA_CFLAGS "$ENV{CFLAGS}") +endif() +if(NOT ("$ENV{CFLAGS}" STREQUAL "")) # Hackish, but does the trick on Win32 + list(APPEND EXTRA_LDFLAGS "$ENV{LDFLAGS}") +endif() + +if(MSVC) + option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF) + if(FORCE_STATIC_VCRT) + foreach(flag_var + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) + if(${flag_var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif() + endforeach(flag_var) + endif() +endif() + +# Those are used for pkg-config and friends, so that the SDL2.pc, sdl2-config, +# etc. are created correctly. +set(SDL_LIBS "-lSDL2") +set(SDL_CFLAGS "") + +if(CYGWIN) + # We build SDL on cygwin without the UNIX emulation layer + include_directories("-I/usr/include/mingw") + set(CMAKE_REQUIRED_FLAGS "-mno-cygwin") + check_c_source_compiles("int main(int argc, char **argv) {}" + HAVE_GCC_NO_CYGWIN) + set(CMAKE_REQUIRED_FLAGS) + if(HAVE_GCC_NO_CYGWIN) + list(APPEND EXTRA_LDFLAGS "-mno-cygwin") + list(APPEND SDL_LIBS "-mno-cygwin") + endif() + set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include/mingw") +endif() + +add_definitions(-DUSING_GENERATED_CONFIG_H) +# General includes +include_directories(${SDL2_BINARY_DIR}/include ${SDL2_SOURCE_DIR}/include) + +set(SDL_SUBSYSTEMS + Atomic Audio Video Render Events Joystick Haptic Power Threads Timers + File Loadso CPUinfo Filesystem) +foreach(_SUB ${SDL_SUBSYSTEMS}) + string(TOUPPER ${_SUB} _OPT) + option(SDL_${_OPT} "Enable the ${_SUB} subsystem" ON) +endforeach() + +option_string(ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto") +#set_option(DEPENDENCY_TRACKING "Use gcc -MMD -MT dependency tracking" ON) +set_option(LIBC "Use the system C library" ${OPT_DEF_LIBC}) +set_option(GCC_ATOMICS "Use gcc builtin atomics" ${USE_GCC}) +set_option(ASSEMBLY "Enable assembly routines" ${OPT_DEF_ASM}) +set_option(SSEMATH "Allow GCC to use SSE floating point math" ${OPT_DEF_SSEMATH}) +set_option(MMX "Use MMX assembly routines" ${OPT_DEF_ASM}) +set_option(3DNOW "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM}) +set_option(SSE "Use SSE assembly routines" ${OPT_DEF_ASM}) +set_option(SSE2 "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH}) +set_option(ALTIVEC "Use Altivec assembly routines" ${OPT_DEF_ASM}) +set_option(DISKAUDIO "Support the disk writer audio driver" ON) +set_option(DUMMYAUDIO "Support the dummy audio driver" ON) +set_option(VIDEO_DIRECTFB "Use DirectFB video driver" OFF) +dep_option(DIRECTFB_SHARED "Dynamically load directfb support" ON "VIDEO_DIRECTFB" OFF) +set_option(FUSIONSOUND "Use FusionSound audio driver" OFF) +dep_option(FUSIONSOUND_SHARED "Dynamically load fusionsound audio support" ON "FUSIONSOUND_SHARED" OFF) +set_option(VIDEO_DUMMY "Use dummy video driver" ON) +set_option(VIDEO_OPENGL "Include OpenGL support" ON) +set_option(VIDEO_OPENGLES "Include OpenGL ES support" ON) +set_option(PTHREADS "Use POSIX threads for multi-threading" ${UNIX_OR_MAC_SYS}) +dep_option(PTHREADS_SEM "Use pthread semaphores" ON "PTHREADS" OFF) +set_option(SDL_DLOPEN "Use dlopen for shared object loading" ON) +set_option(OSS "Support the OSS audio API" ${UNIX_SYS}) +set_option(ALSA "Support the ALSA audio API" ${UNIX_SYS}) +dep_option(ALSA_SHARED "Dynamically load ALSA audio support" ON "ALSA" OFF) +set_option(ESD "Support the Enlightened Sound Daemon" ${UNIX_SYS}) +dep_option(ESD_SHARED "Dynamically load ESD audio support" ON "ESD" OFF) +set_option(PULSEAUDIO "Use PulseAudio" ${UNIX_SYS}) +dep_option(PULSEAUDIO_SHARED "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF) +set_option(ARTS "Support the Analog Real Time Synthesizer" ${UNIX_SYS}) +dep_option(ARTS_SHARED "Dynamically load aRts audio support" ON "ARTS" OFF) +set_option(NAS "Support the NAS audio API" ${UNIX_SYS}) +set_option(NAS_SHARED "Dynamically load NAS audio API" ${UNIX_SYS}) +set_option(SNDIO "Support the sndio audio API" ${UNIX_SYS}) +set_option(RPATH "Use an rpath when linking SDL" ${UNIX_SYS}) +set_option(CLOCK_GETTIME "Use clock_gettime() instead of gettimeofday()" OFF) +set_option(INPUT_TSLIB "Use the Touchscreen library for input" ${UNIX_SYS}) +set_option(VIDEO_X11 "Use X11 video driver" ${UNIX_SYS}) +set_option(VIDEO_WAYLAND "Use Wayland video driver" OFF) #${UNIX_SYS}) +set_option(VIDEO_MIR "Use Mir video driver" OFF) #${UNIX_SYS}) +dep_option(X11_SHARED "Dynamically load X11 support" ON "VIDEO_X11" OFF) +set(SDL_X11_OPTIONS Xcursor Xinerama XInput Xrandr Xscrnsaver XShape Xvm) +foreach(_SUB ${SDL_X11_OPTIONS}) + string(TOUPPER "VIDEO_X11_${_SUB}" _OPT) + dep_option(${_OPT} "Enable ${_SUB} support" ON "VIDEO_X11" OFF) +endforeach() +set_option(VIDEO_COCOA "Use Cocoa video driver" ${APPLE}) +set_option(DIRECTX "Use DirectX for Windows audio/video" ${WINDOWS}) +set_option(RENDER_D3D "Enable the Direct3D render driver" ${WINDOWS}) + +# TODO: We should (should we?) respect cmake's ${BUILD_SHARED_LIBS} flag here +# The options below are for compatibility to configure's default behaviour. +set(SDL_SHARED ON CACHE BOOL "Build a shared version of the library") +set(SDL_STATIC ON CACHE BOOL "Build a static version of the library") + +# General source files +file(GLOB SOURCE_FILES + ${SDL2_SOURCE_DIR}/src/*.c + ${SDL2_SOURCE_DIR}/src/atomic/*.c + ${SDL2_SOURCE_DIR}/src/audio/*.c + ${SDL2_SOURCE_DIR}/src/cpuinfo/*.c + ${SDL2_SOURCE_DIR}/src/dynapi/*.c + ${SDL2_SOURCE_DIR}/src/events/*.c + ${SDL2_SOURCE_DIR}/src/file/*.c + ${SDL2_SOURCE_DIR}/src/libm/*.c + ${SDL2_SOURCE_DIR}/src/render/*.c + ${SDL2_SOURCE_DIR}/src/render/*/*.c + ${SDL2_SOURCE_DIR}/src/stdlib/*.c + ${SDL2_SOURCE_DIR}/src/thread/*.c + ${SDL2_SOURCE_DIR}/src/timer/*.c + ${SDL2_SOURCE_DIR}/src/video/*.c) + + +if(ASSERTIONS STREQUAL "auto") + # Do nada - use optimization settings to determine the assertion level +elseif(ASSERTIONS STREQUAL "disabled") + set(SDL_DEFAULT_ASSERT_LEVEL 0) +elseif(ASSERTIONS STREQUAL "release") + set(SDL_DEFAULT_ASSERT_LEVEL 1) +elseif(ASSERTIONS STREQUAL "enabled") + set(SDL_DEFAULT_ASSERT_LEVEL 2) +elseif(ASSERTIONS STREQUAL "paranoid") + set(SDL_DEFAULT_ASSERT_LEVEL 3) +else() + message_error("unknown assertion level") +endif() +set(HAVE_ASSERTIONS ${ASSERTIONS}) + +# Compiler option evaluation +if(USE_GCC OR USE_CLANG) + if(DEPENDENCY_TRACKING) + check_c_source_compiles(" + #if !defined(__GNUC__) || __GNUC__ < 3 + #error Dependency tracking requires GCC 3.0 or newer + #endif + int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING) + endif() + + if(GCC_ATOMICS) + check_c_source_compiles("int main(int argc, char **argv) { + int a; + void *x, *y, *z; + __sync_lock_test_and_set(&a, 4); + __sync_lock_test_and_set(&x, y); + __sync_fetch_and_add(&a, 1); + __sync_bool_compare_and_swap(&a, 5, 10); + __sync_bool_compare_and_swap(&x, y, z); }" HAVE_GCC_ATOMICS) + if(NOT HAVE_GCC_ATOMICS) + check_c_source_compiles("int main(int argc, char **argv) { + int a; + __sync_lock_test_and_set(&a, 1); + __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET) + endif() + endif() + + set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2") + check_c_source_compiles("int x = 0; int main(int argc, char **argv) {}" + HAVE_GCC_PREFERRED_STACK_BOUNDARY) + set(CMAKE_REQUIRED_FLAGS) + + set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror") + check_c_source_compiles(" + #if !defined(__GNUC__) || __GNUC__ < 4 + #error SDL only uses visibility attributes in GCC 4 or newer + #endif + int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY) + if(HAVE_GCC_FVISIBILITY) + list(APPEND EXTRA_CFLAGS "-fvisibility=hidden") + endif() + set(CMAKE_REQUIRED_FLAGS) + + check_c_compiler_flag(-Wall HAVE_GCC_WALL) + if(HAVE_GCC_WALL) + if(HAIKU) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar") + endif() + endif() +endif() + +if(ASSEMBLY) + if(USE_GCC OR USE_CLANG) + set(SDL_ASSEMBLY_ROUTINES 1) + # TODO: Those all seem to be quite GCC specific - needs to be + # reworked for better compiler support + set(HAVE_ASSEMBLY TRUE) + if(MMX) + set(CMAKE_REQUIRED_FLAGS "-mmmx") + check_c_source_compiles(" + #ifdef __MINGW32__ + #include <_mingw.h> + #ifdef __MINGW64_VERSION_MAJOR + #include + #else + #include + #endif + #else + #include + #endif + #ifndef __MMX__ + #error Assembler CPP flag not enabled + #endif + int main(int argc, char **argv) { }" HAVE_MMX) + if(HAVE_MMX) + list(APPEND EXTRA_CFLAGS "-mmmx") + endif() + set(CMAKE_REQUIRED_FLAGS) + endif() + + if(3DNOW) + set(CMAKE_REQUIRED_FLAGS "-m3dnow") + check_c_source_compiles(" + #include + #ifndef __3dNOW__ + #error Assembler CPP flag not enabled + #endif + int main(int argc, char **argv) { + void *p = 0; + _m_prefetch(p); + }" HAVE_3DNOW) + if(HAVE_3DNOW) + list(APPEND EXTRA_CFLAGS "-m3dnow") + endif() + set(CMAKE_REQUIRED_FLAGS) + endif() + + if(SSE) + set(CMAKE_REQUIRED_FLAGS "-msse") + check_c_source_compiles(" + #ifdef __MINGW32__ + #include <_mingw.h> + #ifdef __MINGW64_VERSION_MAJOR + #include + #else + #include + #endif + #else + #include + #endif + #ifndef __SSE__ + #error Assembler CPP flag not enabled + #endif + int main(int argc, char **argv) { }" HAVE_SSE) + if(HAVE_SSE) + list(APPEND EXTRA_CFLAGS "-msse") + endif() + set(CMAKE_REQUIRED_FLAGS) + endif() + + if(SSE2) + set(CMAKE_REQUIRED_FLAGS "-msse2") + check_c_source_compiles(" + #ifdef __MINGW32__ + #include <_mingw.h> + #ifdef __MINGW64_VERSION_MAJOR + #include + #else + #include + #endif + #else + #include + #endif + #ifndef __SSE2__ + #error Assembler CPP flag not enabled + #endif + int main(int argc, char **argv) { }" HAVE_SSE2) + if(HAVE_SSE2) + list(APPEND EXTRA_CFLAGS "-msse2") + endif() + set(CMAKE_REQUIRED_FLAGS) + endif() + + if(SSEMATH) + if(SSE OR SSE2) + if(USE_GCC) + list(APPEND EXTRA_CFLAGS "-mfpmath=387") + endif() + set(HAVE_SSEMATH TRUE) + endif() + endif() + + if(ALTIVEC) + set(CMAKE_REQUIRED_FLAGS "-maltivec") + check_c_source_compiles(" + #include + vector unsigned int vzero() { + return vec_splat_u32(0); + } + int main(int argc, char **argv) { }" HAVE_ALTIVEC_H_HDR) + check_c_source_compiles(" + vector unsigned int vzero() { + return vec_splat_u32(0); + } + int main(int argc, char **argv) { }" HAVE_ALTIVEC) + set(CMAKE_REQUIRED_FLAGS) + if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR) + set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set + list(APPEND EXTRA_CFLAGS "-maltivec") + set(SDL_ALTIVEC_BLITTERS 1) + if(HAVE_ALTIVEC_H_HDR) + set(HAVE_ALTIVEC_H 1) + endif() + endif() + endif() + elseif(MSVC_VERSION GREATER 1500) + # TODO: SDL_cpuinfo.h needs to support the user's configuration wish + # for MSVC - right now it is always activated + if(NOT ARCH_64) + set(HAVE_MMX TRUE) + set(HAVE_3DNOW TRUE) + endif() + set(HAVE_SSE TRUE) + set(HAVE_SSE2 TRUE) + set(SDL_ASSEMBLY_ROUTINES 1) + endif() +# TODO: +#else(ASSEMBLY) +# if(USE_GCC OR USE_CLANG) +# list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-mmx") +# endif() +endif() + +# TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define +# anything. +if(LIBC) + if(WINDOWS AND NOT MINGW) + set(HAVE_LIBC TRUE) + foreach(_HEADER stdio.h string.h ctype.h math.h) + string(TOUPPER "HAVE_${_HEADER}" _UPPER) + string(REPLACE "." "_" _HAVE_H ${_UPPER}) + set(${_HAVE_H} 1) + endforeach() + set(HAVE_SIGNAL_H 1) + foreach(_FN + malloc calloc realloc free qsort abs memset memcpy memmove memcmp + strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa + _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp + _stricmp _strnicmp sscanf atan atan2 acos asin ceil copysign cos + cosf fabs floor log pow scalbn sin sinf sqrt) + string(TOUPPER ${_FN} _UPPER) + set(HAVE_${_UPPER} 1) + endforeach() + if(NOT CYGWIN AND NOT MINGW) + set(HAVE_ALLOCA 1) + endif() + set(HAVE_M_PI 1) + add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI + set(STDC_HEADERS 1) + else(WINDOWS AND NOT MINGW) + set(HAVE_LIBC TRUE) + check_include_file(sys/types.h HAVE_SYS_TYPES_H) + foreach(_HEADER + stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h + strings.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h) + string(TOUPPER "HAVE_${_HEADER}" _UPPER) + string(REPLACE "." "_" _HAVE_H ${_UPPER}) + check_include_file("${_HEADER}" ${_HAVE_H}) + endforeach() + + check_include_files("dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h" STDC_HEADERS) + check_type_size("size_t" SIZEOF_SIZE_T) + check_symbol_exists(M_PI math.h HAVE_M_PI) + # TODO: refine the mprotect check + check_c_source_compiles("#include + #include + int main() { }" HAVE_MPROTECT) + foreach(_FN + strtod malloc calloc realloc free getenv setenv putenv unsetenv + qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat + strdup _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa + _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull + atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp + vsscanf vsnprintf fseeko fseeko64 sigaction setjmp + nanosleep sysconf sysctlbyname + ) + string(TOUPPER ${_FN} _UPPER) + set(_HAVEVAR "HAVE_${_UPPER}") + check_function_exists("${_FN}" ${_HAVEVAR}) + endforeach() + + check_library_exists(m pow "" HAVE_LIBM) + if(HAVE_LIBM) + set(CMAKE_REQUIRED_LIBRARIES m) + foreach(_FN + atan atan2 ceil copysign cos cosf fabs floor log pow scalbn sin + sinf sqrt) + string(TOUPPER ${_FN} _UPPER) + set(_HAVEVAR "HAVE_${_UPPER}") + check_function_exists("${_FN}" ${_HAVEVAR}) + endforeach() + set(CMAKE_REQUIRED_LIBRARIES) + list(APPEND EXTRA_LIBS m) + endif() + + check_library_exists(iconv iconv_open "" HAVE_LIBICONV) + if(HAVE_LIBICONV) + list(APPEND EXTRA_LIBS iconv) + endif() + + check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION) + endif() +else(LIBC) + if(WINDOWS) + set(HAVE_STDARG_H 1) + set(HAVE_STDDEF_H 1) + endif() +endif() + + +# Enable/disable various subsystems of the SDL library +foreach(_SUB ${SDL_SUBSYSTEMS}) + string(TOUPPER ${_SUB} _OPT) + if(NOT SDL_${_OPT}) + set(SDL_${_OPT}_DISABLED 1) + endif() +endforeach() +if(SDL_JOYSTICK) + file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES}) +endif() +if(SDL_HAPTIC) + if(NOT SDL_JOYSTICK) + # Haptic requires some private functions from the joystick subsystem. + message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled") + endif() + file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES}) +endif() +if(SDL_POWER) + file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES}) +endif() +# TODO: in configure.in, the test for LOADSO and SDL_DLOPEN is a bit weird: +# if LOADSO is not wanted, SDL_LOADSO_DISABLED is set +# If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(), +# SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings + +# General SDL subsystem options, valid for all platforms +if(SDL_AUDIO) + # CheckDummyAudio/CheckDiskAudio - valid for all platforms + if(DUMMYAUDIO) + set(SDL_AUDIO_DRIVER_DUMMY 1) + file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES}) + set(HAVE_DUMMYAUDIO TRUE) + endif() + if(DISKAUDIO) + set(SDL_AUDIO_DRIVER_DISK 1) + file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES}) + set(HAVE_DISKAUDIO TRUE) + endif() +endif() + +if(SDL_DLOPEN) + # Relevant for Unix/Darwin only + if(UNIX OR APPLE) + CheckDLOPEN() + endif() +endif() + +if(SDL_VIDEO) + if(VIDEO_DUMMY) + set(SDL_VIDEO_DRIVER_DUMMY 1) + file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES}) + set(HAVE_VIDEO_DUMMY TRUE) + set(HAVE_SDL_VIDEO TRUE) + endif() +endif() + +# Platform-specific options and settings +if(UNIX AND NOT APPLE) + if(SDL_AUDIO) + if(SYSV5 OR SOLARIS OR HPUX) + set(SDL_AUDIO_DRIVER_SUNAUDIO 1) + file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES}) + set(HAVE_SDL_AUDIO TRUE) + elseif(NETBSD OR OPENBSD) + set(SDL_AUDIO_DRIVER_BSD 1) + file(GLOB BSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/bsd/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${BSD_AUDIO_SOURCES}) + set(HAVE_SDL_AUDIO TRUE) + elseif(AIX) + set(SDL_AUDIO_DRIVER_PAUDIO 1) + file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES}) + set(HAVE_SDL_AUDIO TRUE) + endif() + CheckOSS() + CheckALSA() + CheckPulseAudio() + CheckESD() + CheckARTS() + CheckNAS() + CheckSNDIO() + CheckFusionSound() + endif() + + if(SDL_VIDEO) + CheckX11() + CheckMir() + CheckDirectFB() + CheckOpenGLX11() + CheckOpenGLESX11() + CheckWayland() + endif() + + if(LINUX) + check_c_source_compiles(" + #include + #ifndef EVIOCGNAME + #error EVIOCGNAME() ioctl not available + #endif + int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS) + + check_c_source_compiles(" + #include + #include + + int main(int argc, char **argv) + { + struct kbentry kbe; + kbe.kb_table = KG_CTRL; + ioctl(0, KDGKBENT, &kbe); + }" HAVE_INPUT_KD) + + file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES}) + + if(HAVE_INPUT_EVENTS) + set(SDL_INPUT_LINUXEV 1) + endif() + + if(SDL_HAPTIC AND HAVE_INPUT_EVENTS) + set(SDL_HAPTIC_LINUX 1) + file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES}) + set(HAVE_SDL_HAPTIC TRUE) + endif() + + if(HAVE_INPUT_KD) + set(SDL_INPUT_LINUXKD 1) + endif() + + check_include_file("libudev.h" HAVE_LIBUDEV_H) + + # !!! FIXME: this needs pkg-config to find the include path, I think. + check_include_file("dbus/dbus.h" HAVE_DBUS_DBUS_H) + endif() + + if(INPUT_TSLIB) + check_c_source_compiles(" + #include \"tslib.h\" + int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB) + if(HAVE_INPUT_TSLIB) + set(SDL_INPUT_TSLIB 1) + list(APPEND EXTRA_LIBS ts) + endif() + endif() + + if(SDL_JOYSTICK) + CheckUSBHID() # seems to be BSD specific - limit the test to BSD only? + if(LINUX) + set(SDL_JOYSTICK_LINUX 1) + file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES}) + set(HAVE_SDL_JOYSTICK TRUE) + endif() + endif() + + CheckPTHREAD() + + if(CLOCK_GETTIME) + check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME) + if(FOUND_CLOCK_GETTIME) + list(APPEND EXTRA_LIBS rt) + set(HAVE_CLOCK_GETTIME 1) + else(FOUND_CLOCK_GETTIME) + check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME) + if(FOUND_CLOCK_GETTIME) + set(HAVE_CLOCK_GETTIME 1) + endif() + endif() + endif() + + check_include_file(linux/version.h HAVE_LINUX_VERSION_H) + if(HAVE_LINUX_VERSION_H) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H") + endif() + + if(SDL_POWER) + if(LINUX) + set(SDL_POWER_LINUX 1) + file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES}) + set(HAVE_SDL_POWER TRUE) + endif() + endif() + + if(SDL_FILESYSTEM) + set(SDL_FILESYSTEM_UNIX 1) + file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES}) + set(HAVE_SDL_FILESYSTEM TRUE) + endif() + + if(SDL_TIMERS) + set(SDL_TIMER_UNIX 1) + file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES}) + set(HAVE_SDL_TIMERS TRUE) + endif() + + if(RPATH) + set(SDL_RLD_FLAGS "") + if(BSDI OR FREEBSD OR LINUX OR NETBSD) + set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}") + elseif(SOLARIS) + set(SDL_RLD_FLAGS "-R\${libdir}") + endif() + set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) + set(HAVE_RPATH TRUE) + endif() + +elseif(WINDOWS) + find_program(WINDRES windres) + + check_c_source_compiles(" + #include + int main(int argc, char **argv) { }" HAVE_WIN32_CC) + + file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES}) + + # Check for DirectX + if(DIRECTX) + if("$ENV{DXSDK_DIR}" STREQUAL "") + message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set") + endif() + set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"") + check_include_file(d3d9.h HAVE_D3D_H) + check_include_file(d3d11_1.h HAVE_D3D11_H) + check_include_file(ddraw.h HAVE_DDRAW_H) + check_include_file(dsound.h HAVE_DSOUND_H) + check_include_file(dinput.h HAVE_DINPUT_H) + check_include_file(xaudio2.h HAVE_XAUDIO2_H) + if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H) + set(HAVE_DIRECTX TRUE) + # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks + link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}) + include_directories($ENV{DXSDK_DIR}\\Include) + endif() + set(CMAKE_REQUIRED_FLAGS) + endif() + + if(SDL_AUDIO) + set(SDL_AUDIO_DRIVER_WINMM 1) + file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES}) + set(HAVE_SDL_AUDIO TRUE) + + if(HAVE_DSOUND_H) + set(SDL_AUDIO_DRIVER_DSOUND 1) + file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES}) + endif() + + if(HAVE_XAUDIO2_H) + set(SDL_AUDIO_DRIVER_XAUDIO2 1) + file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES}) + endif() + endif() + + if(SDL_VIDEO) + # requires SDL_LOADSO on Windows (IME, DX, etc.) + if(NOT SDL_LOADSO) + message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled") + endif() + set(SDL_VIDEO_DRIVER_WINDOWS 1) + file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES}) + + if(RENDER_D3D AND HAVE_D3D_H) + set(SDL_VIDEO_RENDER_D3D 1) + set(HAVE_RENDER_D3D TRUE) + endif() + if(RENDER_D3D AND HAVE_D3D11_H) + set(SDL_VIDEO_RENDER_D3D11 1) + set(HAVE_RENDER_D3D TRUE) + endif() + set(HAVE_SDL_VIDEO TRUE) + endif() + + if(SDL_THREADS) + set(SDL_THREAD_WINDOWS 1) + set(SOURCE_FILES ${SOURCE_FILES} + ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c + ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c + ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c + ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c + ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c) + set(HAVE_SDL_THREADS TRUE) + endif() + + if(SDL_POWER) + set(SDL_POWER_WINDOWS 1) + set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c) + set(HAVE_SDL_POWER TRUE) + endif() + + if(SDL_FILESYSTEM) + set(SDL_FILESYSTEM_WINDOWS 1) + file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES}) + set(HAVE_SDL_FILESYSTEM TRUE) + endif() + + # Libraries for Win32 native and MinGW + list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid) + + # TODO: in configure.in the check for timers is set on + # cygwin | mingw32* - does this include mingw32CE? + if(SDL_TIMERS) + set(SDL_TIMER_WINDOWS 1) + file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES}) + set(HAVE_SDL_TIMERS TRUE) + endif() + + if(SDL_LOADSO) + set(SDL_LOADSO_WINDOWS 1) + file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES}) + set(HAVE_SDL_LOADSO TRUE) + endif() + + file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES}) + + if(SDL_VIDEO) + if(VIDEO_OPENGL) + set(SDL_VIDEO_OPENGL 1) + set(SDL_VIDEO_OPENGL_WGL 1) + set(SDL_VIDEO_RENDER_OGL 1) + set(HAVE_VIDEO_OPENGL TRUE) + endif() + endif() + + if(SDL_JOYSTICK) + if(HAVE_DINPUT_H) + set(SDL_JOYSTICK_DINPUT 1) + set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/joystick/windows/SDL_dxjoystick.c) + list(APPEND EXTRA_LIBS dinput8 dxguid dxerr) + else() + set(SDL_JOYSTICK_WINMM 1) + set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/joystick/windows/SDL_mmjoystick.c) + endif() + set(HAVE_SDL_JOYSTICK TRUE) + endif() + + if(SDL_HAPTIC AND HAVE_DINPUT_H) + set(SDL_HAPTIC_DINPUT 1) + set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/haptic/windows/SDL_syshaptic.c) + set(HAVE_SDL_HAPTIC TRUE) + endif() + + file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc) + file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c) + if(MINGW OR CYGWIN) + list(APPEND EXTRA_LIBS mingw32) + list(APPEND EXTRA_LDFLAGS "-mwindows") + set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main") + list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows") + endif() +elseif(APPLE) + # TODO: rework this for proper MacOS X, iOS and Darwin support + + # Requires the darwin file implementation + if(SDL_FILE) + file(GLOB EXTRA_SOURCES ${PROJECT_SOURCE_DIR}/src/file/cocoa/*.m) + set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES}) + set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C) + set(HAVE_SDL_FILE TRUE) + set(SDL_FRAMEWORK_COCOA 1) + else() + message_error("SDL_FILE must be enabled to build on MacOS X") + endif() + + if(SDL_AUDIO) + set(MACOSX_COREAUDIO 1) + file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES}) + set(HAVE_SDL_AUDIO TRUE) + set(SDL_FRAMEWORK_COREAUDIO 1) + set(SDL_FRAMEWORK_AUDIOUNIT 1) + endif() + + if(SDL_JOYSTICK) + set(SDL_JOYSTICK_IOKIT 1) + file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES}) + set(HAVE_SDL_JOYSTICK TRUE) + set(SDL_FRAMEWORK_IOKIT 1) + set(SDL_FRAMEWORK_FF 1) + endif() + + if(SDL_HAPTIC) + set(SDL_HAPTIC_IOKIT 1) + file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES}) + set(HAVE_SDL_HAPTIC TRUE) + set(SDL_FRAMEWORK_IOKIT 1) + set(SDL_FRAMEWORK_FF 1) + if(NOT SDL_JOYSTICK) + message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled") + endif() + endif() + + if(SDL_POWER) + set(SDL_POWER_MACOSX 1) + file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES}) + set(HAVE_SDL_POWER TRUE) + set(SDL_FRAMEWORK_CARBON 1) + set(SDL_FRAMEWORK_IOKIT 1) + endif() + + if(SDL_TIMERS) + set(SDL_TIMER_UNIX 1) + file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES}) + set(HAVE_SDL_TIMERS TRUE) + endif(SDL_TIMERS) + + if(SDL_FILESYSTEM) + set(SDL_FILESYSTEM_COCOA 1) + file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m) + set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C) + set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES}) + set(HAVE_SDL_FILESYSTEM TRUE) + endif() + + # Actually load the frameworks at the end so we don't duplicate include. + if(SDL_FRAMEWORK_COCOA) + find_library(COCOA_LIBRARY Cocoa) + list(APPEND EXTRA_LIBS ${COCOA_LIBRARY}) + endif() + if(SDL_FRAMEWORK_IOKIT) + find_library(IOKIT IOKit) + list(APPEND EXTRA_LIBS ${IOKIT}) + endif() + if(SDL_FRAMEWORK_FF) + find_library(FORCEFEEDBACK ForceFeedback) + list(APPEND EXTRA_LIBS ${FORCEFEEDBACK}) + endif() + if(SDL_FRAMEWORK_CARBON) + find_library(CARBON_LIBRARY Carbon) + list(APPEND EXTRA_LIBS ${CARBON_LIBRARY}) + endif() + if(SDL_FRAMEWORK_COREAUDIO) + find_library(COREAUDIO CoreAudio) + list(APPEND EXTRA_LIBS ${COREAUDIO}) + endif() + if(SDL_FRAMEWORK_AUDIOUNIT) + find_library(AUDIOUNIT AudioUnit) + list(APPEND EXTRA_LIBS ${AUDIOUNIT}) + endif() + + # iOS hack needed - http://code.google.com/p/ios-cmake/ ? + if(SDL_VIDEO) + CheckCOCOA() + if(VIDEO_OPENGL) + set(SDL_VIDEO_OPENGL 1) + set(SDL_VIDEO_OPENGL_CGL 1) + set(SDL_VIDEO_RENDER_OGL 1) + if(DARWIN) + find_library(OpenGL_LIBRARY OpenGL) + list(APPEND EXTRA_LIBRARIES ${OpenGL_LIBRARY}) + endif() + set(HAVE_VIDEO_OPENGL TRUE) + endif() + endif() + + CheckPTHREAD() +elseif(HAIKU) + if(SDL_VIDEO) + set(SDL_VIDEO_DRIVER_HAIKU 1) + file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES}) + set(HAVE_SDL_VIDEO TRUE) + + set(SDL_FILESYSTEM_HAIKU 1) + file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc) + set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES}) + set(HAVE_SDL_FILESYSTEM TRUE) + + if(SDL_TIMERS) + set(SDL_TIMER_HAIKU 1) + file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES}) + set(HAVE_SDL_TIMERS TRUE) + endif(SDL_TIMERS) + + if(VIDEO_OPENGL) + # TODO: Use FIND_PACKAGE(OpenGL) instead + set(SDL_VIDEO_OPENGL 1) + set(SDL_VIDEO_OPENGL_BGL 1) + set(SDL_VIDEO_RENDER_OGL 1) + list(APPEND EXTRA_LIBS GL) + set(HAVE_VIDEO_OPENGL TRUE) + endif() + endif() + + CheckPTHREAD() +endif() + +# Dummies +# configure.in does it differently: +# if not have X +# if enable_X { SDL_X_DISABLED = 1 } +# [add dummy sources] +# so it always adds a dummy, without checking, if it was actually requested. +# This leads to missing internal references on building, since the +# src/X/*.c does not get included. +if(NOT HAVE_SDL_JOYSTICK) + set(SDL_JOYSTICK_DISABLED 1) + if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX + + file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES}) + endif() +endif() +if(NOT HAVE_SDL_HAPTIC) + set(SDL_HAPTIC_DISABLED 1) + file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES}) +endif() +if(NOT HAVE_SDL_LOADSO) + set(SDL_LOADSO_DISABLED 1) + file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES}) +endif() +if(NOT HAVE_SDL_FILESYSTEM) + set(SDL_FILESYSTEM_DISABLED 1) + file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES}) +endif() + +# We always need to have threads and timers around +if(NOT HAVE_SDL_THREADS) + set(SDL_THREADS_DISABLED 1) + file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES}) +endif() +if(NOT HAVE_SDL_TIMERS) + set(SDL_TIMERS_DISABLED 1) + file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES}) +endif() + +if(NOT SDLMAIN_SOURCES) + file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c) +endif() + +# Append the -MMD -MT flags +# if(DEPENDENCY_TRACKING) +# if(COMPILER_IS_GNUCC) +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@") +# endif() +# endif() + +configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake" + "${SDL2_BINARY_DIR}/include/SDL_config.h") + +# Prepare the flags and remove duplicates +if(EXTRA_LDFLAGS) + list(REMOVE_DUPLICATES EXTRA_LDFLAGS) +endif() +if(EXTRA_LIBS) + list(REMOVE_DUPLICATES EXTRA_LIBS) +endif() +if(EXTRA_CFLAGS) + list(REMOVE_DUPLICATES EXTRA_CFLAGS) +endif() +listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS) +set(EXTRA_CFLAGS ${_EXTRA_CFLAGS}) + +# Compat helpers for the configuration files +if(NOT WINDOWS OR CYGWIN) + # TODO: we need a Windows script, too + execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh) + + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix "\${prefix}") + set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}") + set(bindir "\${exec_prefix}/bin") + set(includedir "\${prefix}/include") + if(SDL_STATIC) + set(ENABLE_STATIC_TRUE "") + set(ENABLE_STATIC_FALSE "#") + else(SDL_STATIC) + set(ENABLE_STATIC_TRUE "#") + set(ENABLE_STATIC_FALSE "") + endif() + if(SDL_SHARED) + set(ENABLE_SHARED_TRUE "") + set(ENABLE_SHARED_FALSE "#") + else(SDL_SHARED) + set(ENABLE_SHARED_TRUE "#") + set(ENABLE_SHARED_FALSE "") + endif() + + # Clean up the different lists + listtostr(EXTRA_LIBS _EXTRA_LIBS "-l") + set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS}) + list(REMOVE_DUPLICATES SDL_STATIC_LIBS) + listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS) + set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS}) + listtostr(SDL_LIBS _SDL_LIBS) + set(SDL_LIBS ${_SDL_LIBS}) + + # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}") + # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}") + + configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in" + "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY) + configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in" + "${SDL2_BINARY_DIR}/sdl2-config") + configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in" + "${SDL2_BINARY_DIR}/sdl2-config" @ONLY) + configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in" + "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY) +endif() + +##### Info output ##### +message(STATUS "") +message(STATUS "SDL2 was configured with the following options:") +message(STATUS "") +message(STATUS "Platform: ${CMAKE_SYSTEM}") +message(STATUS "64-bit: ${ARCH_64}") +message(STATUS "Compiler: ${CMAKE_C_COMPILER}") +message(STATUS "") +message(STATUS "Subsystems:") +foreach(_SUB ${SDL_SUBSYSTEMS}) + string(TOUPPER ${_SUB} _OPT) + message_bool_option(${_SUB} SDL_${_OPT}) +endforeach() +message(STATUS "") +message(STATUS "Options:") +list(SORT ALLOPTIONS) +foreach(_OPT ${ALLOPTIONS}) + # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters + # Get the padding + string(LENGTH ${_OPT} _OPTLEN) + math(EXPR _PADLEN "23 - ${_OPTLEN}") + string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING) + message_tested_option(${_OPT} ${_PADDING}) +endforeach() +message(STATUS "") +message(STATUS " CFLAGS: ${CMAKE_C_FLAGS}") +message(STATUS " EXTRA_CFLAGS: ${EXTRA_CFLAGS}") +message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}") +message(STATUS " EXTRA_LIBS: ${EXTRA_LIBS}") +message(STATUS "") +message(STATUS " Build Shared Library: ${SDL_SHARED}") +message(STATUS " Build Static Library: ${SDL_STATIC}") +message(STATUS "") +if(UNIX) + message(STATUS "If something was not detected, although the libraries") + message(STATUS "were installed, then make sure you have set the") + message(STATUS "CFLAGS and LDFLAGS environment variables correctly.") + message(STATUS "") +endif() + +# Ensure that the extra cflags are used at compile time +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +# Always build SDLmain +add_library(SDL2main STATIC ${SDLMAIN_SOURCES}) +set(_INSTALL_LIBS "SDL2main") + +if(SDL_SHARED) + add_library(SDL2 SHARED ${SOURCE_FILES}) + if(UNIX) + set_target_properties(SDL2 PROPERTIES + VERSION ${LT_VERSION} + SOVERSION ${LT_REVISION} + OUTPUT_NAME "SDL2-${LT_RELEASE}") + else(UNIX) + set_target_properties(SDL2 PROPERTIES + VERSION ${SDL_VERSION} + SOVERSION ${LT_REVISION} + OUTPUT_NAME "SDL2") + endif() + set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS}) + target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS}) +endif() + +if(SDL_STATIC) + set (BUILD_SHARED_LIBS FALSE) + add_library(SDL2-static STATIC ${SOURCE_FILES}) + set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2") + if(MSVC) + set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB") + set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB") + set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB") + endif() + # TODO: Win32 platforms keep the same suffix .lib for import and static + # libraries - do we need to consider this? + set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS}) + target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS}) +endif() + +##### Installation targets ##### +install(TARGETS ${_INSTALL_LIBS} + LIBRARY DESTINATION "lib${LIB_SUFFIX}" + ARCHIVE DESTINATION "lib${LIB_SUFFIX}") + +file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h) +file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h) +foreach(_FNAME ${BIN_INCLUDE_FILES}) + get_filename_component(_INCNAME ${_FNAME} NAME) + list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME}) +endforeach() +list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES}) +install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2) + +if(NOT WINDOWS OR CYGWIN) + if(SDL_SHARED) + install(CODE " + execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink + \"libSDL2-2.0.so\" \"libSDL2.so\")") + install(FILES ${SDL2_BINARY_DIR}/libSDL2.so DESTINATION "lib${LIB_SUFFIX}") + endif() + if(FREEBSD) + # FreeBSD uses ${PREFIX}/libdata/pkgconfig + install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig") + else(FREEBSD) + install(FILES ${SDL2_BINARY_DIR}/sdl2.pc + DESTINATION "lib${LIB_SUFFIX}/pkgconfig") + endif() + install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin) + # TODO: what about the .spec file? Is it only needed for RPM creation? + install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "share/aclocal") +else() + install(TARGETS SDL2 RUNTIME DESTINATION bin) +endif() + diff --git a/Engine/lib/sdl/COPYING.txt b/Engine/lib/sdl/COPYING.txt new file mode 100644 index 000000000..a17cd0dcf --- /dev/null +++ b/Engine/lib/sdl/COPYING.txt @@ -0,0 +1,20 @@ + +Simple DirectMedia Layer +Copyright (C) 1997-2014 Sam Lantinga + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/Engine/lib/sdl/CREDITS.txt b/Engine/lib/sdl/CREDITS.txt new file mode 100644 index 000000000..7e4086712 --- /dev/null +++ b/Engine/lib/sdl/CREDITS.txt @@ -0,0 +1,53 @@ + +Simple DirectMedia Layer CREDITS +Thanks to everyone who made this possible, including: + +* Cliff Matthews, for giving me a reason to start this project. :) + -- Executor rocks! *grin* + +* Ryan Gordon for helping everybody out and keeping the dream alive. :) + +* Gabriel Jacobo for his work on the Android port and generally helping out all around. + +* Philipp Wiesemann for his attention to detail reviewing the entire SDL code base and proposes patches. + +* Andreas Schiffler for his dedication to unit tests, Visual Studio projects, and managing the Google Summer of Code. + +* Mike Sartain for incorporating SDL into Team Fortress 2 and cheering me on at Valve. + +* Alfred Reynolds for the game controller API and general (in)sanity + +* Jørgen Tjernø for numerous magical Mac OS X fixes. + +* Pierre-Loup Griffais for his deep knowledge of OpenGL drivers. + +* Julian Winter for the SDL 2.0 website. + +* Sheena Smith for many months of great work on the SDL wiki creating the API documentation and style guides. + +* Paul Hunkin for his port of SDL to Android during the Google Summer of Code 2010. + +* Eli Gottlieb for his work on shaped windows during the Google Summer of Code 2010. + +* Jim Grandpre for his work on multi-touch and gesture recognition during + the Google Summer of Code 2010. + +* Edgar "bobbens" Simo for his force feedback API development during the + Google Summer of Code 2008. + +* Aaron Wishnick for his work on audio resampling and pitch shifting during + the Google Summer of Code 2008. + +* Holmes Futrell for his port of SDL to the iPhone and iPod Touch during the + Google Summer of Code 2008. + +* Jon Atkins for SDL_image, SDL_mixer and SDL_net documentation. + +* Everybody at Loki Software, Inc. for their great contributions! + + And a big hand to everyone else who has contributed over the years. + +THANKS! :) + + -- Sam Lantinga + diff --git a/Engine/lib/sdl/INSTALL.txt b/Engine/lib/sdl/INSTALL.txt new file mode 100644 index 000000000..5bd27c51f --- /dev/null +++ b/Engine/lib/sdl/INSTALL.txt @@ -0,0 +1,40 @@ + +To compile and install SDL: + + 1. Windows with Visual Studio: + * Read VisualC.html + + Windows with gcc, either native or cross-compiling: + * Read the FAQ at http://wiki.libsdl.org/moin.fcg/FAQWindows + * Run './configure; make; make install' + + Mac OS X with Xcode: + * Read README-macosx.txt + + Mac OS X from the command line: + * Run './configure; make; make install' + + Linux and other UNIX systems: + * Run './configure; make; make install' + + Android: + * Read README-android.txt + + iOS: + * Read README-ios.txt + + Using Cmake: + * Read README-cmake.txt + + 2. Look at the example programs in ./test, and check out the online + documentation at http://wiki.libsdl.org/ + + 3. Join the SDL developer mailing list by sending E-mail to + sdl-request@libsdl.org + and put "subscribe" in the subject of the message. + + Or alternatively you can use the web interface: + http://www.libsdl.org/mailing-list.php + +That's it! +Sam Lantinga diff --git a/Engine/lib/sdl/Makefile.in b/Engine/lib/sdl/Makefile.in new file mode 100644 index 000000000..da42661c5 --- /dev/null +++ b/Engine/lib/sdl/Makefile.in @@ -0,0 +1,219 @@ +# Makefile to build and install the SDL library + +top_builddir = . +srcdir = @srcdir@ +objects = build +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +auxdir = @ac_aux_dir@ +distpath = $(srcdir)/.. +distdir = SDL2-@SDL_VERSION@ +distfile = $(distdir).tar.gz + +@SET_MAKE@ +SHELL = @SHELL@ +CC = @CC@ +INCLUDE = @INCLUDE@ +CFLAGS = @BUILD_CFLAGS@ +EXTRA_CFLAGS = @EXTRA_CFLAGS@ +LDFLAGS = @BUILD_LDFLAGS@ +EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ +LIBTOOL = @LIBTOOL@ +INSTALL = @INSTALL@ +AR = @AR@ +RANLIB = @RANLIB@ +WINDRES = @WINDRES@ + +TARGET = libSDL2.la +OBJECTS = @OBJECTS@ +VERSION_OBJECTS = @VERSION_OBJECTS@ + +SDLMAIN_TARGET = libSDL2main.a +SDLMAIN_OBJECTS = @SDLMAIN_OBJECTS@ + +SDLTEST_TARGET = libSDL2_test.a +SDLTEST_OBJECTS = @SDLTEST_OBJECTS@ + +SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake configure configure.in debian include Makefile.* sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in src test VisualC.html VisualC Xcode Xcode-iOS +GEN_DIST = SDL2.spec + +HDRS = \ + SDL.h \ + SDL_assert.h \ + SDL_atomic.h \ + SDL_audio.h \ + SDL_bits.h \ + SDL_blendmode.h \ + SDL_clipboard.h \ + SDL_cpuinfo.h \ + SDL_endian.h \ + SDL_error.h \ + SDL_events.h \ + SDL_filesystem.h \ + SDL_gamecontroller.h \ + SDL_gesture.h \ + SDL_haptic.h \ + SDL_hints.h \ + SDL_joystick.h \ + SDL_keyboard.h \ + SDL_keycode.h \ + SDL_loadso.h \ + SDL_log.h \ + SDL_main.h \ + SDL_messagebox.h \ + SDL_mouse.h \ + SDL_mutex.h \ + SDL_name.h \ + SDL_opengl.h \ + SDL_opengles.h \ + SDL_opengles2.h \ + SDL_pixels.h \ + SDL_platform.h \ + SDL_power.h \ + SDL_quit.h \ + SDL_rect.h \ + SDL_render.h \ + SDL_rwops.h \ + SDL_scancode.h \ + SDL_shape.h \ + SDL_stdinc.h \ + SDL_surface.h \ + SDL_system.h \ + SDL_syswm.h \ + SDL_thread.h \ + SDL_timer.h \ + SDL_touch.h \ + SDL_types.h \ + SDL_version.h \ + SDL_video.h \ + begin_code.h \ + close_code.h + +SDLTEST_HDRS = $(shell ls $(srcdir)/include | fgrep SDL_test) + +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_LDFLAGS = -no-undefined -rpath $(DESTDIR)$(libdir) -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) + +all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET) $(objects)/$(SDLTEST_TARGET) + +$(srcdir)/configure: $(srcdir)/configure.in + @echo "Warning, configure.in is out of date" + #(cd $(srcdir) && sh autogen.sh && sh configure) + @sleep 3 + +Makefile: $(srcdir)/Makefile.in + $(SHELL) config.status $@ + +Makefile.in:; + +$(objects): + $(SHELL) $(auxdir)/mkinstalldirs $@ + +update-revision: + $(SHELL) $(auxdir)/updaterev.sh + +.PHONY: all update-revision install install-bin install-hdrs install-lib install-data uninstall uninstall-bin uninstall-hdrs uninstall-lib uninstall-data clean distclean dist $(OBJECTS:.lo=.d) + +$(objects)/$(TARGET): $(OBJECTS) $(VERSION_OBJECTS) + $(LIBTOOL) --mode=link $(CC) -o $@ $(OBJECTS) $(VERSION_OBJECTS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LT_LDFLAGS) + +$(objects)/$(SDLMAIN_TARGET): $(SDLMAIN_OBJECTS) + $(AR) cru $@ $(SDLMAIN_OBJECTS) + $(RANLIB) $@ + +$(objects)/$(SDLTEST_TARGET): $(SDLTEST_OBJECTS) + $(AR) cru $@ $(SDLTEST_OBJECTS) + $(RANLIB) $@ + +install: all install-bin install-hdrs install-lib install-data +install-bin: + $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(bindir) + $(INSTALL) -m 755 sdl2-config $(DESTDIR)$(bindir)/sdl2-config +install-hdrs: update-revision + $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(includedir)/SDL2 + for file in $(HDRS) $(SDLTEST_HDRS); do \ + $(INSTALL) -m 644 $(srcdir)/include/$$file $(DESTDIR)$(includedir)/SDL2/$$file; \ + done + $(INSTALL) -m 644 include/SDL_config.h $(DESTDIR)$(includedir)/SDL2/SDL_config.h + if test -f include/SDL_revision.h; then \ + $(INSTALL) -m 644 include/SDL_revision.h $(DESTDIR)$(includedir)/SDL2/SDL_revision.h; \ + else \ + $(INSTALL) -m 644 $(srcdir)/include/SDL_revision.h $(DESTDIR)$(includedir)/SDL2/SDL_revision.h; \ + fi + +install-lib: $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET) $(objects)/$(SDLTEST_TARGET) + $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(libdir) + $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(TARGET) $(DESTDIR)$(libdir)/$(TARGET) + $(INSTALL) -m 644 $(objects)/$(SDLMAIN_TARGET) $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET) + $(RANLIB) $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET) + $(INSTALL) -m 644 $(objects)/$(SDLTEST_TARGET) $(DESTDIR)$(libdir)/$(SDLTEST_TARGET) + $(RANLIB) $(DESTDIR)$(libdir)/$(SDLTEST_TARGET) +install-data: + $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(datadir)/aclocal + $(INSTALL) -m 644 $(srcdir)/sdl2.m4 $(DESTDIR)$(datadir)/aclocal/sdl2.m4 + $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(libdir)/pkgconfig + $(INSTALL) -m 644 sdl2.pc $(DESTDIR)$(libdir)/pkgconfig + +uninstall: uninstall-bin uninstall-hdrs uninstall-lib uninstall-data +uninstall-bin: + rm -f $(DESTDIR)$(bindir)/sdl2-config +uninstall-hdrs: + for file in $(HDRS) $(SDLTEST_HDRS); do \ + rm -f $(DESTDIR)$(includedir)/SDL2/$$file; \ + done + rm -f $(DESTDIR)$(includedir)/SDL2/SDL_config.h + rm -f $(DESTDIR)$(includedir)/SDL2/SDL_revision.h + -rmdir $(DESTDIR)$(includedir)/SDL2 +uninstall-lib: + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$(TARGET) + rm -f $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET) + rm -f $(DESTDIR)$(libdir)/$(SDLTEST_TARGET) +uninstall-data: + rm -f $(DESTDIR)$(datadir)/aclocal/sdl2.m4 + rm -f $(DESTDIR)$(libdir)/pkgconfig/sdl2.pc + +clean: + rm -rf $(objects) + if test -f test/Makefile; then (cd test; $(MAKE) $@); fi + +distclean: clean + rm -f Makefile Makefile.rules sdl2-config + rm -f config.status config.cache config.log libtool + rm -rf $(srcdir)/autom4te* + find $(srcdir) \( \ + -name '*~' -o \ + -name '*.bak' -o \ + -name '*.old' -o \ + -name '*.rej' -o \ + -name '*.orig' -o \ + -name '.#*' \) \ + -exec rm -f {} \; + if test -f test/Makefile; then (cd test; $(MAKE) $@); fi + +dist $(distfile): + $(SHELL) $(auxdir)/mkinstalldirs $(distdir) + (cd $(srcdir); tar cf - $(SRC_DIST)) | (cd $(distdir); tar xf -) + tar cf - $(GEN_DIST) | (cd $(distdir); tar xf -) + find $(distdir) \( \ + -name '*~' -o \ + -name '*.bak' -o \ + -name '*.old' -o \ + -name '*.rej' -o \ + -name '*.orig' -o \ + -name '.#*' \) \ + -exec rm -f {} \; + if test -f $(distdir)/test/Makefile; then (cd $(distdir)/test && make distclean); fi + (cd $(distdir); build-scripts/updaterev.sh) + tar cvf - $(distdir) | gzip --best >$(distfile) + rm -rf $(distdir) + +rpm: $(distfile) + rpmbuild -ta $? diff --git a/Engine/lib/sdl/Makefile.minimal b/Engine/lib/sdl/Makefile.minimal new file mode 100644 index 000000000..6ec1ce81c --- /dev/null +++ b/Engine/lib/sdl/Makefile.minimal @@ -0,0 +1,42 @@ +# Makefile to build the SDL library + +INCLUDE = -I./include +CFLAGS = -g -O2 $(INCLUDE) +AR = ar +RANLIB = ranlib + +TARGET = libSDL.a +SOURCES = \ + src/*.c \ + src/audio/*.c \ + src/audio/dummy/*.c \ + src/cpuinfo/*.c \ + src/events/*.c \ + src/file/*.c \ + src/haptic/*.c \ + src/haptic/dummy/*.c \ + src/joystick/*.c \ + src/joystick/dummy/*.c \ + src/loadso/dummy/*.c \ + src/power/*.c \ + src/filesystem/dummy/*.c \ + src/render/*.c \ + src/render/software/*.c \ + src/stdlib/*.c \ + src/thread/*.c \ + src/thread/generic/*.c \ + src/timer/*.c \ + src/timer/dummy/*.c \ + src/video/*.c \ + src/video/dummy/*.c \ + +OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g') + +all: $(TARGET) + +$(TARGET): $(OBJECTS) + $(AR) crv $@ $^ + $(RANLIB) $@ + +clean: + rm -f $(TARGET) $(OBJECTS) diff --git a/Engine/lib/sdl/Makefile.pandora b/Engine/lib/sdl/Makefile.pandora new file mode 100644 index 000000000..bb89d52a6 --- /dev/null +++ b/Engine/lib/sdl/Makefile.pandora @@ -0,0 +1,37 @@ +# Makefile to build the pandora SDL library + +AR = arm-none-linux-gnueabi-ar +RANLIB = arm-none-linux-gnueabi-ranlib +CC = arm-none-linux-gnueabi-gcc +CXX = arm-none-linux-gnueabi-g++ +STRIP = arm-none-linux-gnueabi-strip + +CFLAGS = -O3 -march=armv7-a -mcpu=cortex-a8 -mtune=cortex-a8 -mfloat-abi=softfp \ + -mfpu=neon -ftree-vectorize -ffast-math -fomit-frame-pointer -fno-strict-aliasing -fsingle-precision-constant \ + -I./include -I$(PNDSDK)/usr/include -DSDL_REVISION=0 + +TARGET = libSDL.a + +SOURCES = ./src/*.c ./src/audio/*.c ./src/cpuinfo/*.c ./src/events/*.c \ + ./src/file/*.c ./src/stdlib/*.c ./src/thread/*.c ./src/timer/*.c ./src/video/*.c \ + ./src/joystick/*.c ./src/haptic/*.c ./src/power/*.c ./src/video/dummy/*.c ./src/audio/disk/*.c \ + ./src/audio/dummy/*.c ./src/loadso/dlopen/*.c ./src/audio/dsp/*.c \ + ./src/thread/pthread/SDL_systhread.c ./src/thread/pthread/SDL_syssem.c \ + ./src/thread/pthread/SDL_sysmutex.c ./src/thread/pthread/SDL_syscond.c \ + ./src/joystick/linux/*.c ./src/haptic/linux/*.c ./src/timer/unix/*.c \ + ./src/atomic/linux/*.c ./src/filesystem/unix/*.c \ + ./src/video/pandora/SDL_pandora.o ./src/video/pandora/SDL_pandora_events.o ./src/video/x11/*.c + + +OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g') + +CONFIG_H = $(shell cp include/SDL_config_pandora.h include/SDL_config.h && touch include/SDL_revision.h) + +all: $(TARGET) + +$(TARGET): $(CONFIG_H) $(OBJECTS) + $(AR) crv $@ $^ + $(RANLIB) $@ + +clean: + rm -f $(TARGET) $(OBJECTS) diff --git a/Engine/lib/sdl/Makefile.psp b/Engine/lib/sdl/Makefile.psp new file mode 100644 index 000000000..5e7dcd29a --- /dev/null +++ b/Engine/lib/sdl/Makefile.psp @@ -0,0 +1,92 @@ +TARGET_LIB = libSDL2.a +OBJS= src/SDL.o \ + src/SDL_assert.o \ + src/SDL_error.o \ + src/SDL_hints.o \ + src/SDL_log.o \ + src/atomic/SDL_atomic.o \ + src/atomic/SDL_spinlock.o \ + src/audio/SDL_audio.o \ + src/audio/SDL_audiocvt.o \ + src/audio/SDL_audiodev.o \ + src/audio/SDL_audiotypecvt.o \ + src/audio/SDL_mixer.o \ + src/audio/SDL_wave.o \ + src/audio/psp/SDL_pspaudio.o \ + src/cpuinfo/SDL_cpuinfo.o \ + src/events/SDL_clipboardevents.o \ + src/events/SDL_dropevents.o \ + src/events/SDL_events.o \ + src/events/SDL_gesture.o \ + src/events/SDL_keyboard.o \ + src/events/SDL_mouse.o \ + src/events/SDL_quit.o \ + src/events/SDL_touch.o \ + src/events/SDL_windowevents.o \ + src/file/SDL_rwops.o \ + src/haptic/SDL_haptic.o \ + src/haptic/dummy/SDL_syshaptic.o \ + src/joystick/SDL_joystick.o \ + src/joystick/SDL_gamecontroller.o \ + src/joystick/psp/SDL_sysjoystick.o \ + src/power/SDL_power.o \ + src/power/psp/SDL_syspower.o \ + src/filesystem/dummy/SDL_sysfilesystem.o \ + src/render/SDL_render.o \ + src/render/SDL_yuv_sw.o \ + src/render/psp/SDL_render_psp.o \ + src/render/software/SDL_blendfillrect.o \ + src/render/software/SDL_blendline.o \ + src/render/software/SDL_blendpoint.o \ + src/render/software/SDL_drawline.o \ + src/render/software/SDL_drawpoint.o \ + src/render/software/SDL_render_sw.o \ + src/render/software/SDL_rotate.o \ + src/stdlib/SDL_getenv.o \ + src/stdlib/SDL_iconv.o \ + src/stdlib/SDL_malloc.o \ + src/stdlib/SDL_qsort.o \ + src/stdlib/SDL_stdlib.o \ + src/stdlib/SDL_string.o \ + src/thread/SDL_thread.o \ + src/thread/psp/SDL_syssem.o \ + src/thread/psp/SDL_systhread.o \ + src/thread/psp/SDL_sysmutex.o \ + src/thread/psp/SDL_syscond.o \ + src/timer/SDL_timer.o \ + src/timer/psp/SDL_systimer.o \ + src/video/SDL_RLEaccel.o \ + src/video/SDL_blit.o \ + src/video/SDL_blit_0.o \ + src/video/SDL_blit_1.o \ + src/video/SDL_blit_A.o \ + src/video/SDL_blit_N.o \ + src/video/SDL_blit_auto.o \ + src/video/SDL_blit_copy.o \ + src/video/SDL_blit_slow.o \ + src/video/SDL_bmp.o \ + src/video/SDL_clipboard.o \ + src/video/SDL_fillrect.o \ + src/video/SDL_pixels.o \ + src/video/SDL_rect.o \ + src/video/SDL_stretch.o \ + src/video/SDL_surface.o \ + src/video/SDL_video.o \ + src/video/psp/SDL_pspevents.o \ + src/video/psp/SDL_pspvideo.o \ + src/video/psp/SDL_pspgl.o \ + src/video/psp/SDL_pspmouse.o \ + +INCDIR = ./include +CFLAGS = -g -O2 -G0 -Wall -D__PSP__ -DHAVE_OPENGL +CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti +ASFLAGS = $(CFLAGS) + +LIBDIR = +LIBS = -lGL -lGLU -lglut -lz \ + -lpspvfpu -lpsphprm -lpspsdk -lpspctrl -lpspumd -lpsprtc -lpsppower -lpspgum -lpspgu -lpspaudiolib -lpspaudio -lpsphttp -lpspssl -lpspwlan \ + -lpspnet_adhocmatching -lpspnet_adhoc -lpspnet_adhocctl -lm -lpspvram + +PSPSDK=$(shell psp-config --pspsdk-path) +include $(PSPSDK)/lib/build.mak + diff --git a/Engine/lib/sdl/Makefile.wiz b/Engine/lib/sdl/Makefile.wiz new file mode 100644 index 000000000..82619f076 --- /dev/null +++ b/Engine/lib/sdl/Makefile.wiz @@ -0,0 +1,61 @@ +# Makefile to build the pandora SDL library +WIZSDK = /mythtv/media/devel/toolchains/openwiz/arm-openwiz-linux-gnu + +AR = $(WIZSDK)/bin/arm-openwiz-linux-gnu-ar +RANLIB = $(WIZSDK)/bin/arm-openwiz-linux-gnu-ranlib +CC = $(WIZSDK)/bin/arm-openwiz-linux-gnu-gcc +CXX = $(WIZSDK)/bin/arm-openwiz-linux-gnu-g++ +STRIP = $(WIZSDK)/bin/arm-openwiz-linux-gnu-strip + +CFLAGS = -Wall -fPIC -I./include -I$(WIZSDK)/include -DWIZ_GLES_LITE + +TARGET_STATIC = libSDL13.a +TARGET_SHARED = libSDL13.so + +SOURCES = ./src/*.c ./src/audio/*.c ./src/cdrom/*.c ./src/cpuinfo/*.c ./src/events/*.c \ + ./src/file/*.c ./src/stdlib/*.c ./src/thread/*.c ./src/timer/*.c ./src/video/*.c \ + ./src/joystick/*.c ./src/haptic/*.c ./src/video/dummy/*.c ./src/audio/disk/*.c \ + ./src/audio/dummy/*.c ./src/loadso/dlopen/*.c ./src/audio/dsp/*.c \ + ./src/thread/pthread/SDL_systhread.c ./src/thread/pthread/SDL_syssem.c \ + ./src/thread/pthread/SDL_sysmutex.c ./src/thread/pthread/SDL_syscond.c \ + ./src/joystick/linux/*.c ./src/haptic/linux/*.c ./src/timer/unix/*.c ./src/cdrom/dummy/*.c \ + ./src/video/pandora/SDL_pandora.o ./src/video/pandora/SDL_pandora_events.o + + +OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g') + +all: config_copy $(TARGET_STATIC) $(TARGET_SHARED) + +$(TARGET_STATIC): $(OBJECTS) + $(AR) crv $@ $^ + $(RANLIB) $@ + +$(TARGET_SHARED): + $(CC) -shared -Wl,-soname,$(TARGET_SHARED).0 -o $(TARGET_SHARED).0.0.1 $(OBJECTS) + ln -s $(TARGET_SHARED).0.0.1 $(TARGET_SHARED).0 + ln -s $(TARGET_SHARED).0 $(TARGET_SHARED) + +config_copy: + cp include/SDL_config_wiz.h include/SDL_config.h + +clean: + rm -f $(TARGET_STATIC) $(TARGET_SHARED)* $(OBJECTS) + +install: + mkdir -p $(WIZSDK)/lib + mkdir -p $(WIZSDK)/include/SDL13 + cp -f $(TARGET_STATIC) $(WIZSDK)/lib + cp -f $(TARGET_SHARED).0.0.1 $(WIZSDK)/lib + rm -f $(WIZSDK)/lib/$(TARGET_SHARED).0 $(WIZSDK)/lib/$(TARGET_SHARED) + ln -s $(WIZSDK)/lib/$(TARGET_SHARED).0.0.1 $(WIZSDK)/lib/$(TARGET_SHARED).0 + ln -s $(WIZSDK)/lib/$(TARGET_SHARED).0 $(WIZSDK)/lib/$(TARGET_SHARED) + + cp $(TARGET_STATIC) ../../toolchain/libs + cp $(TARGET_SHARED).0.0.1 ../../toolchain/libs + rm -f ../../toolchain/libs/$(TARGET_SHARED).0 ../../toolchain/libs/$(TARGET_SHARED) + ln -s ../../toolchain/libs/$(TARGET_SHARED).0.0.1 ../../toolchain/libs/$(TARGET_SHARED).0 + ln -s ../../toolchain/libs/$(TARGET_SHARED).0 ../../toolchain/libs/$(TARGET_SHARED) + + cp $(TARGET_SHARED).0.0.1 ../nehe_demos/build/$(TARGET_SHARED).0 + cp -f include/*.h $(WIZSDK)/include/SDL13/ + cp -f include/*.h ../../toolchain/include/SDL13/ diff --git a/Engine/lib/sdl/README-SDL.txt b/Engine/lib/sdl/README-SDL.txt new file mode 100644 index 000000000..fade0b958 --- /dev/null +++ b/Engine/lib/sdl/README-SDL.txt @@ -0,0 +1,13 @@ + +Please distribute this file with the SDL runtime environment: + +The Simple DirectMedia Layer (SDL for short) is a cross-platform library +designed to make it easy to write multi-media software, such as games and +emulators. + +The Simple DirectMedia Layer library source code is available from: +http://www.libsdl.org/ + +This library is distributed under the terms of the zlib license: +http://www.zlib.net/zlib_license.html + diff --git a/Engine/lib/sdl/README-android.txt b/Engine/lib/sdl/README-android.txt new file mode 100644 index 000000000..08a2592d4 --- /dev/null +++ b/Engine/lib/sdl/README-android.txt @@ -0,0 +1,438 @@ +================================================================================ +Simple DirectMedia Layer for Android +================================================================================ + +Requirements: + +Android SDK (version 12 or later) +http://developer.android.com/sdk/index.html + +Android NDK r7 or later +http://developer.android.com/tools/sdk/ndk/index.html + +Minimum API level supported by SDL: 10 (Android 2.3.3) +Joystick support is available for API level >=12 devices. + +================================================================================ + How the port works +================================================================================ + +- Android applications are Java-based, optionally with parts written in C +- As SDL apps are C-based, we use a small Java shim that uses JNI to talk to +the SDL library +- This means that your application C code must be placed inside an Android +Java project, along with some C support code that communicates with Java +- This eventually produces a standard Android .apk package + +The Android Java code implements an "Activity" and can be found in: +android-project/src/org/libsdl/app/SDLActivity.java + +The Java code loads your game code, the SDL shared library, and +dispatches to native functions implemented in the SDL library: +src/core/android/SDL_android.c + +Your project must include some glue code that starts your main() routine: +src/main/android/SDL_android_main.c + + +================================================================================ + Building an app +================================================================================ + +For simple projects you can use the script located at build-scripts/androidbuild.sh + +There's two ways of using it: + +androidbuild.sh com.yourcompany.yourapp < sources.list +androidbuild.sh com.yourcompany.yourapp source1.c source2.c ...sourceN.c + +sources.list should be a text file with a source file name in each line +Filenames should be specified relative to the current directory, for example if +you are in the build-scripts directory and want to create the testgles.c test, you'll +run: + +./androidbuild.sh org.libsdl.testgles ../test/testgles.c + +One limitation of this script is that all sources provided will be aggregated into +a single directory, thus all your source files should have a unique name. + +Once the project is complete the script will tell you where the debug APK is located. +If you want to create a signed release APK, you can use the project created by this +utility to generate it. + +Finally, a word of caution: re running androidbuild.sh wipes any changes you may have +done in the build directory for the app! + + +For more complex projects, follow these instructions: + +1. Copy the android-project directory wherever you want to keep your projects + and rename it to the name of your project. +2. Move or symlink this SDL directory into the /jni directory +3. Edit /jni/src/Android.mk to include your source files +4. Run 'ndk-build' (a script provided by the NDK). This compiles the C source + +If you want to use the Eclipse IDE, skip to the Eclipse section below. + +5. Create /local.properties and use that to point to the Android SDK directory, by writing a line with the following form: +sdk.dir=PATH_TO_ANDROID_SDK +6. Run 'ant debug' in android/project. This compiles the .java and eventually + creates a .apk with the native code embedded +7. 'ant debug install' will push the apk to the device or emulator (if connected) + +Here's an explanation of the files in the Android project, so you can customize them: + +android-project/ + AndroidManifest.xml - package manifest. Among others, it contains the class name + of the main Activity and the package name of the application. + build.properties - empty + build.xml - build description file, used by ant. The actual application name + is specified here. + default.properties - holds the target ABI for the application, android-10 and up + project.properties - holds the target ABI for the application, android-10 and up + local.properties - holds the SDK path, you should change this to the path to your SDK + jni/ - directory holding native code + jni/Android.mk - Android makefile that can call recursively the Android.mk files + in all subdirectories + jni/SDL/ - (symlink to) directory holding the SDL library files + jni/SDL/Android.mk - Android makefile for creating the SDL shared library + jni/src/ - directory holding your C/C++ source + jni/src/Android.mk - Android makefile that you should customize to include your + source code and any library references + res/ - directory holding resources for your application + res/drawable-* - directories holding icons for different phone hardware. Could be + one dir called "drawable". + res/layout/main.xml - Usually contains a file main.xml, which declares the screen layout. + We don't need it because we use the SDL video output. + res/values/strings.xml - strings used in your application, including the application name + shown on the phone. + src/org/libsdl/app/SDLActivity.java - the Java class handling the initialization and binding + to SDL. Be very careful changing this, as the SDL library relies + on this implementation. + + +================================================================================ + Build an app with static linking of libSDL +================================================================================ + +This build uses the Android NDK module system. + +Instructions: +1. Copy the android-project directory wherever you want to keep your projects + and rename it to the name of your project. +2. Rename /jni/src/Android_static.mk to /jni/src/Android.mk + (overwrite the existing one) +3. Edit /jni/src/Android.mk to include your source files +4. create and export an environment variable named NDK_MODULE_PATH that points + to the parent directory of this SDL directory. e.g.: + + export NDK_MODULE_PATH="$PWD"/.. + +5. Edit /src/org/libsdl/app/SDLActivity.java and remove the call to + System.loadLibrary("SDL2") line 42. +6. Run 'ndk-build' (a script provided by the NDK). This compiles the C source + + +================================================================================ + Customizing your application name +================================================================================ + +To customize your application name, edit AndroidManifest.xml and replace +"org.libsdl.app" with an identifier for your product package. + +Then create a Java class extending SDLActivity and place it in a directory +under src matching your package, e.g. + src/com/gamemaker/game/MyGame.java + +Here's an example of a minimal class file: +--- MyGame.java -------------------------- +package com.gamemaker.game; + +import org.libsdl.app.SDLActivity; + +/* + * A sample wrapper class that just calls SDLActivity + */ + +public class MyGame extends SDLActivity { } + +------------------------------------------ + +Then replace "SDLActivity" in AndroidManifest.xml with the name of your +class, .e.g. "MyGame" + +================================================================================ + Customizing your application icon +================================================================================ + +Conceptually changing your icon is just replacing the "ic_launcher.png" files in +the drawable directories under the res directory. There are four directories for +different screen sizes. These can be replaced with one dir called "drawable", +containing an icon file "ic_launcher.png" with dimensions 48x48 or 72x72. + +You may need to change the name of your icon in AndroidManifest.xml to match +this icon filename. + +================================================================================ + Loading assets +================================================================================ + +Any files you put in the "assets" directory of your android-project directory +will get bundled into the application package and you can load them using the +standard functions in SDL_rwops.h. + +There are also a few Android specific functions that allow you to get other +useful paths for saving and loading data: +SDL_AndroidGetInternalStoragePath() +SDL_AndroidGetExternalStorageState() +SDL_AndroidGetExternalStoragePath() + +See SDL_system.h for more details on these functions. + +The asset packaging system will, by default, compress certain file extensions. +SDL includes two asset file access mechanisms, the preferred one is the so +called "File Descriptor" method, which is faster and doesn't involve the Dalvik +GC, but given this method does not work on compressed assets, there is also the +"Input Stream" method, which is automatically used as a fall back by SDL. You +may want to keep this fact in mind when building your APK, specially when large +files are involved. +For more information on which extensions get compressed by default and how to +disable this behaviour, see for example: + +http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ + +================================================================================ + Pause / Resume behaviour +================================================================================ + +If SDL is compiled with SDL_ANDROID_BLOCK_ON_PAUSE defined (the default), +the event loop will block itself when the app is paused (ie, when the user +returns to the main Android dashboard). Blocking is better in terms of battery +use, and it allows your app to spring back to life instantaneously after resume +(versus polling for a resume message). + +Upon resume, SDL will attempt to restore the GL context automatically. +In modern devices (Android 3.0 and up) this will most likely succeed and your +app can continue to operate as it was. + +However, there's a chance (on older hardware, or on systems under heavy load), +where the GL context can not be restored. In that case you have to listen for +a specific message, (which is not yet implemented!) and restore your textures +manually or quit the app (which is actually the kind of behaviour you'll see +under iOS, if the OS can not restore your GL context it will just kill your app) + +================================================================================ + Threads and the Java VM +================================================================================ + +For a quick tour on how Linux native threads interoperate with the Java VM, take +a look here: http://developer.android.com/guide/practices/jni.html +If you want to use threads in your SDL app, it's strongly recommended that you +do so by creating them using SDL functions. This way, the required attach/detach +handling is managed by SDL automagically. If you have threads created by other +means and they make calls to SDL functions, make sure that you call +Android_JNI_SetupThread before doing anything else otherwise SDL will attach +your thread automatically anyway (when you make an SDL call), but it'll never +detach it. + +================================================================================ + Using STL +================================================================================ + +You can use STL in your project by creating an Application.mk file in the jni +folder and adding the following line: +APP_STL := stlport_static + +For more information check out CPLUSPLUS-SUPPORT.html in the NDK documentation. + +================================================================================ + Additional documentation +================================================================================ + +The documentation in the NDK docs directory is very helpful in understanding the +build process and how to work with native code on the Android platform. + +The best place to start is with docs/OVERVIEW.TXT + + +================================================================================ + Using Eclipse +================================================================================ + +First make sure that you've installed Eclipse and the Android extensions as described here: + http://developer.android.com/tools/sdk/eclipse-adt.html + +Once you've copied the SDL android project and customized it, you can create an Eclipse project from it: + * File -> New -> Other + * Select the Android -> Android Project wizard and click Next + * Enter the name you'd like your project to have + * Select "Create project from existing source" and browse for your project directory + * Make sure the Build Target is set to Android 2.0 + * Click Finish + + +================================================================================ + Using the emulator +================================================================================ + +There are some good tips and tricks for getting the most out of the +emulator here: http://developer.android.com/tools/devices/emulator.html + +Especially useful is the info on setting up OpenGL ES 2.0 emulation. + +Notice that this software emulator is incredibly slow and needs a lot of disk space. +Using a real device works better. + +================================================================================ + Troubleshooting +================================================================================ + +You can create and run an emulator from the Eclipse IDE: + * Window -> Android SDK and AVD Manager + +You can see if adb can see any devices with the following command: + adb devices + +You can see the output of log messages on the default device with: + adb logcat + +You can push files to the device with: + adb push local_file remote_path_and_file + +You can push files to the SD Card at /sdcard, for example: + adb push moose.dat /sdcard/moose.dat + +You can see the files on the SD card with a shell command: + adb shell ls /sdcard/ + +You can start a command shell on the default device with: + adb shell + +You can remove the library files of your project (and not the SDL lib files) with: + ndk-build clean + +You can do a build with the following command: + ndk-build + +You can see the complete command line that ndk-build is using by passing V=1 on the command line: + ndk-build V=1 + +If your application crashes in native code, you can use addr2line to convert the +addresses in the stack trace to lines in your code. + +For example, if your crash looks like this: +I/DEBUG ( 31): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 400085d0 +I/DEBUG ( 31): r0 00000000 r1 00001000 r2 00000003 r3 400085d4 +I/DEBUG ( 31): r4 400085d0 r5 40008000 r6 afd41504 r7 436c6a7c +I/DEBUG ( 31): r8 436c6b30 r9 435c6fb0 10 435c6f9c fp 4168d82c +I/DEBUG ( 31): ip 8346aff0 sp 436c6a60 lr afd1c8ff pc afd1c902 cpsr 60000030 +I/DEBUG ( 31): #00 pc 0001c902 /system/lib/libc.so +I/DEBUG ( 31): #01 pc 0001ccf6 /system/lib/libc.so +I/DEBUG ( 31): #02 pc 000014bc /data/data/org.libsdl.app/lib/libmain.so +I/DEBUG ( 31): #03 pc 00001506 /data/data/org.libsdl.app/lib/libmain.so + +You can see that there's a crash in the C library being called from the main code. +I run addr2line with the debug version of my code: + arm-eabi-addr2line -C -f -e obj/local/armeabi/libmain.so +and then paste in the number after "pc" in the call stack, from the line that I care about: +000014bc + +I get output from addr2line showing that it's in the quit function, in testspriteminimal.c, on line 23. + +You can add logging to your code to help show what's happening: + +#include + + __android_log_print(ANDROID_LOG_INFO, "foo", "Something happened! x = %d", x); + +If you need to build without optimization turned on, you can create a file called +"Application.mk" in the jni directory, with the following line in it: +APP_OPTIM := debug + + +================================================================================ + Memory debugging +================================================================================ + +The best (and slowest) way to debug memory issues on Android is valgrind. +Valgrind has support for Android out of the box, just grab code using: + svn co svn://svn.valgrind.org/valgrind/trunk valgrind +... and follow the instructions in the file README.android to build it. + +One thing I needed to do on Mac OS X was change the path to the toolchain, +and add ranlib to the environment variables: +export RANLIB=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-ranlib + +Once valgrind is built, you can create a wrapper script to launch your +application with it, changing org.libsdl.app to your package identifier: +--- start_valgrind_app ------------------- +#!/system/bin/sh +export TMPDIR=/data/data/org.libsdl.app +exec /data/local/Inst/bin/valgrind --log-file=/sdcard/valgrind.log --error-limit=no $* +------------------------------------------ + +Then push it to the device: + adb push start_valgrind_app /data/local + +and make it executable: + adb shell chmod 755 /data/local/start_valgrind_app + +and tell Android to use the script to launch your application: + adb shell setprop wrap.org.libsdl.app "logwrapper /data/local/start_valgrind_app" + +If the setprop command says "could not set property", it's likely that +your package name is too long and you should make it shorter by changing +AndroidManifest.xml and the path to your class file in android-project/src + +You can then launch your application normally and waaaaaaaiiittt for it. +You can monitor the startup process with the logcat command above, and +when it's done (or even while it's running) you can grab the valgrind +output file: + adb pull /sdcard/valgrind.log + +When you're done instrumenting with valgrind, you can disable the wrapper: + adb shell setprop wrap.org.libsdl.app "" + +================================================================================ + Why is API level 10 the minimum required? +================================================================================ + +API level 10 is the minimum required level at runtime (that is, on the device) +because SDL requires some functionality for running not +available on older devices. Since the incorporation of joystick support into SDL, +the minimum SDK required to *build* SDL is version 12. Devices running API levels +10-11 are still supported, only with the joystick functionality disabled. + +Support for native OpenGL ES and ES2 applications was introduced in the NDK for +API level 4 and 8. EGL was made a stable API in the NDK for API level 9, which +has since then been obsoleted, with the recommendation to developers to bump the +required API level to 10. +As of this writing, according to http://developer.android.com/about/dashboards/index.html +about 90% of the Android devices accessing Google Play support API level 10 or +higher (March 2013). + +================================================================================ + A note regarding the use of the "dirty rectangles" rendering technique +================================================================================ + +If your app uses a variation of the "dirty rectangles" rendering technique, +where you only update a portion of the screen on each frame, you may notice a +variety of visual glitches on Android, that are not present on other platforms. +This is caused by SDL's use of EGL as the support system to handle OpenGL ES/ES2 +contexts, in particular the use of the eglSwapBuffers function. As stated in the +documentation for the function "The contents of ancillary buffers are always +undefined after calling eglSwapBuffers". +Setting the EGL_SWAP_BEHAVIOR attribute of the surface to EGL_BUFFER_PRESERVED +is not possible for SDL as it requires EGL 1.4, available only on the API level +17+, so the only workaround available on this platform is to redraw the entire +screen each frame. + +Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html + +================================================================================ + Known issues +================================================================================ + +- The number of buttons reported for each joystick is hardcoded to be 36, which +is the current maximum number of buttons Android can report. + diff --git a/Engine/lib/sdl/README-cmake.txt b/Engine/lib/sdl/README-cmake.txt new file mode 100644 index 000000000..7f5ac80dd --- /dev/null +++ b/Engine/lib/sdl/README-cmake.txt @@ -0,0 +1,31 @@ +================================================================================ +CMake build system for SDL (www.cmake.org) +================================================================================ + +SDL's build system was traditionally based on autotools. Over time, this +approach has suffered from several issues across the different supported +platforms. +To solve these problems, a new build system based on CMake is under development. +It works in parallel to the legacy system, so users can experiment with it +without complication. +While still experimental, the build system should be usable on the following +platforms: + + * FreeBSD + * Linux + * VS.NET 2010 + * MinGW and Msys + * OS X with support for XCode + +================================================================================ +Usage +================================================================================ + +Assuming the source for SDL is located at ~/sdl + +cd ~ +mkdir build +cd build +cmake ../sdl + +This will build the static and dynamic versions of SDL in the ~/build directory. diff --git a/Engine/lib/sdl/README-directfb.txt b/Engine/lib/sdl/README-directfb.txt new file mode 100644 index 000000000..9c16a7b67 --- /dev/null +++ b/Engine/lib/sdl/README-directfb.txt @@ -0,0 +1,106 @@ +SDL on DirectFB + +Supports: + +- Hardware YUV overlays +- OpenGL - software only +- 2D/3D accelerations (depends on directfb driver) +- multiple displays +- windows + +What you need: + +DirectFB 1.0.1, 1.2.x, 1.3.0 +Kernel-Framebuffer support: required: vesafb, radeonfb .... +Mesa 7.0.x - optional for OpenGL + +/etc/directfbrc + +This file should contain the following lines to make +your joystick work and avoid crashes: +------------------------ +disable-module=joystick +disable-module=cle266 +disable-module=cyber5k +no-linux-input-grab +------------------------ + +To disable to use x11 backend when DISPLAY variable is found use + +export SDL_DIRECTFB_X11_CHECK=0 + +To disable the use of linux input devices, i.e. multimice/multikeyboard support, +use + +export SDL_DIRECTFB_LINUX_INPUT=0 + +To use hardware accelerated YUV-overlays for YUV-textures, use: + +export SDL_DIRECTFB_YUV_DIRECT=1 + +This is disabled by default. It will only support one +YUV texture, namely the first. Every other YUV texture will be +rendered in software. + +In addition, you may use (directfb-1.2.x) + +export SDL_DIRECTFB_YUV_UNDERLAY=1 + +to make the YUV texture an underlay. This will make the cursor to +be shown. + +Simple Window Manager +===================== + +The driver has support for a very, very basic window manager you may +want to use when running with "wm=default". Use + +export SDL_DIRECTFB_WM=1 + +to enable basic window borders. In order to have the window title rendered, +you need to have the following font installed: + +/usr/share/fonts/truetype/freefont/FreeSans.ttf + +OpenGL Support +============== + +The following instructions will give you *software* OpenGL. However this +works at least on all directfb supported platforms. + +As of this writing 20100802 you need to pull Mesa from git and do the following: + +------------------------ +git clone git://anongit.freedesktop.org/git/mesa/mesa +cd mesa +git checkout 2c9fdaf7292423c157fc79b5ce43f0f199dd753a +------------------------ + +Edit configs/linux-directfb so that the Directories-section looks like +------------------------ +# Directories +SRC_DIRS = mesa glu +GLU_DIRS = sgi +DRIVER_DIRS = directfb +PROGRAM_DIRS = +------------------------ + +make linux-directfb +make + +echo Installing - please enter sudo pw. + +sudo make install INSTALL_DIR=/usr/local/dfb_GL +cd src/mesa/drivers/directfb +make +sudo make install INSTALL_DIR=/usr/local/dfb_GL +------------------------ + +To run the SDL - testprograms: + +export SDL_VIDEODRIVER=directfb +export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib +export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7 + +./testgl + diff --git a/Engine/lib/sdl/README-dynapi.txt b/Engine/lib/sdl/README-dynapi.txt new file mode 100644 index 000000000..da52f3a32 --- /dev/null +++ b/Engine/lib/sdl/README-dynapi.txt @@ -0,0 +1,130 @@ +================================================================================ +Dynamic API +================================================================================ +Originally posted by Ryan at https://plus.google.com/103391075724026391227/posts/TB8UfnDYu4U + +Background: + +- The Steam Runtime has (at least in theory) a really kick-ass build of SDL2, + but developers are shipping their own SDL2 with individual Steam games. + These games might stop getting updates, but a newer SDL2 might be needed later. + Certainly we'll always be fixing bugs in SDL, even if a new video target isn't + ever needed, and these fixes won't make it to a game shipping its own SDL. +- Even if we replace the SDL2 in those games with a compatible one, that is to + say, edit a developer's Steam depot (yuck!), there are developers that are + statically linking SDL2 that we can't do this for. We can't even force the + dynamic loader to ignore their SDL2 in this case, of course. +- If you don't ship an SDL2 with the game in some form, people that disabled the + Steam Runtime, or just tried to run the game from the command line instead of + Steam might find themselves unable to run the game, due to a missing dependency. +- If you want to ship on non-Steam platforms like GOG or Humble Bundle, or target + generic Linux boxes that may or may not have SDL2 installed, you have to ship + the library or risk a total failure to launch. So now, you might have to have + a non-Steam build plus a Steam build (that is, one with and one without SDL2 + included), which is inconvenient if you could have had one universal build + that works everywhere. +- We like the zlib license, but the biggest complaint from the open source + community about the license change is the static linking. The LGPL forced this + as a legal, not technical issue, but zlib doesn't care. Even those that aren't + concerned about the GNU freedoms found themselves solving the same problems: + swapping in a newer SDL to an older game often times can save the day. + Static linking stops this dead. + +So here's what we did: + +SDL now has, internally, a table of function pointers. So, this is what SDL_Init +now looks like: + + UInt32 SDL_Init(Uint32 flags) + { + return jump_table.SDL_Init(flags); + } + +Except that is all done with a bunch of macro magic so we don't have to maintain +every one of these. + +What is jump_table.SDL_init()? Eventually, that's a function pointer of the real +SDL_Init() that you've been calling all this time. But at startup, it looks more +like this: + + Uint32 SDL_Init_DEFAULT(Uint32 flags) + { + SDL_InitDynamicAPI(); + return jump_table.SDL_Init(flags); + } + +SDL_InitDynamicAPI() fills in jump_table with all the actual SDL function +pointers, which means that this _DEFAULT function never gets called again. +First call to any SDL function sets the whole thing up. + +So you might be asking, what was the value in that? Isn't this what the operating +system's dynamic loader was supposed to do for us? Yes, but now we've got this +level of indirection, we can do things like this: + + export SDL_DYNAMIC_API=/my/actual/libSDL-2.0.so.0 + ./MyGameThatIsStaticallyLinkedToSDL2 + +And now, this game that is staticallly linked to SDL, can still be overridden +with a newer, or better, SDL. The statically linked one will only be used as +far as calling into the jump table in this case. But in cases where no override +is desired, the statically linked version will provide its own jump table, +and everyone is happy. + +So now: +- Developers can statically link SDL, and users can still replace it. + (We'd still rather you ship a shared library, though!) +- Developers can ship an SDL with their game, Valve can override it for, say, + new features on SteamOS, or distros can override it for their own needs, + but it'll also just work in the default case. +- Developers can ship the same package to everyone (Humble Bundle, GOG, etc), + and it'll do the right thing. +- End users (and Valve) can update a game's SDL in almost any case, + to keep abandoned games running on newer platforms. +- Everyone develops with SDL exactly as they have been doing all along. + Same headers, same ABI. Just get the latest version to enable this magic. + + +A little more about SDL_InitDynamicAPI(): + +Internally, InitAPI does some locking to make sure everything waits until a +single thread initializes everything (although even SDL_CreateThread() goes +through here before spinning a thread, too), and then decides if it should use +an external SDL library. If not, it sets up the jump table using the current +SDL's function pointers (which might be statically linked into a program, or in +a shared library of its own). If so, it loads that library and looks for and +calls a single function: + + SInt32 SDL_DYNAPI_entry(Uint32 version, void *table, Uint32 tablesize); + +That function takes a version number (more on that in a moment), the address of +the jump table, and the size, in bytes, of the table. +Now, we've got policy here: this table's layout never changes; new stuff gets +added to the end. Therefore SDL_DYNAPI_entry() knows that it can provide all +the needed functions if tablesize <= sizeof its own jump table. If tablesize is +bigger (say, SDL 2.0.4 is trying to load SDL 2.0.3), then we know to abort, but +if it's smaller, we know we can provide the entire API that the caller needs. + +The version variable is a failsafe switch. +Right now it's always 1. This number changes when there are major API changes +(so we know if the tablesize might be smaller, or entries in it have changed). +Right now SDL_DYNAPI_entry gives up if the version doesn't match, but it's not +inconceivable to have a small dispatch library that only supplies this one +function and loads different, otherwise-incompatible SDL libraries and has the +right one initialize the jump table based on the version. For something that +must generically catch lots of different versions of SDL over time, like the +Steam Client, this isn't a bad option. + +Finally, I'm sure some people are reading this and thinking +"I don't want that overhead in my project!" +To which I would point out that the extra function call through the jump table +probably wouldn't even show up in a profile, but lucky you: this can all be +disabled. You can build SDL without this if you absolutely must, but we would +encourage you not to do that. However, on heavily locked down platforms like +iOS, or maybe when debugging, it makes sense to disable it. The way this is +designed in SDL, you just have to change one #define, and the entire system +vaporizes out, and SDL functions exactly like it always did. Most of it is +macro magic, so the system is contained to one C file and a few headers. +However, this is on by default and you have to edit a header file to turn it +off. Our hopes is that if we make it easy to disable, but not too easy, +everyone will ultimately be able to get what they want, but we've gently +nudged everyone towards what we think is the best solution. diff --git a/Engine/lib/sdl/README-gesture.txt b/Engine/lib/sdl/README-gesture.txt new file mode 100644 index 000000000..205fb97d3 --- /dev/null +++ b/Engine/lib/sdl/README-gesture.txt @@ -0,0 +1,72 @@ +=========================================================================== +Dollar Gestures +=========================================================================== +SDL Provides an implementation of the $1 gesture recognition system. This allows for recording, saving, loading, and performing single stroke gestures. + +Gestures can be performed with any number of fingers (the centroid of the fingers must follow the path of the gesture), but the number of fingers must be constant (a finger cannot go down in the middle of a gesture). The path of a gesture is considered the path from the time when the final finger went down, to the first time any finger comes up. + +Dollar gestures are assigned an Id based on a hash function. This is guaranteed to remain constant for a given gesture. There is a (small) chance that two different gestures will be assigned the same ID. In this case, simply re-recording one of the gestures should result in a different ID. + +Recording: +---------- +To begin recording on a touch device call: +SDL_RecordGesture(SDL_TouchID touchId), where touchId is the id of the touch device you wish to record on, or -1 to record on all connected devices. + +Recording terminates as soon as a finger comes up. Recording is acknowledged by an SDL_DOLLARRECORD event. +A SDL_DOLLARRECORD event is a dgesture with the following fields: + +event.dgesture.touchId - the Id of the touch used to record the gesture. +event.dgesture.gestureId - the unique id of the recorded gesture. + + +Performing: +----------- +As long as there is a dollar gesture assigned to a touch, every finger-up event will also cause an SDL_DOLLARGESTURE event with the following fields: + +event.dgesture.touchId - the Id of the touch which performed the gesture. +event.dgesture.gestureId - the unique id of the closest gesture to the performed stroke. +event.dgesture.error - the difference between the gesture template and the actual performed gesture. Lower error is a better match. +event.dgesture.numFingers - the number of fingers used to draw the stroke. + +Most programs will want to define an appropriate error threshold and check to be sure that the error of a gesture is not abnormally high (an indicator that no gesture was performed). + + + +Saving: +------- +To save a template, call SDL_SaveDollarTemplate(gestureId, dst) where gestureId is the id of the gesture you want to save, and dst is an SDL_RWops pointer to the file where the gesture will be stored. + +To save all currently loaded templates, call SDL_SaveAllDollarTemplates(dst) where dst is an SDL_RWops pointer to the file where the gesture will be stored. + +Both functions return the number of gestures successfully saved. + + +Loading: +-------- +To load templates from a file, call SDL_LoadDollarTemplates(touchId,src) where touchId is the id of the touch to load to (or -1 to load to all touch devices), and src is an SDL_RWops pointer to a gesture save file. + +SDL_LoadDollarTemplates returns the number of templates successfully loaded. + + + +=========================================================================== +Multi Gestures +=========================================================================== +SDL provides simple support for pinch/rotate/swipe gestures. +Every time a finger is moved an SDL_MULTIGESTURE event is sent with the following fields: + +event.mgesture.touchId - the Id of the touch on which the gesture was performed. +event.mgesture.x - the normalized x coordinate of the gesture. (0..1) +event.mgesture.y - the normalized y coordinate of the gesture. (0..1) +event.mgesture.dTheta - the amount that the fingers rotated during this motion. +event.mgesture.dDist - the amount that the fingers pinched during this motion. +event.mgesture.numFingers - the number of fingers used in the gesture. + + +=========================================================================== +Notes +=========================================================================== +For a complete example see test/testgesture.c + +Please direct questions/comments to: + jim.tla+sdl_touch@gmail.com diff --git a/Engine/lib/sdl/README-hg.txt b/Engine/lib/sdl/README-hg.txt new file mode 100644 index 000000000..616307c6c --- /dev/null +++ b/Engine/lib/sdl/README-hg.txt @@ -0,0 +1,23 @@ +The latest development version of SDL is available via Mercurial. +Mercurial allows you to get up-to-the-minute fixes and enhancements; +as a developer works on a source tree, you can use "hg" to mirror that +source tree instead of waiting for an official release. Please look +at the Mercurial website ( http://mercurial.selenic.com/ ) for more +information on using hg, where you can also download software for +Mac OS X, Windows, and Unix systems. + + hg clone http://hg.libsdl.org/SDL + +If you are building SDL with an IDE, you will need to copy the file +include/SDL_config.h.default to include/SDL_config.h before building. + +If you are building SDL via configure, you will need to run autogen.sh +before running configure. + +There is a web interface to the subversion repository at: + + http://hg.libsdl.org/SDL/ + +There is an RSS feed available at that URL, for those that want to +track commits in real time. + diff --git a/Engine/lib/sdl/README-ios.txt b/Engine/lib/sdl/README-ios.txt new file mode 100644 index 000000000..60f3391dc --- /dev/null +++ b/Engine/lib/sdl/README-ios.txt @@ -0,0 +1,222 @@ +============================================================================== +Building the Simple DirectMedia Layer for iPhone OS 2.0 +============================================================================== + +Requirements: Mac OS X v10.5 or later and the iPhone SDK. + +Instructions: +1. Open SDL.xcodeproj (located in Xcode-iOS/SDL) in XCode. +2. Select your desired target, and hit build. + +There are three build targets: +- libSDL.a: + Build SDL as a statically linked library +- testsdl + Build a test program (there are known test failures which are fine) +- Template: + Package a project template together with the SDL for iPhone static libraries and copies of the SDL headers. The template includes proper references to the SDL library and headers, skeleton code for a basic SDL program, and placeholder graphics for the application icon and startup screen. + +============================================================================== +Build SDL for iOS from the command line +============================================================================== + +1. cd (PATH WHERE THE SDL CODE IS)/build-scripts +2. ./iosbuild.sh + +If everything goes fine, you should see a build/ios directory, inside there's +two directories "lib" and "include". +"include" contains a copy of the SDL headers that you'll need for your project, +make sure to configure XCode to look for headers there. +"lib" contains find two files, libSDL2.a and libSDL2main.a, you have to add both +to your XCode project. These libraries contain three architectures in them, +armv6 for legacy devices, armv7, and i386 (for the simulator). +By default, iosbuild.sh will autodetect the SDK version you have installed using +xcodebuild -showsdks, and build for iOS >= 3.0, you can override this behaviour +by setting the MIN_OS_VERSION variable, ie: + +MIN_OS_VERSION=4.2 ./iosbuild.sh + +============================================================================== +Using the Simple DirectMedia Layer for iOS +============================================================================== + +FIXME: This needs to be updated for the latest methods + +Here is the easiest method: +1. Build the SDL libraries (libSDL.a and libSDLSimulator.a) and the iPhone SDL Application template. +1. Install the iPhone SDL Application template by copying it to one of XCode's template directories. I recommend creating a directory called "SDL" in "/Developer/Platforms/iOS.platform/Developer/Library/XCode/Project Templates/" and placing it there. +2. Start a new project using the template. The project should be immediately ready for use with SDL. + +Here is a more manual method: +1. Create a new iPhone view based application. +2. Build the SDL static libraries (libSDL.a and libSDLSimulator.a) for iPhone and include them in your project. XCode will ignore the library that is not currently of the correct architecture, hence your app will work both on iPhone and in the iPhone Simulator. +3. Include the SDL header files in your project. +4. Remove the ApplicationDelegate.h and ApplicationDelegate.m files -- SDL for iPhone provides its own UIApplicationDelegate. Remove MainWindow.xib -- SDL for iPhone produces its user interface programmatically. +5. Delete the contents of main.m and program your app as a regular SDL program instead. You may replace main.m with your own main.c, but you must tell XCode not to use the project prefix file, as it includes Objective-C code. + +============================================================================== +Notes -- Application events +============================================================================== + +On iOS the application goes through a fixed life cycle and you will get +notifications of state changes via application events. When these events +are delivered you must handle them in an event callback because the OS may +not give you any processing time after the events are delivered. + +e.g. + +int HandleAppEvents(void *userdata, SDL_Event *event) +{ + switch (event->type) + { + case SDL_APP_TERMINATING: + /* Terminate the app. + Shut everything down before returning from this function. + */ + return 0; + case SDL_APP_LOWMEMORY: + /* You will get this when your app is paused and iOS wants more memory. + Release as much memory as possible. + */ + return 0; + case SDL_APP_WILLENTERBACKGROUND: + /* Prepare your app to go into the background. Stop loops, etc. + This gets called when the user hits the home button, or gets a call. + */ + return 0; + case SDL_APP_DIDENTERBACKGROUND: + /* This will get called if the user accepted whatever sent your app to the background. + If the user got a phone call and canceled it, you'll instead get an SDL_APP_DIDENTERFOREGROUND event and restart your loops. + When you get this, you have 5 seconds to save all your state or the app will be terminated. + Your app is NOT active at this point. + */ + return 0; + case SDL_APP_WILLENTERFOREGROUND: + /* This call happens when your app is coming back to the foreground. + Restore all your state here. + */ + return 0; + case SDL_APP_DIDENTERFOREGROUND: + /* Restart your loops here. + Your app is interactive and getting CPU again. + */ + return 0; + default: + /* No special processing, add it to the event queue */ + return 1; + } +} + +int main(int argc, char *argv[]) +{ + SDL_SetEventFilter(HandleAppEvents, NULL); + + ... run your main loop + + return 0; +} + + +============================================================================== +Notes -- Accelerometer as Joystick +============================================================================== + +SDL for iPhone supports polling the built in accelerometer as a joystick device. For an example on how to do this, see the accelerometer.c in the demos directory. + +The main thing to note when using the accelerometer with SDL is that while the iPhone natively reports accelerometer as floating point values in units of g-force, SDL_JoystickGetAxis reports joystick values as signed integers. Hence, in order to convert between the two, some clamping and scaling is necessary on the part of the iPhone SDL joystick driver. To convert SDL_JoystickGetAxis reported values BACK to units of g-force, simply multiply the values by SDL_IPHONE_MAX_GFORCE / 0x7FFF. + +============================================================================== +Notes -- OpenGL ES +============================================================================== + +Your SDL application for iPhone uses OpenGL ES for video by default. + +OpenGL ES for iPhone supports several display pixel formats, such as RGBA8 and RGB565, which provide a 32 bit and 16 bit color buffer respectively. By default, the implementation uses RGB565, but you may use RGBA8 by setting each color component to 8 bits in SDL_GL_SetAttribute. + +If your application doesn't use OpenGL's depth buffer, you may find significant performance improvement by setting SDL_GL_DEPTH_SIZE to 0. + +Finally, if your application completely redraws the screen each frame, you may find significant performance improvement by setting the attribute SDL_GL_RETAINED_BACKING to 1. + +============================================================================== +Notes -- Keyboard +============================================================================== + +The SDL keyboard API has been extended to support on-screen keyboards: + +void SDL_StartTextInput() + -- enables text events and reveals the onscreen keyboard. +void SDL_StopTextInput() + -- disables text events and hides the onscreen keyboard. +SDL_bool SDL_IsTextInputActive() + -- returns whether or not text events are enabled (and the onscreen keyboard is visible) + +============================================================================== +Notes -- Reading and Writing files +============================================================================== + +Each application installed on iPhone resides in a sandbox which includes its own Application Home directory. Your application may not access files outside this directory. + +Once your application is installed its directory tree looks like: + +MySDLApp Home/ + MySDLApp.app + Documents/ + Library/ + Preferences/ + tmp/ + +When your SDL based iPhone application starts up, it sets the working directory to the main bundle (MySDLApp Home/MySDLApp.app), where your application resources are stored. You cannot write to this directory. Instead, I advise you to write document files to "../Documents/" and preferences to "../Library/Preferences". + +More information on this subject is available here: +http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html + +============================================================================== +Notes -- iPhone SDL limitations +============================================================================== + +Windows: + Full-size, single window applications only. You cannot create multi-window SDL applications for iPhone OS. The application window will fill the display, though you have the option of turning on or off the menu-bar (pass SDL_CreateWindow the flag SDL_WINDOW_BORDERLESS). + +Textures: + The optimal texture formats on iOS are SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, and SDL_PIXELFORMAT_RGB24 pixel formats. + +Loading Shared Objects: + This is disabled by default since it seems to break the terms of the iPhone SDK agreement. It can be re-enabled in SDL_config_iphoneos.h. + +============================================================================== +Game Center +============================================================================== + +Game Center integration requires that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using: + +int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam); + +This will set up the given function to be called back on the animation callback, and then you have to return from main() to let the Cocoa event loop run. + +e.g. + +extern "C" +void ShowFrame(void*) +{ + ... do event handling, frame logic and rendering +} + +int main(int argc, char *argv[]) +{ + ... initialize game ... + +#if __IPHONEOS__ + // Initialize the Game Center for scoring and matchmaking + InitGameCenter(); + + // Set up the game to run in the window animation callback on iOS + // so that Game Center and so forth works correctly. + SDL_iPhoneSetAnimationCallback(window, 1, ShowFrame, NULL); +#else + while ( running ) { + ShowFrame(0); + DelayFrame(); + } +#endif + return 0; +} diff --git a/Engine/lib/sdl/README-linux.txt b/Engine/lib/sdl/README-linux.txt new file mode 100644 index 000000000..e0f029d81 --- /dev/null +++ b/Engine/lib/sdl/README-linux.txt @@ -0,0 +1,80 @@ +================================================================================ +Simple DirectMedia Layer for Linux +================================================================================ + +By default SDL will only link against glibc, the rest of the features will be +enabled dynamically at runtime depending on the available features on the target +system. So, for example if you built SDL with Xinerama support and the target +system does not have the Xinerama libraries installed, it will be disabled +at runtime, and you won't get a missing library error, at least with the +default configuration parameters. + + +================================================================================ +Build Dependencies +================================================================================ + +Ubuntu 13.04, all available features enabled: + +sudo apt-get install build-essential mercurial make cmake autoconf automake \ +libtool libasound2-dev libpulse-dev libaudio-dev libx11-dev libxext-dev \ +libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev \ +libxss-dev libgl1-mesa-dev libesd0-dev libdbus-1-dev libudev-dev \ +libgles1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev + +NOTES: +- This includes all the audio targets except arts, because Ubuntu pulled the + artsc0-dev package, but in theory SDL still supports it. +- DirectFB isn't included because the configure script (currently) fails to find + it at all. You can do "sudo apt-get install libdirectfb-dev" and fix the + configure script to include DirectFB support. Send patches. :) + + +================================================================================ +Joystick does not work +================================================================================ + +If you compiled or are using a version of SDL with udev support (and you should!) +there's a few issues that may cause SDL to fail to detect your joystick. To +debug this, start by installing the evtest utility. On Ubuntu/Debian: + + sudo apt-get install evtest + +Then run: + + sudo evtest + +You'll hopefully see your joystick listed along with a name like "/dev/input/eventXX" +Now run: + + cat /dev/input/event/XX + +If you get a permission error, you need to set a udev rule to change the mode of +your device (see below) + +Also, try: + + sudo udevadm info --query=all --name=input/eventXX + +If you see a line stating ID_INPUT_JOYSTICK=1, great, if you don't see it, +you need to set up an udev rule to force this variable. + +A combined rule for the Saitek Pro Flight Rudder Pedals to fix both issues looks +like: + + SUBSYSTEM=="input", ATTRS{idProduct}=="0763", ATTRS{idVendor}=="06a3", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" + SUBSYSTEM=="input", ATTRS{idProduct}=="0764", ATTRS{idVendor}=="06a3", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" + +You can set up similar rules for your device by changing the values listed in +idProduct and idVendor. To obtain these values, try: + + sudo udevadm info -a --name=input/eventXX | grep idVendor + sudo udevadm info -a --name=input/eventXX | grep idProduct + +If multiple values come up for each of these, the one you want is the first one of each. + +On other systems which ship with an older udev (such as CentOS), you may need +to set up a rule such as: + + SUBSYSTEM=="input", ENV{ID_CLASS}=="joystick", ENV{ID_INPUT_JOYSTICK}="1" + diff --git a/Engine/lib/sdl/README-macosx.txt b/Engine/lib/sdl/README-macosx.txt new file mode 100644 index 000000000..35d70b759 --- /dev/null +++ b/Engine/lib/sdl/README-macosx.txt @@ -0,0 +1,226 @@ +============================================================================== +Using the Simple DirectMedia Layer with Mac OS X +============================================================================== + +These instructions are for people using Apple's Mac OS X (pronounced +"ten"). + +From the developer's point of view, OS X is a sort of hybrid Mac and +Unix system, and you have the option of using either traditional +command line tools or Apple's IDE Xcode. + +To build SDL using the command line, use the standard configure and make +process: + + ./configure + make + sudo make install + +You can also build SDL as a Universal library (a single binary for both +32-bit and 64-bit Intel architectures), on Mac OS X 10.7 and newer, by using +the fatbuild.sh script in build-scripts: + sh build-scripts/fatbuild.sh + sudo build-scripts/fatbuild.sh install +This script builds SDL with 10.5 ABI compatibility on i386 and 10.6 +ABI compatibility on x86_64 architectures. For best compatibility you +should compile your application the same way. A script which wraps +gcc to make this easy is provided in test/gcc-fat.sh + +Please note that building SDL requires at least Xcode 4.6 and the 10.7 SDK +(even if you target back to 10.5 systems). PowerPC support for Mac OS X has +been officially dropped as of SDL 2.0.2. + +To use the library once it's built, you essential have two possibilities: +use the traditional autoconf/automake/make method, or use Xcode. + +============================================================================== +Caveats for using SDL with Mac OS X +============================================================================== + +Some things you have to be aware of when using SDL on Mac OS X: + +- If you register your own NSApplicationDelegate (using [NSApp setDelegate:]), + SDL will not register its own. This means that SDL will not terminate using + SDL_Quit if it receives a termination request, it will terminate like a + normal app, and it will not send a SDL_DROPFILE when you request to open a + file with the app. To solve these issues, put the following code in your + NSApplicationDelegate implementation: + + - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender + { + if (SDL_GetEventState(SDL_QUIT) == SDL_ENABLE) { + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); + } + + return NSTerminateCancel; + } + + - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename + { + if (SDL_GetEventState(SDL_DROPFILE) == SDL_ENABLE) { + SDL_Event event; + event.type = SDL_DROPFILE; + event.drop.file = SDL_strdup([filename UTF8String]); + return (SDL_PushEvent(&event) > 0); + } + + return NO; + } + +============================================================================== +Using the Simple DirectMedia Layer with a traditional Makefile +============================================================================== + +An existing autoconf/automake build system for your SDL app has good chances +to work almost unchanged on OS X. However, to produce a "real" Mac OS X binary +that you can distribute to users, you need to put the generated binary into a +so called "bundle", which basically is a fancy folder with a name like +"MyCoolGame.app". + +To get this build automatically, add something like the following rule to +your Makefile.am: + +bundle_contents = APP_NAME.app/Contents +APP_NAME_bundle: EXE_NAME + mkdir -p $(bundle_contents)/MacOS + mkdir -p $(bundle_contents)/Resources + echo "APPL????" > $(bundle_contents)/PkgInfo + $(INSTALL_PROGRAM) $< $(bundle_contents)/MacOS/ + +You should replace EXE_NAME with the name of the executable. APP_NAME is what +will be visible to the user in the Finder. Usually it will be the same +as EXE_NAME but capitalized. E.g. if EXE_NAME is "testgame" then APP_NAME +usually is "TestGame". You might also want to use @PACKAGE@ to use the package +name as specified in your configure.in file. + +If your project builds more than one application, you will have to do a bit +more. For each of your target applications, you need a separate rule. + +If you want the created bundles to be installed, you may want to add this +rule to your Makefile.am: + +install-exec-hook: APP_NAME_bundle + rm -rf $(DESTDIR)$(prefix)/Applications/APP_NAME.app + mkdir -p $(DESTDIR)$(prefix)/Applications/ + cp -r $< /$(DESTDIR)$(prefix)Applications/ + +This rule takes the Bundle created by the rule from step 3 and installs them +into $(DESTDIR)$(prefix)/Applications/. + +Again, if you want to install multiple applications, you will have to augment +the make rule accordingly. + + +But beware! That is only part of the story! With the above, you end up with +a bare bone .app bundle, which is double clickable from the Finder. But +there are some more things you should do before shipping your product... + +1) The bundle right now probably is dynamically linked against SDL. That + means that when you copy it to another computer, *it will not run*, + unless you also install SDL on that other computer. A good solution + for this dilemma is to static link against SDL. On OS X, you can + achieve that by linking against the libraries listed by + sdl-config --static-libs + instead of those listed by + sdl-config --libs + Depending on how exactly SDL is integrated into your build systems, the + way to achieve that varies, so I won't describe it here in detail +2) Add an 'Info.plist' to your application. That is a special XML file which + contains some meta-information about your application (like some copyright + information, the version of your app, the name of an optional icon file, + and other things). Part of that information is displayed by the Finder + when you click on the .app, or if you look at the "Get Info" window. + More information about Info.plist files can be found on Apple's homepage. + + +As a final remark, let me add that I use some of the techniques (and some +variations of them) in Exult and ScummVM; both are available in source on +the net, so feel free to take a peek at them for inspiration! + + +============================================================================== +Using the Simple DirectMedia Layer with Xcode +============================================================================== + +These instructions are for using Apple's Xcode IDE to build SDL applications. + +- First steps + +The first thing to do is to unpack the Xcode.tar.gz archive in the +top level SDL directory (where the Xcode.tar.gz archive resides). +Because Stuffit Expander will unpack the archive into a subdirectory, +you should unpack the archive manually from the command line: + cd [path_to_SDL_source] + tar zxf Xcode.tar.gz +This will create a new folder called Xcode, which you can browse +normally from the Finder. + +- Building the Framework + +The SDL Library is packaged as a framework bundle, an organized +relocatable folder hierarchy of executable code, interface headers, +and additional resources. For practical purposes, you can think of a +framework as a more user and system-friendly shared library, whose library +file behaves more or less like a standard UNIX shared library. + +To build the framework, simply open the framework project and build it. +By default, the framework bundle "SDL.framework" is installed in +/Library/Frameworks. Therefore, the testers and project stationary expect +it to be located there. However, it will function the same in any of the +following locations: + + ~/Library/Frameworks + /Local/Library/Frameworks + /System/Library/Frameworks + +- Build Options + There are two "Build Styles" (See the "Targets" tab) for SDL. + "Deployment" should be used if you aren't tweaking the SDL library. + "Development" should be used to debug SDL apps or the library itself. + +- Building the Testers + Open the SDLTest project and build away! + +- Using the Project Stationary + Copy the stationary to the indicated folders to access it from + the "New Project" and "Add target" menus. What could be easier? + +- Setting up a new project by hand + Some of you won't want to use the Stationary so I'll give some tips: + * Create a new "Cocoa Application" + * Add src/main/macosx/SDLMain.m , .h and .nib to your project + * Remove "main.c" from your project + * Remove "MainMenu.nib" from your project + * Add "$(HOME)/Library/Frameworks/SDL.framework/Headers" to include path + * Add "$(HOME)/Library/Frameworks" to the frameworks search path + * Add "-framework SDL -framework Foundation -framework AppKit" to "OTHER_LDFLAGS" + * Set the "Main Nib File" under "Application Settings" to "SDLMain.nib" + * Add your files + * Clean and build + +- Building from command line + Use pbxbuild in the same directory as your .pbproj file + +- Running your app + You can send command line args to your app by either invoking it from + the command line (in *.app/Contents/MacOS) or by entering them in the + "Executables" panel of the target settings. + +- Implementation Notes + Some things that may be of interest about how it all works... + * Working directory + As defined in the SDL_main.m file, the working directory of your SDL app + is by default set to its parent. You may wish to change this to better + suit your needs. + * You have a Cocoa App! + Your SDL app is essentially a Cocoa application. When your app + starts up and the libraries finish loading, a Cocoa procedure is called, + which sets up the working directory and calls your main() method. + You are free to modify your Cocoa app with generally no consequence + to SDL. You cannot, however, easily change the SDL window itself. + Functionality may be added in the future to help this. + + +Known bugs are listed in the file "BUGS" diff --git a/Engine/lib/sdl/README-pandora.txt b/Engine/lib/sdl/README-pandora.txt new file mode 100644 index 000000000..d522bc77a --- /dev/null +++ b/Engine/lib/sdl/README-pandora.txt @@ -0,0 +1,16 @@ +SDL 2.0 with open pandora console support ( http://openpandora.org/ ) +===================================================================== + +- A pandora specific video driver was written to allow SDL 2.0 with OpenGL ES +support to work on the pandora under the framebuffer. This driver do not have +input support for now, so if you use it you will have to add your own control code. +The video driver name is "pandora" so if you have problem running it from +the framebuffer, try to set the following variable before starting your application : +"export SDL_VIDEODRIVER=pandora" + +- OpenGL ES support was added to the x11 driver, so it's working like the normal +x11 driver one with OpenGLX support, with SDL input event's etc.. + + +David Carré (Cpasjuste) +cpasjuste@gmail.com diff --git a/Engine/lib/sdl/README-platforms.txt b/Engine/lib/sdl/README-platforms.txt new file mode 100644 index 000000000..2a099cd4b --- /dev/null +++ b/Engine/lib/sdl/README-platforms.txt @@ -0,0 +1,30 @@ + +This is a list of the platforms SDL supports, and who maintains them. + +Officially supported platforms +============================== +(code compiles, and thoroughly tested for release) +============================== +Windows XP/Vista/7/8 +Mac OS X 10.5+ +Linux 2.6+ +iOS 5.1.1+ +Android 2.3.3+ + +Unofficially supported platforms +================================ +(code compiles, but not thoroughly tested) +================================ +FreeBSD +NetBSD +OpenBSD +Solaris + +Platforms supported by volunteers +================================= +Haiku - maintained by Axel Dörfler +PSP - maintained by 527721088@qq.com +Pandora - maintained by Scott Smith + +Platforms that need maintainers +=============================== diff --git a/Engine/lib/sdl/README-porting.txt b/Engine/lib/sdl/README-porting.txt new file mode 100644 index 000000000..f8540b600 --- /dev/null +++ b/Engine/lib/sdl/README-porting.txt @@ -0,0 +1,61 @@ + +* Porting To A New Platform + + The first thing you have to do when porting to a new platform, is look at +include/SDL_platform.h and create an entry there for your operating system. +The standard format is __PLATFORM__, where PLATFORM is the name of the OS. +Ideally SDL_platform.h will be able to auto-detect the system it's building +on based on C preprocessor symbols. + +There are two basic ways of building SDL at the moment: + +1. The "UNIX" way: ./configure; make; make install + + If you have a GNUish system, then you might try this. Edit configure.in, + take a look at the large section labelled: + "Set up the configuration based on the target platform!" + Add a section for your platform, and then re-run autogen.sh and build! + +2. Using an IDE: + + If you're using an IDE or other non-configure build system, you'll probably + want to create a custom SDL_config.h for your platform. Edit SDL_config.h, + add a section for your platform, and create a custom SDL_config_{platform}.h, + based on SDL_config.h.minimal and SDL_config.h.in + + Add the top level include directory to the header search path, and then add + the following sources to the project: + src/*.c + src/atomic/*.c + src/audio/*.c + src/cpuinfo/*.c + src/events/*.c + src/file/*.c + src/haptic/*.c + src/joystick/*.c + src/power/*.c + src/render/*.c + src/stdlib/*.c + src/thread/*.c + src/timer/*.c + src/video/*.c + src/audio/disk/*.c + src/audio/dummy/*.c + src/video/dummy/*.c + src/haptic/dummy/*.c + src/joystick/dummy/*.c + src/main/dummy/*.c + src/thread/generic/*.c + src/timer/dummy/*.c + src/loadso/dummy/*.c + + +Once you have a working library without any drivers, you can go back to each +of the major subsystems and start implementing drivers for your platform. + +If you have any questions, don't hesitate to ask on the SDL mailing list: + http://www.libsdl.org/mailing-list.php + +Enjoy! + Sam Lantinga (slouken@libsdl.org) + diff --git a/Engine/lib/sdl/README-psp.txt b/Engine/lib/sdl/README-psp.txt new file mode 100644 index 000000000..d30842057 --- /dev/null +++ b/Engine/lib/sdl/README-psp.txt @@ -0,0 +1,17 @@ +SDL port for the Sony PSP contributed by + Captian Lex + +Credit to + Marcus R.Brown,Jim Paris,Matthew H for the original SDL 1.2 for PSP + Geecko for his PSP GU lib "Glib2d" + +Building +-------- +To build for the PSP, make sure psp-config is in the path and run: + make -f Makefile.psp + + + +To Do +------ +PSP Screen Keyboard diff --git a/Engine/lib/sdl/README-raspberrypi.txt b/Engine/lib/sdl/README-raspberrypi.txt new file mode 100644 index 000000000..bfc3f8b8c --- /dev/null +++ b/Engine/lib/sdl/README-raspberrypi.txt @@ -0,0 +1,161 @@ +================================================================================ +SDL2 for Raspberry Pi +================================================================================ + +Requirements: + +Raspbian (other Linux distros may work as well). + +================================================================================ + Features +================================================================================ + +* Works without X11 +* Hardware accelerated OpenGL ES 2.x +* Sound via ALSA +* Input (mouse/keyboard/joystick) via EVDEV +* Hotplugging of input devices via UDEV + +================================================================================ + Raspbian Build Dependencies +================================================================================ + +sudo apt-get install libudev-dev libasound2-dev libdbus-1-dev + +You also need the VideoCore binary stuff that ships in /opt/vc for EGL and +OpenGL ES 2.x, it usually comes pre installed, but in any case: + +sudo apt-get install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev + +================================================================================ + Cross compiling from x86 Linux +================================================================================ + +To cross compile SDL for Raspbian from your desktop machine, you'll need a +Raspbian system root and the cross compilation tools. We'll assume these tools +will be placed in /opt/rpi-tools + + sudo git clone --depth 1 https://github.com/raspberrypi/tools /opt/rpi-tools + +You'll also need a Rasbian binary image. +Get it from: http://downloads.raspberrypi.org/raspbian_latest +After unzipping, you'll get file with a name like: -wheezy-raspbian.img +Let's assume the sysroot will be built in /opt/rpi-sysroot. + + export SYSROOT=/opt/rpi-sysroot + sudo kpartx -a -v .img + sudo mount -o loop /dev/mapper/loop0p2 /mnt + sudo cp -r /mnt $SYSROOT + sudo apt-get install qemu binfmt-support qemu-user-static + sudo cp /usr/bin/qemu-arm-static $SYSROOT/usr/bin + sudo mount --bind /dev $SYSROOT/dev + sudo mount --bind /proc $SYSROOT/proc + sudo mount --bind /sys $SYSROOT/sys + +Now, before chrooting into the ARM sysroot, you'll need to apply a workaround, +edit $SYSROOT/etc/ld.so.preload and comment out all lines in it. + + sudo chroot $SYSROOT + apt-get install libudev-dev libasound2-dev libdbus-1-dev libraspberrypi0 libraspberrypi-bin libraspberrypi-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev libxss-dev + exit + sudo umount $SYSROOT/dev + sudo umount $SYSROOT/proc + sudo umount $SYSROOT/sys + sudo umount /mnt + +There's one more fix required, as the libdl.so symlink uses an absolute path +which doesn't quite work in our setup. + + sudo rm -rf $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so + sudo ln -s ../../../lib/arm-linux-gnueabihf/libdl.so.2 $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so + +The final step is compiling SDL itself. + + export CC="/opt/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$SYSROOT -I$SYSROOT/opt/vc/include -I$SYSROOT/usr/include -I$SYSROOT/opt/vc/include/interface/vcos/pthreads -I$SYSROOT/opt/vc/include/interface/vmcs_host/linux" + cd + mkdir -p build;cd build + ../configure --with-sysroot=$SYSROOT --host=arm-raspberry-linux-gnueabihf --prefix=$PWD/rpi-sdl2-installed --disable-pulseaudio --disable-esd + make + make install + +To be able to deploy this to /usr/local in the Raspbian system you need to fix up a few paths: + + perl -w -pi -e "s#$PWD/rpi-sdl2-installed#/usr/local#g;" ./rpi-sdl2-installed/lib/libSDL2.la ./rpi-sdl2-installed/lib/pkgconfig/sdl2.pc ./rpi-sdl2-installed/bin/sdl2-config + +================================================================================ + Apps don't work or poor video/audio performance +================================================================================ + +If you get sound problems, buffer underruns, etc, run "sudo rpi-update" to +update the RPi's firmware. Note that doing so will fix these problems, but it +will also render the CMA - Dynamic Memory Split functionality useless. + +Also, by default the Raspbian distro configures the GPU RAM at 64MB, this is too +low in general, specially if a 1080p TV is hooked up. + +See here how to configure this setting: http://elinux.org/RPiconfig + +Using a fixed gpu_mem=128 is the best option (specially if you updated the +firmware, using CMA probably won't work, at least it's the current case). + +================================================================================ + No input +================================================================================ + +Make sure you belong to the "input" group. + + sudo usermod -aG input `whoami` + +================================================================================ + No HDMI Audio +================================================================================ + +If you notice that ALSA works but there's no audio over HDMI, try adding: + + hdmi_drive=2 + +to your config.txt file and reboot. + +Reference: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=5062 + +================================================================================ + Text Input API support +================================================================================ + +The Text Input API is supported, with translation of scan codes done via the +kernel symbol tables. For this to work, SDL needs access to a valid console. +If you notice there's no SDL_TEXTINPUT message being emitted, double check that +your app has read access to one of the following: + +* /proc/self/fd/0 +* /dev/tty +* /dev/tty[0...6] +* /dev/vc/0 +* /dev/console + +This is usually not a problem if you run from the physical terminal (as opposed +to running from a pseudo terminal, such as via SSH). If running from a PTS, a +quick workaround is to run your app as root or add yourself to the tty group, +then re login to the system. + + sudo usermod -aG tty `whoami` + +The keyboard layout used by SDL is the same as the one the kernel uses. +To configure the layout on Raspbian: + + sudo dpkg-reconfigure keyboard-configuration + +To configure the locale, which controls which keys are interpreted as letters, +this determining the CAPS LOCK behavior: + + sudo dpkg-reconfigure locales + +================================================================================ + Notes +================================================================================ + +* When launching apps remotely (via SSH), SDL can prevent local keystrokes from + leaking into the console only if it has root privileges. Launching apps locally + does not suffer from this issue. + + diff --git a/Engine/lib/sdl/README-touch.txt b/Engine/lib/sdl/README-touch.txt new file mode 100644 index 000000000..6b41707ed --- /dev/null +++ b/Engine/lib/sdl/README-touch.txt @@ -0,0 +1,84 @@ +=========================================================================== +System Specific Notes +=========================================================================== +Linux: +The linux touch system is currently based off event streams, and proc/bus/devices. The active user must be given permissions to read /dev/input/TOUCHDEVICE, where TOUCHDEVICE is the event stream for your device. Currently only Wacom tablets are supported. If you have an unsupported tablet contact me at jim.tla+sdl_touch@gmail.com and I will help you get support for it. + +Mac: +The Mac and iPhone APIs are pretty. If your touch device supports them then you'll be fine. If it doesn't, then there isn't much we can do. + +iPhone: +Works out of box. + +Windows: +Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at jim.tla+sdl_touch@gmail.com + +=========================================================================== +Events +=========================================================================== +SDL_FINGERDOWN: +Sent when a finger (or stylus) is placed on a touch device. +Fields: +event.tfinger.touchId - the Id of the touch device. +event.tfinger.fingerId - the Id of the finger which just went down. +event.tfinger.x - the x coordinate of the touch (0..1) +event.tfinger.y - the y coordinate of the touch (0..1) +event.tfinger.pressure - the pressure of the touch (0..1) + +SDL_FINGERMOTION: +Sent when a finger (or stylus) is moved on the touch device. +Fields: +Same as SDL_FINGERDOWN but with additional: +event.tfinger.dx - change in x coordinate during this motion event. +event.tfinger.dy - change in y coordinate during this motion event. + +SDL_FINGERUP: +Sent when a finger (or stylus) is lifted from the touch device. +Fields: +Same as SDL_FINGERDOWN. + + +=========================================================================== +Functions +=========================================================================== +SDL provides the ability to access the underlying Finger structures. +These structures should _never_ be modified. + +The following functions are included from SDL_touch.h + +To get a SDL_TouchID call SDL_GetTouchDevice(index). +This returns a SDL_TouchID. +IMPORTANT: If the touch has been removed, or there is no touch with the given ID, SDL_GetTouchID will return 0. Be sure to check for this! + +The number of touch devices can be queried with SDL_GetNumTouchDevices(). + +A SDL_TouchID may be used to get pointers to SDL_Finger. + +SDL_GetNumTouchFingers(touchID) may be used to get the number of fingers currently down on the device. + +The most common reason to access SDL_Finger is to query the fingers outside the event. In most cases accessing the fingers is using the event. This would be accomplished by code like the following: + + float x = event.tfinger.x; + float y = event.tfinger.y; + + + +To get a SDL_Finger, call SDL_GetTouchFinger(touchID,index), where touchID is a SDL_TouchID, and index is the requested finger. +This returns a SDL_Finger*, or NULL if the finger does not exist, or has been removed. +A SDL_Finger is guaranteed to be persistent for the duration of a touch, but it will be de-allocated as soon as the finger is removed. This occurs when the SDL_FINGERUP event is _added_ to the event queue, and thus _before_ the SDL_FINGERUP event is polled. +As a result, be very careful to check for NULL return values. + +A SDL_Finger has the following fields: +>x,y,pressure: + The current coordinates of the touch. +>pressure: + The pressure of the touch. + +=========================================================================== +Notes +=========================================================================== +For a complete example see test/testgesture.c + +Please direct questions/comments to: + jim.tla+sdl_touch@gmail.com + (original author, API was changed since) diff --git a/Engine/lib/sdl/README-wince.txt b/Engine/lib/sdl/README-wince.txt new file mode 100644 index 000000000..9ebc695a7 --- /dev/null +++ b/Engine/lib/sdl/README-wince.txt @@ -0,0 +1,8 @@ + +Windows CE is no longer supported by SDL. + +We have left the CE support in SDL 1.2 for those that must have it, and we +have support for Windows Phone 8 and WinRT in SDL2, as of SDL 2.0.3. + +--ryan. + diff --git a/Engine/lib/sdl/README-windows.txt b/Engine/lib/sdl/README-windows.txt new file mode 100644 index 000000000..7f9c4a35f --- /dev/null +++ b/Engine/lib/sdl/README-windows.txt @@ -0,0 +1,42 @@ +================================================================================ +Simple DirectMedia Layer for Windows +================================================================================ + +================================================================================ +OpenGL ES 2.x support +================================================================================ + +SDL has support for OpenGL ES 2.x under Windows via two alternative +implementations. +The most straightforward method consists in running your app in a system with +a graphic card paired with a relatively recent (as of November of 2013) driver +which supports the WGL_EXT_create_context_es2_profile extension. Vendors known +to ship said extension on Windows currently include nVidia and Intel. + +The other method involves using the ANGLE library (https://code.google.com/p/angleproject/) +If an OpenGL ES 2.x context is requested and no WGL_EXT_create_context_es2_profile +extension is found, SDL will try to load the libEGL.dll library provided by +ANGLE. +To obtain the ANGLE binaries, you can either compile from source from +https://chromium.googlesource.com/angle/angle or copy the relevant binaries from +a recent Chrome/Chromium install for Windows. The files you need are: + + * libEGL.dll + * libGLESv2.dll + * d3dcompiler_46.dll (supports Windows Vista or later, better shader compiler) + or... + * d3dcompiler_43.dll (supports Windows XP or later) + +If you compile ANGLE from source, you can configure it so it does not need the +d3dcompiler_* DLL at all (for details on this, see their documentation). +However, by default SDL will try to preload the d3dcompiler_46.dll to +comply with ANGLE's requirements. If you wish SDL to preload d3dcompiler_43.dll (to +support Windows XP) or to skip this step at all, you can use the +SDL_HINT_VIDEO_WIN_D3DCOMPILER hint (see SDL_hints.h for more details). + +Known Bugs: + + * SDL_GL_SetSwapInterval is currently a no op when using ANGLE. It appears + that there's a bug in the library which prevents the window contents from + refreshing if this is set to anything other than the default value. + diff --git a/Engine/lib/sdl/README.txt b/Engine/lib/sdl/README.txt new file mode 100644 index 000000000..b9f80ee73 --- /dev/null +++ b/Engine/lib/sdl/README.txt @@ -0,0 +1,42 @@ + + Simple DirectMedia Layer + + (SDL) + + Version 2.0 + +--- +http://www.libsdl.org/ + +Simple DirectMedia Layer is a cross-platform development library designed +to provide low level access to audio, keyboard, mouse, joystick, and graphics +hardware via OpenGL and Direct3D. It is used by video playback software, +emulators, and popular games including Valve's award winning catalog +and many Humble Bundle games. + +SDL officially supports Windows, Mac OS X, Linux, iOS, and Android. +Support for other platforms may be found in the source code. + +SDL is written in C, works natively with C++, and there are bindings +available for several other languages, including C# and Python. + +This library is distributed under the zlib license, which can be found +in the file "COPYING.txt". + +The best way to learn how to use SDL is to check out the header files in +the "include" subdirectory and the programs in the "test" subdirectory. +The header files and test programs are well commented and always up to date. +More documentation and FAQs are available online at: + http://wiki.libsdl.org/ + +If you need help with the library, or just want to discuss SDL related +issues, you can join the developers mailing list: + http://www.libsdl.org/mailing-list.php + +If you want to report bugs or contribute patches, please submit them to +bugzilla: + http://bugzilla.libsdl.org/ + +Enjoy! + Sam Lantinga (slouken@libsdl.org) + diff --git a/Engine/lib/sdl/SDL2.spec b/Engine/lib/sdl/SDL2.spec new file mode 100644 index 000000000..e8220c170 --- /dev/null +++ b/Engine/lib/sdl/SDL2.spec @@ -0,0 +1,112 @@ +Summary: Simple DirectMedia Layer +Name: SDL2 +Version: 2.0.3 +Release: 1 +Source: http://www.libsdl.org/release/%{name}-%{version}.tar.gz +URL: http://www.libsdl.org/ +License: zlib +Group: System Environment/Libraries +BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot +Prefix: %{_prefix} +%ifos linux +Provides: libSDL2-2.0.so.0 +%endif + +%define __defattr %defattr(-,root,root) +%define __soext so + +%description +This is the Simple DirectMedia Layer, a generic API that provides low +level access to audio, keyboard, mouse, and display framebuffer across +multiple platforms. + +%package devel +Summary: Libraries, includes and more to develop SDL applications. +Group: Development/Libraries +Requires: %{name} = %{version} + +%description devel +This is the Simple DirectMedia Layer, a generic API that provides low +level access to audio, keyboard, mouse, and display framebuffer across +multiple platforms. + +This is the libraries, include files and other resources you can use +to develop SDL applications. + + +%prep +%setup -q + +%build +%ifos linux +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} --disable-video-directfb +%else +%configure +%endif +make + +%install +rm -rf $RPM_BUILD_ROOT +%ifos linux +make install prefix=$RPM_BUILD_ROOT%{prefix} \ + bindir=$RPM_BUILD_ROOT%{_bindir} \ + libdir=$RPM_BUILD_ROOT%{_libdir} \ + includedir=$RPM_BUILD_ROOT%{_includedir} \ + datadir=$RPM_BUILD_ROOT%{_datadir} \ + mandir=$RPM_BUILD_ROOT%{_mandir} +%else +%makeinstall +%endif + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%{__defattr} +%doc README-SDL.txt COPYING.txt CREDITS.txt BUGS.txt +%{_libdir}/lib*.%{__soext}.* + +%files devel +%{__defattr} +%doc README README-SDL.txt COPYING CREDITS BUGS WhatsNew +%{_bindir}/*-config +%{_libdir}/lib*.a +%{_libdir}/lib*.la +%{_libdir}/lib*.%{__soext} +%{_includedir}/*/*.h +%{_libdir}/pkgconfig/* +%{_datadir}/aclocal/* + +%changelog +* Sun Jan 22 2012 Sam Lantinga +- Updated for SDL 2.0 + +* Tue May 16 2006 Sam Lantinga +- Removed support for Darwin, due to build problems on ps2linux + +* Mon Jan 03 2004 Anders Bjorklund +- Added support for Darwin, updated spec file + +* Wed Jan 19 2000 Sam Lantinga +- Re-integrated spec file into SDL distribution +- 'name' and 'version' come from configure +- Some of the documentation is devel specific +- Removed SMP support from %build - it doesn't work with libtool anyway + +* Tue Jan 18 2000 Hakan Tandogan +- Hacked Mandrake sdl spec to build 1.1 + +* Sun Dec 19 1999 John Buswell +- Build Release + +* Sat Dec 18 1999 John Buswell +- Add symlink for libSDL-1.0.so.0 required by sdlbomber +- Added docs + +* Thu Dec 09 1999 Lenny Cartier +- v 1.0.0 + +* Mon Nov 1 1999 Chmouel Boudjnah +- First spec file for Mandrake distribution. + +# end of file diff --git a/Engine/lib/sdl/SDL2.spec.in b/Engine/lib/sdl/SDL2.spec.in new file mode 100644 index 000000000..2a5c47924 --- /dev/null +++ b/Engine/lib/sdl/SDL2.spec.in @@ -0,0 +1,112 @@ +Summary: Simple DirectMedia Layer +Name: SDL2 +Version: @SDL_VERSION@ +Release: 1 +Source: http://www.libsdl.org/release/%{name}-%{version}.tar.gz +URL: http://www.libsdl.org/ +License: zlib +Group: System Environment/Libraries +BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot +Prefix: %{_prefix} +%ifos linux +Provides: libSDL2-2.0.so.0 +%endif + +%define __defattr %defattr(-,root,root) +%define __soext so + +%description +This is the Simple DirectMedia Layer, a generic API that provides low +level access to audio, keyboard, mouse, and display framebuffer across +multiple platforms. + +%package devel +Summary: Libraries, includes and more to develop SDL applications. +Group: Development/Libraries +Requires: %{name} = %{version} + +%description devel +This is the Simple DirectMedia Layer, a generic API that provides low +level access to audio, keyboard, mouse, and display framebuffer across +multiple platforms. + +This is the libraries, include files and other resources you can use +to develop SDL applications. + + +%prep +%setup -q + +%build +%ifos linux +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} --disable-video-directfb +%else +%configure +%endif +make + +%install +rm -rf $RPM_BUILD_ROOT +%ifos linux +make install prefix=$RPM_BUILD_ROOT%{prefix} \ + bindir=$RPM_BUILD_ROOT%{_bindir} \ + libdir=$RPM_BUILD_ROOT%{_libdir} \ + includedir=$RPM_BUILD_ROOT%{_includedir} \ + datadir=$RPM_BUILD_ROOT%{_datadir} \ + mandir=$RPM_BUILD_ROOT%{_mandir} +%else +%makeinstall +%endif + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%{__defattr} +%doc README-SDL.txt COPYING.txt CREDITS.txt BUGS.txt +%{_libdir}/lib*.%{__soext}.* + +%files devel +%{__defattr} +%doc README README-SDL.txt COPYING CREDITS BUGS WhatsNew +%{_bindir}/*-config +%{_libdir}/lib*.a +%{_libdir}/lib*.la +%{_libdir}/lib*.%{__soext} +%{_includedir}/*/*.h +%{_libdir}/pkgconfig/* +%{_datadir}/aclocal/* + +%changelog +* Sun Jan 22 2012 Sam Lantinga +- Updated for SDL 2.0 + +* Tue May 16 2006 Sam Lantinga +- Removed support for Darwin, due to build problems on ps2linux + +* Mon Jan 03 2004 Anders Bjorklund +- Added support for Darwin, updated spec file + +* Wed Jan 19 2000 Sam Lantinga +- Re-integrated spec file into SDL distribution +- 'name' and 'version' come from configure +- Some of the documentation is devel specific +- Removed SMP support from %build - it doesn't work with libtool anyway + +* Tue Jan 18 2000 Hakan Tandogan +- Hacked Mandrake sdl spec to build 1.1 + +* Sun Dec 19 1999 John Buswell +- Build Release + +* Sat Dec 18 1999 John Buswell +- Add symlink for libSDL-1.0.so.0 required by sdlbomber +- Added docs + +* Thu Dec 09 1999 Lenny Cartier +- v 1.0.0 + +* Mon Nov 1 1999 Chmouel Boudjnah +- First spec file for Mandrake distribution. + +# end of file diff --git a/Engine/lib/sdl/TODO.txt b/Engine/lib/sdl/TODO.txt new file mode 100644 index 000000000..0cd6c4db4 --- /dev/null +++ b/Engine/lib/sdl/TODO.txt @@ -0,0 +1,10 @@ +Future work roadmap: + * http://wiki.libsdl.org/moin.cgi/Roadmap + + * Check 1.2 revisions: + 3554 - Need to resolve semantics for locking keys on different platforms + 4874 - Do we want screen rotation? At what level? + 4974 - Windows file code needs to convert UTF-8 to Unicode, but we don't need to tap dance for Windows 95/98 + 4865 - See if this is still needed (mouse coordinate clamping) + 4866 - See if this is still needed (blocking window repositioning) + diff --git a/Engine/lib/sdl/VisualC.html b/Engine/lib/sdl/VisualC.html new file mode 100644 index 000000000..a25907bd9 --- /dev/null +++ b/Engine/lib/sdl/VisualC.html @@ -0,0 +1,148 @@ + + + Using SDL with Microsoft Visual C++ + + +

+ Using SDL with Microsoft Visual C++ +

+

+ by Lion Kimbro and additions by + James Turk +

+

+ You can either use the precompiled libraries from the SDL Download web site , or you can build SDL yourself. +

+

+ Building SDL +

+

+ Go into the VisualC directory and double-click on the Visual Studio solution for your version of Visual Studio, e.g. SDL_VS2008.sln This should open up the IDE. +

+

+ There are different solution files for the various + versions of the IDE. Please use the appropiate version + 2008, 2010 or 2012; the 2010EE and 2012EE files + should be used with the "Express Edition" releases. +

+

+ Build the .dll and .lib files. +

+

+ This is done by right clicking on each project in turn (Projects are listed in + the Workspace panel in the FileView tab), and selecting "Build". +

+

+ You may get a few warnings, but you should not get any errors. You do have to + have at least the DirectX 9 SDK installed, however. The latest + version of DirectX can be downloaded from Microsoft. +

+

+ Later, we will refer to the following .lib and .dll files that have just been + generated: +

+
    +
  • SDL2.dll
  • +
  • SDL2.lib
  • +
  • SDL2main.lib
  • +
+

+ Search for these using the Windows Find (Windows-F) utility inside the VisualC directory. +

+

+ Creating a Project with SDL +

+

+ Create a project as a Win32 Application. +

+

+ Create a C++ file for your project. +

+

+ Set the C runtime to "Multi-threaded DLL" in the menu: Project|Settings|C/C++ + tab|Code Generation|Runtime Library . +

+

+ Add the SDL include directory to your list of includes in the + menu: Project|Settings|C/C++ tab|Preprocessor|Additional include directories + . +
+ VC7 Specific: Instead of doing this I find it easier to + add the include and library directories to the list that VC7 keeps. Do this by + selecting Tools|Options|Projects|VC++ Directories and under the "Show + Directories For:" dropbox select "Include Files", and click the "New Directory + Icon" and add the [SDLROOT]\include directory (e.g. If you installed to + c:\SDL\ add c:\SDL\include). Proceed to change the + dropbox selection to "Library Files" and add [SDLROOT]\lib. +

+

+ The "include directory" I am referring to is the include folder + within the main SDL directory (the one that this HTML file located within). +

+

+ Now we're going to use the files that we had created earlier in the Build SDL + step. +

+

+ Copy the following files into your Project directory: +

+
    +
  • SDL2.dll
  • +
+

+ Add the following files to your project (It is not necessary to copy them to + your project directory): +

+
    +
  • SDL2.lib
  • +
  • SDL2main.lib
  • +
+

+ (To add them to your project, right click on your project, and select "Add + files to project") +

+

Instead of adding the files to your project it is more + desireable to add them to the linker options: Project|Properties|Linker|Command + Line and type the names of the libraries to link with in the "Additional + Options:" box.  Note: This must be done for each build + configuration (e.g. Release,Debug).

+

+ SDL 101, First Day of Class +

+

+ Now create the basic body of your project. The body of your program should take + the following form: +

+#include "SDL.h"
+
+int main( int argc, char* argv[] )
+{
+  // Body of the program goes here.
+  return 0;
+}
+
+ +

+

+ That's it! +

+

+ I hope that this document has helped you get through the most difficult part of + using the SDL: installing it. Suggestions for improvements to this document + should be sent to the writers of this document. +

+

+ Thanks to Paulus Esterhazy (pesterhazy@gmx.net), for the work on VC++ port. +

+

+ This document was originally called "VisualC.txt", and was written by + Sam Lantinga. +

+

+ Later, it was converted to HTML and expanded into the document that you see + today by Lion Kimbro. +

+

Minor Fixes and Visual C++ 7 Information (In Green) was added by James Turk +

+ + diff --git a/Engine/lib/sdl/VisualC/clean.sh b/Engine/lib/sdl/VisualC/clean.sh new file mode 100644 index 000000000..f90a11e97 --- /dev/null +++ b/Engine/lib/sdl/VisualC/clean.sh @@ -0,0 +1,5 @@ +find . -type d -name 'Debug' -exec rm -rv {} \; +find . -type d -name 'Release' -exec rm -rv {} \; +find . -type f -name '*.user' -exec rm -v {} \; +find . -type f -name '*.ncb' -exec rm -v {} \; +find . -type f -name '*.suo' -exec rm -v {} \; diff --git a/Engine/lib/sdl/WhatsNew.txt b/Engine/lib/sdl/WhatsNew.txt new file mode 100644 index 000000000..d0e5f6d38 --- /dev/null +++ b/Engine/lib/sdl/WhatsNew.txt @@ -0,0 +1,108 @@ + +This is a list of major changes in SDL's version history. + +--------------------------------------------------------------------------- +2.0.3: +--------------------------------------------------------------------------- + +Mac OS X: +* Fixed creating an OpenGL context by default on Mac OS X 10.6 + + +--------------------------------------------------------------------------- +2.0.2: +--------------------------------------------------------------------------- +General: +* Added SDL_GL_ResetAttributes() to reset OpenGL attributes to default values +* Added an API to load a database of game controller mappings from a file: + SDL_GameControllerAddMappingsFromFile(), SDL_GameControllerAddMappingsFromRW() +* Added game controller mappings for the PS4 and OUYA controllers +* Added SDL_GetDefaultAssertionHandler() and SDL_GetAssertionHandler() +* Added SDL_DetachThread() +* Added SDL_HasAVX() to determine if the CPU has AVX features +* Added SDL_vsscanf(), SDL_acos(), and SDL_asin() to the stdlib routines +* EGL can now create/manage OpenGL and OpenGL ES 1.x/2.x contexts, and share + them using SDL_GL_SHARE_WITH_CURRENT_CONTEXT +* Added a field "clicks" to the mouse button event which records whether the event is a single click, double click, etc. +* The screensaver is now disabled by default, and there is a hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER that can change that behavior. +* Added a hint SDL_HINT_MOUSE_RELATIVE_MODE_WARP to specify whether mouse relative mode should be emulated using mouse warping. +* testgl2 does not need to link with libGL anymore +* Added testgles2 test program to demonstrate working with OpenGL ES 2.0 +* Added controllermap test program to visually map a game controller + +Windows: +* Support for OpenGL ES 2.x contexts using either WGL or EGL (natively via + the driver or emulated through ANGLE) +* Added a hint SDL_HINT_VIDEO_WIN_D3DCOMPILER to specify which D3D shader compiler to use for OpenGL ES 2 support through ANGLE +* Added a hint SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT that is useful when creating multiple windows that should share the same OpenGL context. +* Added an event SDL_RENDER_TARGETS_RESET that is sent when D3D9 render targets are reset after the device has been restored. + +Mac OS X: +* Added a hint SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK to control whether Ctrl+click should be treated as a right click on Mac OS X. This is off by default. + +Linux: +* Fixed fullscreen and focused behavior when receiving NotifyGrab events +* Added experimental Wayland and Mir support, disabled by default + +Android: +* Joystick support (minimum SDK version required to build SDL is now 12, + the required runtime version remains at 10, but on such devices joystick + support won't be available). +* Hotplugging support for joysticks +* Added a hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK to control whether the accelerometer should be listed as a 3 axis joystick, which it will by default. + + +--------------------------------------------------------------------------- +2.0.1: +--------------------------------------------------------------------------- + +General: +* Added an API to get common filesystem paths in SDL_filesystem.h: + SDL_GetBasePath(), SDL_GetPrefPath() +* Added an API to do optimized YV12 and IYUV texture updates: + SDL_UpdateYUVTexture() +* Added an API to get the amount of RAM on the system: + SDL_GetSystemRAM() +* Added a macro to perform timestamp comparisons with SDL_GetTicks(): + SDL_TICKS_PASSED() +* Dramatically improved OpenGL ES 2.0 rendering performance +* Added OpenGL attribute SDL_GL_FRAMEBUFFER_SRGB_CAPABLE + +Windows: +* Created a static library configuration for the Visual Studio 2010 project +* Added a hint to create the Direct3D device with support for multi-threading: + SDL_HINT_RENDER_DIRECT3D_THREADSAFE +* Added a function to get the D3D9 adapter index for a display: + SDL_Direct3D9GetAdapterIndex() +* Added a function to get the D3D9 device for a D3D9 renderer: + SDL_RenderGetD3D9Device() +* Fixed building SDL with the mingw32 toolchain (mingw-w64 is preferred) +* Fixed crash when using two XInput controllers at the same time +* Fixed detecting a mixture of XInput and DirectInput controllers +* Fixed clearing a D3D render target larger than the window +* Improved support for format specifiers in SDL_snprintf() + +Mac OS X: +* Added support for retina displays: + Create your window with the SDL_WINDOW_ALLOW_HIGHDPI flag, and then use SDL_GL_GetDrawableSize() to find the actual drawable size. You are responsible for scaling mouse and drawing coordinates appropriately. +* Fixed mouse warping in fullscreen mode +* Right mouse click is emulated by holding the Ctrl key while left clicking + +Linux: +* Fixed float audio support with the PulseAudio driver +* Fixed missing line endpoints in the OpenGL renderer on some drivers +* X11 symbols are no longer defined to avoid collisions when linking statically + +iOS: +* Fixed status bar visibility on iOS 7 +* Flipped the accelerometer Y axis to match expected values + +Android: +IMPORTANT: You MUST get the updated SDLActivity.java to match C code +* Moved EGL initialization to native code +* Fixed the accelerometer axis rotation relative to the device rotation +* Fixed race conditions when handling the EGL context on pause/resume +* Touch devices are available for enumeration immediately after init + +Raspberry Pi: +* Added support for the Raspberry Pi, see README-raspberrypi.txt for details diff --git a/Engine/lib/sdl/Xcode-iOS/Demos/Default.png b/Engine/lib/sdl/Xcode-iOS/Demos/Default.png new file mode 100644 index 0000000000000000000000000000000000000000..f91282875ae2654ee5ff9f347921620f358fd85e GIT binary patch literal 18383 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 literal 0 HcmV?d00001 diff --git a/Engine/lib/sdl/Xcode-iOS/Demos/Info.plist b/Engine/lib/sdl/Xcode-iOS/Demos/Info.plist new file mode 100644 index 000000000..0398f008b --- /dev/null +++ b/Engine/lib/sdl/Xcode-iOS/Demos/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.yourcompany.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + + UISupportedInterfaceOrientations + + + diff --git a/Engine/lib/sdl/Xcode-iOS/Demos/README b/Engine/lib/sdl/Xcode-iOS/Demos/README new file mode 100644 index 000000000..55f8066d6 --- /dev/null +++ b/Engine/lib/sdl/Xcode-iOS/Demos/README @@ -0,0 +1,43 @@ +============================================================================== +About the iPhone OS Demo Applications +============================================================================== + +Demos.xcodeproj contains several targets for iPhone oriented SDL demos. These demos are written strictly using SDL 1.3 calls. All the demos except for Fireworks (which requires OpenGL ES) should work on platforms other than iPhone OS, though you'll need to write your own compile script. To run them on your favorite platform, you may wish to set the macros SCREEN_WIDTH and SCREEN_HEIGHT, located in common.h. + +Common files: + + common.c and common.h contain code common to all demo applications. This includes macros about the screen dimensions (in pixels), simple error handling, and functions for generating random numbers. + +Rectangles (rectangles.c): + + Draws randomly sized and colored rectangles all over the screen by using SDL_RenderFill. This is the simplest of all the demos. + +Happy (happy.c): + + Loads the classic happy-face bitmap and draws a large number of happy faces bouncing around the screen. Shows how you can load a bitmap into an SDL_Texture. + +Accelerometer (accelerometer.c): + + Uses the iPhone's accelerometer as a joystick device to move a spaceship around the screen. Note the use of the macro SDL_IPHONE_MAX_GFORCE (normally defined in SDL_config_iphoneos.h) which converts between the Sint16 number returned by SDL_JoystickGetAxis, and the floating point units of g-force reported natively by the iPhone. + +Touch (touch.c): + + Acts as a finger-paint type program. Demonstrates how you can use SDL mouse input to accept touch input from the iPhone. If SDL for iPhone is compiled with multitouch as multiple mouse emulation (SDL_IPHONE_MULTIPLE_MICE in SDL_config_iphoneos.h) then the program will accept multiple finger inputs simultaneously. + +Mixer (mixer.c): + + Displays several rectangular buttons which can be used as a virtual drumkit. Demonstrates how you can play .wav sounds in SDL and how you can use SDL_MixAudioFormat to build a software mixer that can play multiple sounds at once. + +Keyboard (keyboard.c): + + Loads a bitmap font and let's the user type words, numbers, and symbols using the iPhone's virtual keyboard. The iPhone's onscreen keyboard visibility is toggled when the user taps the screen. If the user types ':)' a happy face is displayed. Demonstrates how to use functions added to the iPhone implementation of SDL to toggle keyboard onscreen visibility. + +Fireworks (fireworks.c): + + Displays a fireworks show. When you tap the iPhone's screen, fireworks fly from the bottom of the screen and explode at the point that you tapped. Demonstrates how you can use SDL on iPhone to build an OpenGL ES based application. Shows you how you can use SDL_LoadBMP to load a bmp image and convert it to an OpenGL ES texture. Of lesser importance, shows how you can use OpenGL ES point sprites to build an efficient particle system. + +============================================================================== +Building and Running the demos +============================================================================== + +Before building the demos you must first build SDL as a static library for BOTH the iPhone Simulator and the iPhone itself. See the iPhone SDL main README file for directions on how to do this. Once this is done, simply launch XCode, select the target you'd like to build, select the active SDK (simulator or device), and then build and go. diff --git a/Engine/lib/sdl/Xcode-iOS/Demos/data/bitmapfont/kromasky_16x16.bmp b/Engine/lib/sdl/Xcode-iOS/Demos/data/bitmapfont/kromasky_16x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c0b6fb964fd176d5770cf7000088fe1c87b220bf GIT binary patch literal 45368 zcmeHPF{`CX6&y7%FcCK~G8Qut)Nm0L4EzVi`xD$Bp_$Qwk*f;^D{7`-WV$SDCJ2h4 z*{Wb5h{Chpt9@n7sXqO6fA`**eY(TlZ>mq%sZ)LWd*AK3duP7(t*`$4*~70dQc8Et4vTyOxTdFfapyc~ z>DW`cxN{skzr!7WH@>UC%fGcB*C(b!kGtpHxaT@v(Q%Gr*CFPt$2yw~!BiG`0I$eC%4|P&4BlC52{7d|}x9jSst8@D9 zu+yA#GK-P*taYZ>VwOj|Zi%Zzi4TV&0}Khnpl6-H)cnRbzy97Yzl#?DBPXPkBA=3_ zxL;KWWF z*02`pGSRPYCUGgmVbT;K;iaF4wLo@8L-{O#gq7z5nYw?}=f!yL6eFF^RrnD9(pSC+ zhgfy-xvMXqrGXk=OTXx-F5|d%&KVa?V9qc47?Qsm@2VW?uz_@&OL$p+w5S5NnDhI80hblsJ^__*#fS zR%GPG`8FnS0q$%wzD3Ry7k8vsCCKuqS`+X^R@i#|nsbtOeVTrku5 zFa3c6naSUc7c&^H_{l8R^?vSRD*WNyxAnT6=3=b}+FP%^cK5~`cf%ub>cG4jsD%Jr zzLwp7-iVKd=&cQJaQp@E(4RYgV$3(eG~n$zY>1QD$-|VaIEk$2C&%|U#fN;q4TQ^D zIK)*100mWu5$AMRxkYo%S0RC{$Os8JJJ;Xk%LYK^x|4H$*0WY>C1=;a^MNVo=V3$& z$A{!EeqVxQTwUMQ9E&XAvyMUF^8t?n;Ge$zi|@StI-U{$7?$S))%>1eWIgV=jyoOa zIDT1t*7XKD&OW$j$DRLq9JQPP+-YJ;Wao6)Wu3Dd_gu#-I^-~Gg}6#)&1E~Z12#>4Z^ zzx}m5?CLn5no#4*n*gjh0H-1s9}DB8cZVbKJMRpR#LR+Kmjb5wTuU)t449B1x| zez(7<<$}Ph?wXEyV>3dgr)Ta8$MuDI`!OBY^iSs8553J@adurl)#Mpq?k97#OtmpN zEBf6kcKuLCW(r7eb3W2Z;Cc1OKl%xWejS#WoQFM^7_wJ94^xxR2Vk6m(LWX`78cQt0kWP-CkE~&XG7k>Zc}Xut$fB zd@muq(g%?NoWI^5W_5h&gFvSD>I8O^R}_5zkMH6oaSqG1lzSL{a2VE+c=#zX6VZVp zsGg`U8X~+1vWHB}_$0DetI±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 a>CgMt_2-hf@6IJUzMH!`p6mG0+kXHiqKaAo literal 0 HcmV?d00001 diff --git a/Engine/lib/sdl/Xcode-iOS/Demos/data/bitmapfont/license.txt b/Engine/lib/sdl/Xcode-iOS/Demos/data/bitmapfont/license.txt new file mode 100644 index 000000000..6949ec444 --- /dev/null +++ b/Engine/lib/sdl/Xcode-iOS/Demos/data/bitmapfont/license.txt @@ -0,0 +1,258 @@ + __ _ _ + / _| | | | | +| |_ ___ _ __ | |_ _ __ __ _ ___| | __ +| _/ _ \| '_ \| __| '_ \ / _` |/ __| |/ / +| || (_) | | | | |_| |_) | (_| | (__| < +|_| \___/|_| |_|\__| .__/ \__,_|\___|_|\_\ + | | + |_| +---------------------------------------------------------------------- +Product : font-pack.zip +Website : http://www.spicypixel.net +Author : Marc Russell +Released: 16th January 2008 +---------------------------------------------------------------------- + +What is this? +------------- +font-pack is a package of free art assets to be used under the terms of this document. It is available to game developers and hobbyists alike. + +Contents +-------- +The contents of the font-pack ZIP file include 20 bitmap fonts + +Usage License & Restrictions +---------------------------- +font-pack is distributed under the "Common Public License Version 1.0." +The terms of which are given below. If you do not understand the terms of the license please refer to a solicitor. It should however, be relatively clear how this package can be used. + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF +THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and + documentation distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate from + and are distributed by that particular Contributor. A Contribution + 'originates' from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's + behalf. Contributions do not include additions to the Program which: + (i) are separate modules of software distributed in conjunction with + the Program under their own license agreement, and (ii) are not + derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare derivative works of, publicly display, + publicly perform, distribute and sublicense the Contribution of such + Contributor, if any, and such derivative works, in source code and + object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in source code and object code form. This patent license + shall apply to the combination of the Contribution and the Program + if, at the time the Contribution is added by the Contributor, such + addition of the Contribution causes such combination to be covered + by the Licensed Patents. The patent license shall not apply to any + other combinations which include the Contribution. No hardware per + se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby assumes + sole responsibility to secure any other intellectual property rights + needed, if any. For example, if a third party patent license is + required to allow Recipient to distribute the Program, it is + Recipient's responsibility to acquire that license before + distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form +under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all + warranties and conditions, express and implied, including warranties + or conditions of title and non-infringement, and implied warranties + or conditions of merchantability and fitness for a particular + purpose; + + ii) effectively excludes on behalf of all Contributors all liability + for damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software + exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the + Program. + +Contributors may not remove or alter any copyright notices contained +within the Program. + +Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, the +Contributor who includes the Program in a commercial product offering +should do so in a manner which does not create potential liability for +other Contributors. Therefore, if a Contributor includes the Program in +a commercial product offering, such Contributor ("Commercial +Contributor") hereby agrees to defend and indemnify every other +Contributor ("Indemnified Contributor") against any losses, damages and +costs (collectively "Losses") arising from claims, lawsuits and other +legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the +Program in a commercial product offering. The obligations in this +section do not apply to any claims or Losses relating to any actual or +alleged intellectual property infringement. In order to qualify, an +Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial +Contributor to control, and cooperate with the Commercial Contributor +in, the defense and any related settlement negotiations. The Indemnified +Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED +ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES +OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR +A PARTICULAR PURPOSE. Each Recipient is solely responsible for +determining the appropriateness of using and distributing the Program +and assumes all risks associated with its exercise of rights under this +Agreement, including but not limited to the risks and costs of program +errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR +ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with +respect to a patent applicable to software (including a cross-claim or +counterclaim in a lawsuit), then any patent licenses granted by that +Contributor to such Recipient under this Agreement shall terminate as of +the date such litigation is filed. In addition, if Recipient institutes +patent litigation against any entity (including a cross-claim or +counterclaim in a lawsuit) alleging that the Program itself (excluding +combinations of the Program with other software or hardware) infringes +such Recipient's patent(s), then such Recipient's rights granted under +Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails +to comply with any of the material terms or conditions of this Agreement +and does not cure such failure in a reasonable period of time after +becoming aware of such noncompliance. If all Recipient's rights under +this Agreement terminate, Recipient agrees to cease use and distribution +of the Program as soon as reasonably practicable. However, Recipient's +obligations under this Agreement and any licenses granted by Recipient +relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and may +only be modified in the following manner. The Agreement Steward reserves +the right to publish new versions (including revisions) of this +Agreement from time to time. No one other than the Agreement Steward has +the right to modify this Agreement. IBM is the initial Agreement +Steward. IBM may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement +will be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version +of the Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives no +rights or licenses to the intellectual property of any Contributor under +this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under this +Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to +this Agreement will bring a legal action under this Agreement more than +one year after the cause of action arose. Each party waives its rights +to a jury trial in any resulting litigation. + diff --git a/Engine/lib/sdl/Xcode-iOS/Demos/data/drums/ds_brush_snare.wav b/Engine/lib/sdl/Xcode-iOS/Demos/data/drums/ds_brush_snare.wav new file mode 100644 index 0000000000000000000000000000000000000000..fa752637a0e32359a2339d235d0c069d61f4494d GIT binary patch literal 194604 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 z%0Db@oW=N`duPvc@lxTnuoPfLXHb4qU)2FXYIl)a0(anTzV=XiXv7fQBY_rB2f&O1B@ z>J4uUTMQZ;-R4AFmh%*zvd(yWpqM}5Uf=oRpJQdnD^h8y-9AsBSZl%(u{b;7cViRB zAN~9paDz{$ZcIqQ`^1_`L3cuV%Dx-t zk6elFPx8&PVP~VVkw`fM|HqGi)K(4Yw>dC zhu(SY52xl`) zSg(Wv@KrAqT5`pmUq1hK`dl75Uo-(__F_8giHL|SCh{USxg*?hPV;N$)1LWIz_Wp{ zp=x>>PBcxCN7NJ*fwoeeDuWd$3br;<>MmU-b=~7lzioG4ctINE=cHmn0s0j{{ku zPu?xOL|CMppLHy4+k_(kO64faMvjkL~0pFfbJPI2G-NrkI3 z@Z!&Rq$0RLjG;SfCFKbD^fe_*-Uj_(QMdwH_#G|=dJ|}|C4f7TuPkd9M#G<)OB`-| zntcIH5woBa#^GDWROS*KFAPEPXUp99S>Ndj?{yEWvT&+qXddyBdR=G`k04FxvlJo$ z>o-d+(P{al(D+24TAA`S2W_I)KZOj43f+bz(c^S9mPwbv1ilVkMG$NmilGU#i7X`N zw0F4CHMM$aK-@LvH$IUJL9@}O8*Dbq>5ZmazI_dxfAiMM&wRPKtd6jDa@tbJrjY`3 zBv+uX{5itXdGERG`Q=V>|8%>&?z3>Q!#AP{!XSE2U13HLDlCh=cd@|9{-Y%7MZ$F4 zXza&-&RgzBLt=~R=J9K;L!Eet^vj3cX3brLx&2_#@rw?}J@O8U9Z9 z-tT01z<1BOj$I4G?G4uCus-6l1y`c66#kl!#eeqg2}%A1*~fjpE=2&vrly6!>ykxfe2=0;Js2;IZ84nDLjHlh7cHZx9;SSEd+9+Ra+5)@I6;u7i zx(kn;-y)}|r3*=lO#S~9y?sa&4g2;#JG1k)J3IU8uIrknm)_p`)t^2-`YjA23MEOR zD2z~&BoU=ZLQxDOltM|wFbpXYLlMPL#88w%6vLjRUw-q}%S$i4d|mhbZD!|fXZD%r zZ~szvXU_9Hj^lGAGoN@{br(B6*=)Q6c zszbgAcfmfoT4)Tu4-fisLuw1pR=-BC$S=(Y+xcLDsy+0_Y(3F8Bm z+tQ>TH&4g(l8G_9K({7|P62l1OH-y$P7eZ@E7huDs)!$ zXH$j2r@>-K<5tB6?)U5H1>Jj|>x;4&0Bd96k0ux0fDY55I8cpaa~X z@d2I}+i%P;6vWg)dQBQNE~&i^|4>+RrJ+0YnEnoSO~8A8hn*l( zd;;mZ1Tg-YekXCmc92qWwjuS_zs#}M{@Lh&qtB#bb=qH3kE#N$ICoDzp_$xxK zbdBdd_agX#$qUzn-%`6wEmbVB;aZI(+2a?r>1RJA{)ih-o;25=DJI5ZFVkt7yuBSd zXY*)p;_o+`7hUClSMc8)HXLE6wUuZY(yyJRM$sbgad?L-57eSkk5O6uXEMRO8$IwGuW?-E9?z`&glIPX8bOIrF=GOM94%AiZpOjolh-?~LF`1$-3W^81Ut`kaP87J z?xiNE_+c5+6&VlJM2A6SJJ zLJ#pJaTdM|ofk(H6~Up%MZ1X}+kN6H-Mw+p;mqA1h2D7Ng$22uIGRC6iXNAMYhQ06)G%_eVblW<%DXAiKBJg0&ZN+z^4N$90Ygncx!YP5&poL2fNC*+R zNo1+Ns0iIIp02@^Gx8*SPLX#w6)68bu-CWM^gl19%D-Qv4JxmlzxrQW*{kPC+tUA+ z1~IV}UIfTL&Uan*{XYB&WUI%Q3q-So_m7`KLu8oI>`=mggw_C$-g@A$3gtjaBKpB-|}XdhYz5C~(F zz~AnxOs2>0%H-lbzc7KTkJ*-AZ*wuVR<*5G^TxvRi|WDS8ZPCp=EG-)1%E!^dJeNy zZNg8YjQEHwYu-gcbY9k=8-+WZUJA0Xu)=q-sceVDGxczR;s_g7Efd9BQUw@_gsa3k zPl+(%COuB(wR;9{XKq`Y@x*vttj#zUI}bf3=R=R8CEl^XTl$9Yiej6&rdb15_3N5h z^r8L^vw`T`7s4h-l?(LDJ2vS>?*{;8&f`hIu&PsbU@TycFae%(-JmnQfOAgy+*^~# zBEA3KPSVGBrGJNu;$H+`AY)E8H0gQjE|LAzkN9e;KDx^NjFwA@yhWM|rn5y}yZ=JK z?H&_{15R}nU^Fh0=Zs6nDRr-*NRdJegKw3?#2w5|HtM(F4BaYw53&R%LwSK8&UODq zS$*Gir%@L@31D+rEjurR8ohc~_e5Jm3I+$VsZAEM(RAunWFi2{KEi2V8rvD1;cF=y zN^lkC^XL!T&loypEp8qE9wU2ZanET1JNi$8{qgb8KjZ$nlcmVLU_1sy-MSTZzR7A{ zFkH5-5f98=Af)}xwn6WF4J>#HczfJEC%+;!?nUHrJLHuTj^-iPIbXC~ zY>4bD>J>(C6s`d?;bBmO)*_;!Cs4-Md474n(iT@Q=nuXk=A=G?M$O7JEKOA1L1IvNT=9Z^I2R zRm-q8_?3T$KWD$-PdUmyZu9f|v&f=v!8C$8O)cgPve@z)p3;Ac{>FBpr{GV`7HrYo zC2K%Y;|M$wXF{asD&!6{sWu=m3aX9XeTj5uc|X$!?$<(ocu*=5rj(h|9YTcmG%4yU zvj3dnbK&ves*vUKg*Kf=&s%oeQ=t1Ad7H3c+=_XdFbb#*5B&S|_yJiUEV&o$b6 z45{p|vq^@B2?a^T#;$}fz>>b$JtX!xX5_PUf@2Vd`BqIL)^B;L$KxN`h7HqaDi!#}*Q`t|7L}mFn)Gk6d5DDT-0Q0tRH2i-wETx!@i$ zizLHGazgGqhahUdkxlarc$V2A_XkZeGkhjPGaKuRZ^n(WHxy}VyG#Zsj=qNq!~N2z z>y`YpxpvyhOHRGc7Wrx0)i;{?_&w!0^M}9^IDYK+em{76^xiHVZut70NO(AyEB$1g z*qdmR+KE4cAmRdBt=tZc$x1)VK2VG+8pIX2n;#at<&<+BO7czEvV4g(1F!HZFeRoy z_2Z8W>+kf7|6WM$%#6z+KG=IOXR_Bk7wXNoBy=`4gb~S zeQ?mnRRwz$U?dk$2d!8GI;pq^XUmgloo*aTu(oPh%aqwimYF0)ulfoj0f|&PNAkJM zSD-193AD*Xj?d9=@`g>4=an1y6U|rZ67D$qOvl@y)8Sx|voe}Ty+CWD_tA8;0d}Hh zY!aD3%h5MtKQtL=V;==ydj;jkAY(Z|AI3hjm1xW2lI85)BG!SQ3x5ZX4yyv=do72- z6Y}s}Aj3t=D%h&>y6m^ggL@Oc#WY#)1fOyu<~uzH4zNq~0J_R|s3H8D_)%3LtBr0? zTj08P-cvv?dG3MJ^k;k&Duv5b_2N6_74f220FOk!VySosG^@U#cmk&>o1rB+yQ3F6 zz&rdfk1HnGyDFWOtKCIg(mqS##(kObLZV0gjLm=`rMy zbd1S>kgVy2Fr)eDdM|9a2i)(aEuUNe3c6u_6!VF=X-<(Ys~-E4`9^P=TPLl${kkk* z%*>h^boFrqFmBvozaU0`11otOy(OMi_vUGtYt27>T8dPK?itVHGg_bV6+BKhM)H*c zv(GQ`J>fd2o!?fOlnvyN3L>pUw^H_AhRdSAT-BijyVb?I5>79N4?IEX5<3SC0j0=& z*sMB_S;=xDiEPwe(>&J|>jt$f2^sdHHQEeMixjkvJ3a1C$7B$2wXj3}R_QW3CVSN! zGIuQ-Spqr?Z_p}RuQA=S6=y-8#v}+Mh@4dr^YCxrjw(fUAAW>?5*|Tg)Gz*L@GhO< zC#fIq;=mhMN5b8x;CxMY?&GJgPS+3QxzwGH zl!-ZHscKaFOKZcrv^&guti^qae;2snhoVDtI^GEuktUfQlBw-OoOl}QQP{~PD8q17 z^OP9Sw*sFDh|W`Ngm&p*fNdllSSRF-iu|pf&}?hFjZgJo z<6EqDTXFJTV`5@6`O~ z9(Gq?)$?q9f?IvVI38afoF}2bF1Xcywftw^eS51~`PFAOmEjdu(wc9+bf!~<#||lm zR6&?fwBWtUz6gzUIQO`m!!AenF?S~33MZ=Vp1Lp?F7>8MM^u?u!_QI!jLkda z%M4NO6-8mVR%=4q4EOYj_;X!Oq)Caei_B*h59fzoahAY(xGr*sxkYqBYS}Y8AJ=Hh zFr?dR(0u(kd>1KKb;vpK9J~t7#&5}NyJs?G?wvRr*$I9PzjuA`CY-K0)yL`1YtBYT zC3nr=2CqoB@f@rjYr=Y_)oK8-xujGC`VJ)3umX%woYp9`&fa z+tmJ*zMpss>|6qSotf4;<%{?O>k9GRR;>7>oCG#~gBekSWkkdVUY_-Z-hJRVMEQ{`k-G1I2)mUa@i^eJbWld3Q<{$;og z%HS-%8SG8qv!)G90<8E|IgvfEqM1L6ZD$0Mk28!Wfgo&`3BT0ZX?wI zto@A?YM<)tiaPBmH3Ikpme3FCoZrIDgkH&4ARqckxv!w{C-f|MA@Do=nyC!+M=o&{ zj1U2RP2myuqNg~p=0*f(XjAb}>QY{WB;pf9$NE+0;b`ra9yhK7OyS9(ALpi52 zo`b;1VLklCU#NKtr>Rni-{_v4_iBcp@Ux0n)C=x5yH4#zi@7fBo+4MbufC1t#84r< zCjO+189GWho$(c(Fz?3>K$WE9C z#vxP}FKKnj-(nYxduQT#J4w42m_^TTPjdLVZxt9~65uD`rgRe-rzfNl`W}@X=?HxS zlDR2lO1w-Y!ELCh{wQ={3)GtUh-nDxMEO$-&I%x&4Uqq6M1(a%ALvO%1N;uU(u=O`(s-dm{eQbXvntm!`$rVW>fPbN#;Wz|(nr?KfR*=ggqpVbnl@~f)XAnm&2^^Ftko@1l<8ja0H&B zlJFbOMSGb%xYGTc1p|w|4AMI?wgYLc9 z7wG)i7qN>r{!Av4X-;x=L|<(e*gN*VY_C!05AUPLd@}Tbm~+W{8#Frc#<*1TThmY+gB%$)q6F*#`lSz2 zUbKm|MOs*1RuvQ33}vaf4etXPieWi#{F}WNP7W5Z-via$1mk3iBIPnKL5KDsWhq+& z`8LHzzIy)%=L{9f6Ic^{2`CHwW{&B5K|$byJMb}AN}QKTEAuK$p@YvuRnblLTWC$& zL$s;&y03~%0-^fBPi`~yGQ8=w$Z!6~(hR)j=A~g*p0`7~?CaMf;JcU|{V0}eSZB^b zdBMS;$V_|9(Gt2y_EX9EIbbEytgwoyG6VA+@KiMmTg(>X`&q&4Ia`tRDyAsulA<|g zz;Ok*{r7-fIyP^Ebot?D`dXmbyBnyXAG)6srts_;k!-Vdo&BQydghmMUVojvf(|%k zb-=mgnF1=jC2?sGo7fb$LbRX3s1hvM-sS5%&OMfnnUkTzGRK1b%IP|@OaIJ5;TtVEWR3R|2=8aj*P#2cA1nl>q1be#sm2>>KkSjhNRwXd! z^%m@CB$?jg0hugV6CDfZLJ#>-43~-xSKzzx7YvKGiwPC@ zVtj$;3pTPdL9@^hc#bu5*_J(gEXiYS{^MMVV0)Q*RV~Jk z`?v6$f2uvj>+S3Jk9OCr+}z;}Wj5CbJytrSPh{rRvO%bj^ zX2HoCrGDl+m&z6TQ>f8Uy(o2A>gv_~h&YaU1B z>cN1sVZVC+({c7upR--wSXM(9*j(-2 zn`Bx-P_+4+L<+ZMMDStVEkieUq`wsHQ+I{0fkpI7HVe2LF46gb>DULlCc{n38qy=Z3BbfvV>C?AMBiQ|rTTF52{jE;s$jE;` zEx>aGlI&7}gpRy`*Qs-neEg9#fiS^sY2I}$H04}z)duv=NjXtdYkLe8*&OBpq|n?P zYE{ZROz5uTj??0Q=McmPp{qnK_|^Q5Ota0$SWJLr49eC14lOIjU9agfFXHQG>I2O{ z8rOiWL|*+hgj6-Aql!%wjX_GzZAas=kTF!eRciosrxsCuee6z z9}t6yjfu_H#^fs96I%khqb-eWLd(A6aG3*i%=)NNZ$ww2)%N}>kFJ-#b8tcI8 zY<>z;7kNL?>mkB-Oo=jO=zuB<%>|v2ME0)C7Mqvdl$pY3;68JKvj@BAvS4%YGw?Q4 z5}N}(O1K}Fk6b@vJASSB{Cj1O{PV~EZ}FVp7(<_X9Epf3TlNH9%IwcgKUfPiUA=7Id;5_>b7&edw(VTbL{)^&n=Zer|EOZXH zhiBPts+3&~kzAon+7hEfZtipNjKc9DBjGW5*(g-Ui}u2+82*(2QbmEsgvZ%V*=EW;*IcROxM$;7PD z1U_=w9lqm$Px`pI<6ImJUzOq49yO_I0%x&e_8w5jo|DN<=U9nri~Q#5B0e!!TmbAq zui~yuO$;LW(GO@LB@?Ec%hWIDx~nKs;>j`BiowLU`c%`TsTn+v^5N%P9^EeU)Dk&K zbO3drgsei@s)xu!d=4+i*Rc`20o|8xiG%0|bO0NGlhAclFJy@+MIrsVmJwg6UbypE z;AFy4?0R!@oqp$L#5Vd9SS%5WDS3x|rg-DI#it+IeQzD{r^ZN{_X9Z~wc6Tr594pf zx9A70GW$=(2X1p}*QOJqX6*;yEN#P^kWK8WOqxv~O3*6x9i>nG|1{x3=7BgWy8v2c zlK1DBOzfL=$<$>|vi9rx%;V7nU5WER?AhD1gMTmXG#w=U^&_O)e~&d&O_ndJLR*7% z*6`Ri1gGocrFYPguq3SU1?)$DH|*d#xlQ_lXblVsU+I?cgd&fXoncW%xFwNn6`dnl zLygFykfobP=FYSmGLw%J)w;@LiO$pgw*O>*?YFu0$9lVi$#>1G`o+uYDT0m~v4zMT z{yTJ$HRFxocg(HM26M@KOd`@5ddtjmqk*|-Ged)wVikH{(T7eW-=G0Rhmv41*{iH3 zNOdRl6`POt$UJ{c62**YE&Y~X4&IP;+<%Is_eW+K23o`>%!l6ORcHUnOLl`_0FRpNIjg zOlZ`BAq!l6p!W+WFLu?y#p9GXzoIg^Az>xP_Ag2rxAeKL00Z__59FV6#xq61N0DA; z0nHXD(-HK@+OJ8_PieQLuV}OPB9~$Jcq?ej0|(!tOENbjQAogO;e!c)Zktz0 zGn%Gt4y*y?$BDiz&v|h)O;C;7=xrA~?w?qZa6{jWTsDnrX3!e#OUkdP^BaAixEa?A zFd?i*8bCjotX`HdwNqS&$HZ@nN77@tl_EF#E7}~Dn-d~XD2rNVYJ7bl8|v1|#1dN% z-eo(mRDD?*h>uYdtFCe)XpJE9EBfS`!s&5-)bcat&NOR_01=SN4Wxj z5zx*(<7*{-_&M{QD-Y?EV{CyT1DP}>nRif!#V4ew3YkyhlVCg3;JxF&6%w7FIjg@y zXka!J^ZdBF4m{G{Bd(Bbx-!J6*%TI)^XxI-qQLk9ZK<-(l%_B z?h1WZ7`As(KV9ceSAfgj2K53+$%LOG=`uKpCPpu6_42KMnoPles*05#l(oPZu*~L3 zd9DlLl7D{Kul_Ukccz#AryIN*x@}CxzsI*&TCLa5oFj~}=YeKoOYlIq`3%KvIg@|q zq$@ObyniynT(VQ@V|Kt;pt8pl$#2BxnzzJ}x;r|njAtJRh0H8dDrfo97&7ufY!T-b z4A_QEDan{7?3s=<*jZcyxgK)ue%Rl|SA{X?SYotUaD40=&7dC8Ex`gh!=^=(+|Oyx z=_A*C;ES_Yl;~vTxcoa&C`Pp78x~%j`|mvSR#JV+T|O;d{QWHa>(}~!CXOF%=$Hh@ zl=Oziq#E8%J>f?@>mhsiySG}i#5SC*BrpD9Jo_@{X7YE%jhL%}DX8D!qxsWLZ@xF* zbwSbSeP@dY)06G-KU80n4!obRoYRkH^M@j^zMUSdf-d`kbr-sy%cs02cxegzD zl4;oU=46I{>9`3lb1Q&eVO1G1{UFUQi5_m z`WR@9P6CZmu9O9S`-fJ6*|~1N9k_ScjZ@67_7`zihif~{M?^yGwys8h zLtlj*t8qZi^@L#H{^=}L8w8yz_|MRFT_b*1fs;=IE8-6_IUH3~q~rXrX6uDw>6r zscgVS*c~b1d$|Jom5&I0am;$_=%6oCwIf|O8w~?7=i+8GZ8D>73ElJDXY-Gp_Qy>7 z(V{%F2{B!UQJgRhE3DYIl%dE1;-wj7e)Kx}1Kh+Kp>aG1YQRm(FG?FCgqOi}dn)~2 z&IvU*FCDgV*Stf@QXm6+uFfJ02uqw>YmF<9dk4EM?fw+-<*CItZx@_Lu5@n+^M%5Y z8F>TDQ$Ha($qUMS)E6BQZ$e2j>2U-e;L6e4!43Hdkw9BNC$75bujAbkY;g0~{AcG7QiUpToaCAoj9-piDaeXNVR2MswW zs?uZiv`3pm77LE-r(Uw%O}w6(jhu@UT{541KX{tz*x#QGr?`6fqi{iJkp1Nj`dgWI z9xUdYRQtckv%mj)_Pjs2`oD8zuSltPMX(%yJ-&bZLOcJjdQ8>Z2Q`AhvESHGs&9c9y>hLhKiQhPxZ7jNVc7VK1;`&8n;< zWBOs=cg5_!SJ^ZnNzhXveE0nHz)j;6=hJk(#xW+?$w_eM5YcP`d9Irv5%U0ROqO-?B5dU+(DJet>;F{cih? z`Az$A16ZGaO661LXwtA6#YNQyH7e?Zbl`=YM_+K3`k&ahoP}JLBPesuBjCxx9n4=&apw^h0x8bVJdPC zvnz*@9z=)SfYYTPFc{vDmYLg3AzQ$}To=`#($hm{^RSyqw-YaEr_bI3FX`Hp*~ z7G*y62<_tsmFJJ9+06C)qwMYMjcdWtJs3`9%myB5j(aIzR&3@MihlAA*A6}xo{1Uq z6E!t{2A?=P7q?~ll<)wu#(ed*BYE4^L2!-yJNQ4kwZ+}7|G5~<{ihv&M_o)fz$gDb z5|@>7C%MLSa7I#;>Ym7y4#xR}y6!XiTBMuQnsEX$#Wz_!>h+{Wwo5k?e9w>g=6$z( z>-JHh`J@IJrbeUnit3^jKYDN2!6OW z(RSlg8je=@?SULuo$Imp-s!_gr>{lkvgu=T)L+kBF+Dw-YrAFh#XTXaWVaJ2-+}Eu zwYT;3oct8k3%%hX&<4a~J@}5=qMOug8ZThKjQ50#>c`#>g6PlnTmd?~bFwpdP4Q zlF5HBO*LV?CdYn`-Sec`H-THu9_0$x%C$;!d^gvn1c8Ub13b;qF4j9{olCUOSq*%r zt-1;zKRM0NlTw>nue*^p8k#q599MFyo*d76p*#2sGV?b4D6*o-1Xk3m%2b6LoMZdB z(XfSn={1IHjuX5PC7k3K?A%6tR@{`fIi&;aHka~Fc?O9W3;xV-EpAZ%xg45V8;M_V zjs355H54@Sum6N-^`{C8o0wPVA&{XNyRJ7rF%(VWl`C0r! zAjx*kc@L_vXSmnh^hx#cz0=@!)9#c<+PrQ^^MR>PVy;=;sfCK3*tL*ZR`Tm8Bg;}B z{jDL7=ZpJ*hWs{hS!x7(@E7V?jU{G5KNOoAv#!w#mtGX~IK0Js&JSd_v{+il@_l=uP zZ0jBq^Nub0qc-MEZ1366&@+=y=E>G8TA3u(k7x?qie>X#&@J(p8&TQB4b?XKRI(vi z{$~Pz_{cwXnsl0^==Qf+?D&lB@tGuj`I!W8Nte&T;1l+M-J`G5W*_0Tx*bPH{>3AR zxB99T?U6_DTe%PF1~G;9XiCY8gbl&R$?|4e7kuS? z5MA|MQ8$Qh)Qwm*nT}1z-6aMR6XVhhFB2MQxAy9vbjY|~@Yics)|Lkz@Hc6BT-I-l z^T9#%x|}AuPl5bCd0ANuJ zMjMHj*fL=?X29dxWd#Vu1Hbs^;zj0#cpN@2W^vZY2i7j%P%f)8#7ff@^{AGxTvvQD z_4(K2&(>qAefRMZ<^_))L_6p#xDFXcDeV8{b6=wc${*04RH`Zv$4!Z7qIt!*LyX7l zDyP-Qif8idunF9853}bT1MVDZ$e9M*q)b3v51usk<>iY4FHq)Z}yU$#{a>*_BRLiDWgXZdQj2#SF5-O3BE>`S9-I}qgWsoN^n%QcNM=6s-`QOD zqujkyAhpU}T@ND<;D+b`@=kGE+>6%wbE$`c@AiG}soNqZ@{ge^(61X)+hZBi0-+f0BOp~Ja!*?nT0tJT8-q08>73R>;hK~p z{L8-!ZHX}hXD5Rxhq_gjL z3QjG%z~2Zpcl1&HLi}Yk87ziuV;kwj%T>d-SQB@3xO)% zujpjBT2lx=(U0mLsE+l+&>MU`ny*X`-&16Vrov8TX0X--DxP6^#JX1>eSBErc;{+4 zWW!H=Yuv6-F5Z?lG(Etrvk98MGuzg9j52mG6^d%Qh1rue?pJcoE{86L_vm_Hj^_Ca zxdp|dv+)hqEn#j@D4@@0y0rF$c z<2d=qa8LNIN(~h8Ak`DFvODypkVEM9%&|_dFVxA^(M9TKk}iIl=t~x@WZaK4o5+^I z9KInv@aFsW9s8~vSG!x}S^_yF5>1o8aZ}0;Le{FHlu*MA!_|@*Tf#kfyk?$cNCqD^ z=)gSUsqzYV4!)_#=ATPPp5@?ecbdb`Ot=crb*=`rVgNsY-j#W10Jfln(KN$Hep>y8 zeJ;1zmec*=4*Fi0_jQ4@fd=Jy1s`-OuXxg^ds4gayXFP(lU&yTC`mjAzJl+;^P&%b zq%a#=H_)6d+ ze@&VWcL?u%kHY6Ywf?Lq75EhY0cp>Wl4j%6{!0&cS#Pi=U_H(c{e~=Z1tN(&OnY?poa~J_PrgWA5eIc2 ze0Rhy$D>2W4jt{=uO45aF1R!Bf@oUoplLT|H6a!K7~_#>U>S&KrlXGqT&CHK zNrREMstOP{6l;czb2>ynt|7r8^oP5PJvwf)?*{Tt&Pi@66|gEGq#N2c{8HUF{EG2M zpX=0~OrhBM((xkv!x68nWC}KD1iC2HA@jkyg%9DR(0!Tfw@PnE6Zl)&1?-1$+teo$9*(eeaub?@Z!5lvjQpm3 ziskVg=u5fXc1+n6nT-}AdElZZNApZot6PQ}(3L0*lm z9?Ch0%h4mgC~{jlFZX7S;OUAKWiGJ66HqhP3ceL(!iTskVZ1sDa|s;GUG_hvvRT0Q zEq0dQ{@>;^x6-=)dzz#E^ic?9rWOqzy|I6BQhy%+=iRBgFUU(>Ud${~X8ahwgpImN+25|)9wc1g z$$=iTYnV(rBbUiM6CRVPu8dXlj;! zkUJQo?JAj+jP&AH;cRSMwBoD&A@GU+n0lgk9(=358@-3Ug3IvF;8%60Oe-73t${^p z-J22c@GJfdbW!S85*nD>#+vWvew?egSg) z`Rrs^M>`{a$s*o^cfsort!|WCo`WhJF7&|D ze`-?d-4D;4SN@3Gw^53BF=A*%?wqX&yqAJ}ytJw)RM3hq$bB>(WyvDt5;+>(LtA7I zQnu`@hzFjzA=N?Xys-fsjrnM}t;@6RLSwPd{Cg_$Fr9XuX4(beqGwFi38WztB;&6} z-yJM_Q(doiD;2^CrSnONx;*}+83XGc4e?sIs8T#N4*5W~-uHFCcmEO+I_gERaWX+eA=7R<_|SKt1LW)etYejFtc;K$*Nla@$7c zahyHXla{7!N}Ob$V@=-MfwItf`<7JZ&A={+ZaK>`!d$~{xXOk3_AFI-d8f+iRfy((*0j8bwd`KPEvCqTP$VINp@)Vi26TSldF6sbt~ag&q6C-500Chg_oi65YkRju$lq!e`kuOSxrN+*anyjOy$)Q;~ONb(zGJO0REGA*mG$1KwT zac6%t)OuL`Ppy+Yl9dz36AE(-V^>1vSUb94E46N#pC>-ir&tR$cgW|_V)&ZtcX;+h zCZbV;P73%XZ7S{&7o~RmGti|dL8cXnXeC^N#rz-%ys-n}_s(DL%y6l15%|Fl$=%Uq{!ww=-|i*w3x33Q zSyg5#iQiQgnpkNUs)bUeN!5ACMm|&369bw-q)QD;@087Kg`j8q!qxOFQ|3AjCm-MU z{s^v~wyS8$Ci_39WQMLzYEqOdyTm!I8*SFxVoHz&6Dt#a(m0UYmRSWsD#+0CXRus_ z%RQ@tN>U^c6^eA|F1D$dfg52`&YoPgQ~r;qHK(t+CErtg984xJ=)QcGO zl-=j_+zRIo*G8@dVfJ(ArLRi*?XAZd?k?Vmuo8(5@=)ZX+;a1YFp9mZCAbHUN0+cp zG?{ow=7SfECG@E386*4nqRq-ZnZT6B7!^-NEPRUyvgZvH^co#SK2mD&&B;A)%4y?K zAvfp%Rh5x_5+U+2UQ3E?_&L5%(nSH;k@y_|*mIys?!kPH9?=u#RLr53!nn)h zS`5scU{Im=xw$=BakkJnVL3Rv1psGWcn8pLJ|_5468#(CjR+*zBQN+OYCO6?Gt#5T z6xSCy3fFT-vg_(Iv@a&9J#tTSmHHOkg4v*Zie|7uZVJAn81)kzOpgYBMAXa_zbswm zeuNedT%JeH_+PSzNw+J7|bJ#})lv!xN6%v6aj62$U zBpU-M&Bk5IuOdz_3iiVU_tYVM0y^{TCBlSf6?-P;;A7}Gwhg@{mw_zH1U3?@HZ!W5 z)?x0ks)AbJzOx&QDN-bN6!06mN@!2O`?i2|QtFw(~`aGC?*^4(uN#o<=(B0y7D)i(f-VM>!6 zw`lns_u=dwTyu8ov5KXX<+PN@$l=Z^Uw8A z$Nmk`>Gxrs5`HFCYf1+GRiSQ7dmDs^Cx=a;jBWF2(YCm6KECqL2s2^7i(KNY>O|xw zVZu_0R20@NAfIAnudc2|XG4e7-_i5RYovt8TwhHJ1K``PMWNVni@JR}73g&5dF!It z{`=M-Q1Gv9OHa~B(pTMg+c6VQ_?@NU_f(;KJ2FZ=Vw3sw@Dh{4T=>5fy?sa&ZQuVt zJG1k&GyA;mYI^FamtNj>CrT(vQHWwFMHosUg;E%y6p9o^QAnXEh8RjAMWQHCD26CW zVT6(xhU72N+fz?XQ`cShadu|sX=mnleE$teSa)WQ`F!5**Gqa1Qg8{}JP-DNg5NN! zrP?a>-{U}|$PVap)@m@58v&-Ga;k>2sz{(VG+aGvSlcz3^ac!k5H$hC2^|YsFi|T?}uCN+8KT%kTfsw&OwOM0Smcc#Xn6lP|9JEIzKcQKkBnF0 z>O|kMo|M~ZeTmH9`*c>q8)cl_mLA8_;Ih~gGELut6&bz&gFxY4UwCZ)&hL`&y`8uG zfWJ@t5WNE}N-;6iOpmoYzWV~Y!!jn`pc-QoD z9_A+x`Aeb1&|`8}ZZw`SRGFq65AlZympIJgI0%Z|pLXv%FY3u)yZoo&<_K%c(3tqg zrd89p{e*gwEawY_a_DKe%g9O|YYsV!pEEB=-Jm&OS3e+mx>}gR5!MPf{(c)C{%7U) zwCBd}N#tHwiho78k9~@NU}l{s(C5^Sa2!tZZ*k9q?xQ57Fq}s}(h3t+jf2j#V+Fb= z&f##bj);6@v%#Hc2W`@&Q6{`o@5BnV4CM=)AQmBu>att~XGtG51$f0ynk**X;Ihi< zcfBRN%sg~=>=n4>t+Ft;mjwu|3^AkcFee(nnqOKjL&uG9pik}$o;q59FNa(0`#9$a z#j8etLL!Mcz7zH43?hr>#gl0BpWN`(?Kl72j@xZ@Wf!B(%fqBSrd=x7 zNOJr7%@C@D{5~$pHy12rZu%bR2AL1$5VW3lG zz(LuQZpL0IjncT*ueHWJ+PrR78Z|8`w``kOHNoOT(s3<2c$GWn+YVfhHiWw|ue$FD znuc86$2y6PgdO%VkrlWSA-O9@t5PO29Q`apkrSf84~qTjV{H{uVJ`MV_mQbm7=IP( z5M7}TyhUs=IMC;~fHfJC(Br@hQ;9z^&uM3f1^B$`!W`PBHV)_VlKM;T6Wg&LnhNKT zmsmSy@np*nJ)Pl_XjAYZ_CfHNZ=>0EufbuzZ1`yYf@20ue-l~JGJz539_TK=))MhS z^*Fg3YbH^)2tDm{M^7?tPo~mxgz7FtWc@|aW%22s$0a#$8?XE|gb0pa`4PTx1o7Lu zdB69=kJh@8TyHBjpguryfLmk*<+(bD6q@)7tWhNBG{Zxs!Y%|;iQxzr>(`%$ObM`g z=Wo;B4_z

gZ-Wf-E2pSeie1RC8z#T-bdbx#X^9t$q}o(VXxM*X*bvUL|}=$spP@ z9*fVcl#Ya^4Hu9xy$3Ih-qFs7rb4yShPM=MW8JDO7ilHHZuTbTlCP=_?69DQbEAF1 zuY4Zg9sNo4D;u_LYSw<)VlfpP`{7!=P25wPqKjg$P$#Bq6VfdrPZ6wn$WmOlQJ{0; zo{Mc3V4H`={CxC2H!ogL`(rM$S&;#i{$>nQr`dMa9-Ry?@PpAT@GUuM1d9|)Z`@7n zhux&h0{ZKZ%C@ma%K|eQ0WBj_m0rA%?L%M>CoS$g3UY@v-T~RcWZ;_`iNX3B-6cRf z{~?S*-=i70Aga_?E!|>4$E{Z>m$Am^M=s#`97t8Wf3mIaN`E)|C0Iwik%Nw>^q6fi z4x#;)T!bJyKv#Vua*cn+r?Cp3!dLP=LXDa!j#A)c;al17%t zdzCr5kDJxz{nlvE%lJ!$m5kN&Uge}|Dcje$HQQXmxS`1P7W!fw5$?k<`$#y+q%x10 zbHNkBL?Bb0W9GF4K21L^KE+#ge)$Vt=;y${rf~yAuX;LR)h5U1{Iza3xpG}U%>7Pa z!$K>qIoxCId89lz$L;&yFptAde<+;cm4o@dwg3V+R*#e>?l?ZCE@4hg0SvK6{5~(> zkAydlQF`7|aO|tu=d5x1Qygr0l5`4hn{XiG}L zC1L?fwY6y%EH|YYSi$Hv%?mhWVv>8rhqIB$W-m*gqxt3koDOr!7?IiS=+ zSfcI_JZlNCiDZ+*C5}gPOs6#05>zR}l zVN<;<2IbF+OKno$qCH4DN*Y?wHtdS=xW0|*$KS_Bb=3?Xc^@$aFu@e5k`&3S=D_cu zdxme)bt;XU1yAkItVgY7?7GV`uZ}`j$t4JKWg5moo;n5lWxXZOqN!p>>`Sy#{K9ob zx1x#B8;mJh0BDqMvCV%Mwea&M1|=+y?B}WH@h?!`c~;8<=>Q(C)%A*RwO-+gxX*7! zCAJk9Yp3)p>Sxf3WkBjBo1(yzu9tX%o<#n#anf77f}e_cL%)RE`(zOFRqd>46^AK? zQS~F~G!?6Dwk%H{e&XNGAhkcZUC25AoI|9*uI-%!r~Nck{%195D?a%@s$(jdbTJX3->q)&C&@{%)Vix)Fw*);xCG|FZoCX4 z5mHwO=;?#F3?YEjWzywqmvm`jBis}!j(y^$!+tcKdraR%&LermqI6en(dvav&|M`p z7TbU>!Jo)IT|VW(Zz75KdFZmn0k7XG>sD0n!|=HXcX$rD8@X%pz}2P!8r9!3-jR#3 za`v7!<-5zTMJj?xL>?#dI~%Noo29QrL1Tj zHV5w@Te0L=hOU+k8Xic+R65~6OUx`J82-$>?*=%DoSK5BT=S_@}=gnO(uG)F+09|2>tw zl%4RutH<2gPedZ2<98GHdUNHUS#ReW5(CF=I7erNKN>hZkpj|qa~_otHze#B`MoMW zp+1z@OV*}LIwp(_2~VUn>xxi@m1vLPLHW5> z7FuU79g&CozV<(5;gbDlO52fS8Tnd%wSV6T=UA|vRDR+2%3+p&_Rue8hF9@f zzB}T$tF(*E4pJI2hi|&%>@P4a*-J|$}k(t1IB%4bHW|r?% z6YZcfNydN@#acDavh(6?@kF3ZZVO)khJzO0kiU?5>U*QqvJm=1^$->4dE$)WyOwL% zj&0~h&QObjlqrRW9B%s5GmmH*)Fz9K|qACSe=HG ziCNBsE+2)Wd7)3fS#WmbNh_9z_~~Epl0KJ4kt>#u2F$>j09}@>;BUlI})MZlOv|?z;K$hP(4?(OlnI{6fFAlSky@tJJ+BRWFH>7$ zGF?l&(?6pJ_4C9v>La;=bJJ+?>rO&-%z>VvbF`(aGl>tH?~aQ`;2MO$;a(?@Fr zCM|=WORk}om?Sf44lp2xT{CgFk_L{wbJoSbMEZ@7Lj&^3qc{FsrqXvU_KkfaPpV5t z?drGP#t2A=2G4-XPp758^psw*fSn%6bG7n*^o%crwj8~(De_6j8M?vp#-@NtPM<#C za#?#wC$OXXp}nWP6^2VFMYS3)T66G4+ZOJltFUDXR&#-^tXyJn zf&XAD03IZ_jiNZa1QOE^nUs?&d-u?GL$G7@FOzfXeqL%{SOj zwioCH;*@bz*d^_OX5FRWlzdKj1Kz&}b;U?4#6$0;9QZ|aS-%uxl@|Rek<;EGjY>7q zO3I;8x^pc*@^-g;;}p^8&PY$ebF<2i6{lK~vf>5jB%N=|6o(8i4+~60gsS4g|wN@&=>Uu zj#8=IKq-Rijpb{Xg*;%xbqH4RNpxIZXDRUAXt%W^d2!puN=v!58+&h-`5yACe^$Z# z8SG{MT5usU=Jlh6fpfMc4Ky(6Z2mMp82$?0A-_nw#BFHY{)TvJ`eCy`!}J4TNxdTV@%Lk$Qjk-$`+<+K zFU&G`NjJf-m|I~mKQnscS1nxpl6BcyZ4)q)aY3Fz(t|Grr)S*P?J4rCc=@B5a9Z$@ z_EhLMHRE^f^Y$Wa+u9px)N+AOpiNlx4T0`Snrgwyge>G6@)GK^7SO*8s_i>SOYBB2 zdApQH2MsvMezib|kdSI0urK}Hp;aU<^HW4m>^xipw)E`&vuN?&;LhpD%YOuH^`ODh zrq)rFRv-Gw@s*snHd{KZls&^rnkn-W_%-lT$m&Di{oqve@sST+5*pzteT&qlYmKxC zW1;o%b?%P;hORDHK-`gA-~s)<@(AkD%_&w$(I;_@gwJ0EGtqIS!{Efef_=@txgl=I zyovQW>eNT}aorWF9&6StI2u{jJ@C~F*L;g%Is7RE7_(6#25eG_Hci&JA-!tA(MZpC)(4&xBM z;i%&BXp4VcPWI1-n1J7Vi!mKuS1P?XjS8O-=ceCV?#5rHG95fULx! zy2HQW=G6Bhgyd=Wb)TUElv5gwqwo;9N(Pk)!?VcZp=?86nYo!OPf#3|vLkPOT(vQ`vH)0b<@x@%-BQAfOvJ4vrQ zD3?SxyUNLLmP++G(dXybc6Zt~7i`=Z5x#?s##51Ez|4s)mw$k_qf5pG%xy2T{vbx| zlC*)|7G8+e>NBZj+wE`%TF(p8Q}64@)x9!rW$3xbucHK+IH8|3bi*~4G~Ihkr@;ZA zu-=R`l1~^_TLSLu0cM-O5w!%)LKVSe{ie95m161uM zRngX1F;~W22cP$^(D+f8oO4u(ws7avw`wc5D>NauBU>&?KWaOkP%5jA)sROUi46gF zM@3AEvtX~|zkyWHS^E_`m(WRGjbDrMrndiMP;oG|X*S_h0>I}}* z=D&{96-i&UY73|TNSomHxDAij*s(PR@+!NO-U$8#e z8jp7Z z=*3R^(qgOb#K67a@uSgbUgW*{jAxAQ*me7+fiONd%cf+iH|~{LFh7eUbazab1UK|p zUX{N=>(DQ?SU=7cYSe+11^Dc}qJQ7~v%-Ge?IpXT81RKR;kg>5_C(*SpV>|0G*tBW z{e-&;Q%Vf3UB3?v7|>Iq_C9H@qc+Gv;w6DUCU2 znAt7jp8V_B^Ka*GoOaLuvnMjUv~yqdWF#ec{(}C;hYuw^iMnB@kQJoWGr;Ov6HPq4 z8M=4i^Soxh2dj`%P_Icg=GrT)r|e~xyS7)BTjorAKdf4=hfw(OL0@3VGqS%OkqhgK2%(oX8%Za6uaKE~5U@!7x(RT@!aWA2H_@vSD$ z&~Ig@IQ+_81@DPJseHpD%T;TlkQmw#@M3he)KA6Qg^^@$ez9# zD>LxKDN?nZ#_t`QqS#~i9Cr*KSEBjq{AnaWDlM{ToQ(~l#b~2~X z@r<&RGvvMGyTL@%2Uybz=L=kr_l4VHn+l9XYN_%z)~*{9bMPXGGmgN`RFh?z|LR!V zo6xuK^nt6>aWE()?aS0=_@ea-(qZi~tUBhXUdNjCp2_E$1QV+&-5sl-V%UgYRWq<8 z{g}+)%S^wT$d&-9##4VOPB3eR6KW3hLN7-^BRf3H_6aciT^m%Um4|w()~TH!o~pBC z7O=1O;jh7z;j9K2vTy-p*Ct_>Ur>A4NmM59yi%Q*@pB z)99t%Xm?CIelW}Qj0Vypsh$SyI&(`ORQ>vD{Uf{>`;IOcZcA1}O?X==Q{OVViJ1E9 zf6|Xh#|AScBsGy$6L6Z`)>oltjl*n-{*2!hE()DI;)9t%OVIB-FMjn7A|>1dcmlLS zixdbawN0v@Y&4MIv~h~AlP9(;TKEvFW z@E-r+cC9}6b=q)bItkom}%wj*5&f8dt_$$_8TxzL#KiO&&N_@~kpu1QSezKV-n z8}vrnCkeE`?lkwsdEzQfv-T$j!te-mCUT9O>Ah5Gs@m?2!M}F*<&CQC5s$;u!taGo zfp^Va*LkwqR&8@ps-eV+V#6Ta+Geb?rP6+apzou*dItUlb{IVH$P@Tc`;5oPF{ ze+6^%dDII2S_3SgV20A_PVzH;_a9Fz<7kS?Q6@}ZjKA<)OOs)cd}6Byysk0JHZqPk z#O}y1rR&iTV879h))Na*y_pqOh%b>{Wjd72&4!g=pEwt8)qj(7$TFPLGo%|Tg$2y2 zf(aBnfP6%%IIrjk@xD~0J;0H}@F~ESduZ^QyMUADIH1U`N^1~kipe#e%UpZpSwuB` zfUcy?ITw>!Qwp&~dsdiLOTFEJ6o2ATdDs_ZBJbEbHi;_|v%)K6Ka-JE4~G(G<4p7o z=QOg2bHqHnLM$6Ra;~9-d7+F32KYJOWOO||7d{&s4hT9qjB59zSJYNv0pHa!EU5V= zG3Q*4WEe_4w<15;V&7A&TmE1kp*O6lwh`-yrNBH6tSobe0xkvIQ&%J7N~&^AapH|& zr@5jbM2M|JX7-vRul}@ePl+f0rNG8y-1*4@8cfG9W!lR4r!?MoGk8nu^IeWFkW2nk zVeU=1=_&&`N}A14tB4%ZG*T;aFYhBykf*&>OZ_Y6jg9o7GLjThb2Ir|g(Y zu_ar#;e~75_}Ki?w4)a3Gno|r!oh>k%dJzM(Sr&=zW0W{8&dS=foZwa;xJ(#f1d@M z^xw5)vR2L_N#zSN0Vlv~z-qdnO-pCAxo{@fqL(9Yl_JGX0yY5d3+>3opqsh{Q9P{! z-2(NcHm|mVHo_?Jkt_n+6Ux*}AjVdB0RIq`Sh5cn}4*@wWUvdYnnE}5!h6xkf=f+0_4 z6b|+J7PXfkkCsEi33G}2Mn16^n!z5ba-BH3@7`1%I2g zJ*zvkDNHgR&)aB&-xq<|`|KJwEzwdoigyhD4w?|=MPj-?)kY);*F;tLxYSKu7i z@6b77lYCuJL9VZe*+ER;4MRp>;5B%mZGv*eVC0rbj$t`^);sm zx3Mbas`)M1MUPlG_$>V{`cVDsbq3cDy$6=)vTqHuC^P0yh7c7re~2X+0C!fbJjg%j zi%#wgInb#5-=}e(jycmiWRIQoT;WcI?j0`0Qn+hK4<+u<)k-SPzJ<9Mh+t5lPKTz+#+lFVrx0RVA%#H=exEw;iRF@mjcLQyt`T{IAGo8a$Ui1)31eZ%B`?FaynAaxMEkLtnRHc z4c*XM;cc;;^on&LIa(x~KraPODo&1(8=)nfM;6Ry;4fqYIV8bZMU>ACPvvFS>%XMGHcm`eAPewFkKK$Mut7&frSiO+b!i{(Tdd5=H|g z96TsIyv^SKQ)WCJNld6WY#JUr8pNPMVaj1PP!HvJD#X5h>Bw|=W2cF2-d)0{Baa>L z>Dstg@gE#5w%g9HhRnEMh5^$ZbC>$WdK}zml7&lZg3ha76j$(P%z(Hn&Ibu}Pq>M# zV-qqkarhN^@u=r$fxUD1Bo+)jh0kzv*j4o!b`2XqAD|O}T1A+ zZ9K_5EoPYO!r4$>EIm?=Ulevhrz?$NrQxH>@aNF0P?MO&ujo?ba)VvDVETaECLP9o zD93UOOa(qDZlpn^wK{&9%h#8N3LFjcb=wFzuRX(`2S%i1@3Tl|#1kFVUjh5RG}Dx` z$XQ4DtasTw-D}TaVBSA{Fe8-)NTgQng0Ll23eg^T8AF%tbQ>I(T>Js|N#JC*r zm-4b0>+_S$*`v(Rsqppi6rU0;iBrPMyu(TpJI%dhUo(yVRX#f~6cf0YNV@WlTEmaq+igEx`|&f@(S#=5J*y*7 z2%p$Cg)_I2{atqWaLxErO)^(os-S+{5o_o2fx6LTUO=9j{H6v&v9TU6MO%BP*?kB)I=e3;58Qk>NoND`D6-4m+V3gK1gE|)LX2R~Zw3C|J>EVqnOqm*;M%C3MPv84)7G_HFcn^}78lx^BEI1$C#xfMLx^Y=Zu_vTI193GAzR2h7Qj zLo>R^{DRyS%n5#Bt{)=&gP@z6;eLr%xO2p)6mo&zkc`9^9=nq?W?qR;Mk~$rfL+q! zW0{^mBY!5nTiZ*JDR|bkO#ln_vE!Cp=Se)BDAise7sC|HdjzpDyc{i89;?$@2C77d z)b>zzpi4M=(27|i7Q6>^{x8x$v@v+xb`idpPylvkPpxedgtYVB{JeNv><}NTg^H{S zXh_S)(~u681Cyw2-Wz%zPEjV=Jm>=KVCrGFe>L1L$$=XEN9`H5K|eL0G2c&Ga8xAD z9m_YqwzX(ex(Uh3t!hh5w|+qyg);STqz|}L5>N!B|4&L~(te;e+~&@4t49y^XT^`f z26G8il77aarr%0GX(Q6=bf>Jfz&ZL}-cT>f-GHRJ6Fu|0(RcdagzaaMq2G(cTJ*Vi2b=`Y=(}`&&`-$0 zAYzi}QdRgBBeP}xPac+;^7_@!(O<|kqQIGW9&wYrPR`o1p>jta_&odZAIe2|QCG}d zR=wem+!XSWuQpHUczq?pGIiX?Nd93iKFf5)&6yJ{{C~=o)|7<+L%#KIMX&iAg0g$z z&>Ikbrz00U?=8*R1N#Zk4obF7;w@%I+DFdFzxYymT)rMJ7;CIq&K~q3oeL$RFI5_y zkTc;6p*ksR%k3Lm|GrriEZcyLSHtT`Ge&1(%3qb1xx{+>iX{W9!dT)4I)I(Re~6H- z(AySCa6k6sglT`0FeOrar*b^j6dg9ajh5J_fn8+LJg9s(EsF0@Nh4rbXF@&-2}&h< zFI=uVgN;&rM6iOBssVe`I*pesRdw~t@(E4wT#FJ zcUC&VSO5jB939px(g?B6W<#H(E+G|lNDg`c{zW~Zdh~PjD4?-4M&C%>q?PPO9$;lu zpV*6rm|Og+_AP9(&1kLGdUHLJO;-ZmWK|TAh**-m2Rz2x;tlO#bX?jDmxxesi^IZ= z%qaIIoEf{pxU{p;G-yd=h^Lz5OfeBjjel+0Cz88N-|Rl?D^n*`WO4G}vD16smh<)JCS=8?vmDmTQ6kSs$%;$(@>alH2-vsF39{m_nh@^{O z)KA_)W@q#Ke(Arv8}A~_&Lir$v}H$4owf~gr)kO1fUn?pV-~=BcmokC2_Ue54216c}Y8)mk^h+E}f^=&XDtpkE(yHQ66){Jel}&-;g7>K0-y7TX!Pd9x zyEu>ajG@ettrQW@qPOK-ZV7P1ouQscBX}O)_if3}$VI~d+-T2^YsVc)t>Fgh@ljL6 zFFy<1ww{FQor%s-K)M-KUs#;nTVQXkJaPtRe!C+VeyiHRkxF-|ryUs<(uldzpi$$H z@BjuxTa}91B|BaqK673{Y7;9h!|_tW1MALTxoC0x6Y&B8MSQ?5GVK$NI{(xL)_>>l zbM75@G&+qSxT;OjBgB+3Bkql3-d640fr^Nq%q4c5=?y#!cJb=YYyR=}Ij=MP%x%$i zMX#gzuwbB(SxY`(xaSfHmUqM;wMb!F$S}{JhJFeHNOmTics(C!Bwv`XB5x@3X(}{!x6;zF#H7F31_ z;3-)|DN8op?E+ro`1e%4>k3(7{AAdY9-_`rlIUdH*a^ukZHs-tnC@2y71N6KX?Pi| z(3#>i*%kSsbxJ*g2l*@#SdZk`1e3>S-#U zvnUU_d!ZoeXM9!&9jBV@C)IZIXtWeg3Kxol2fa+wR{vr8@6uiG!H)xfqtWt-a zU(6$>q_{H(LjFQNDd$X1^}9nwUmGlBo_b1q0~#zpB=DJplC?A5-so*#YS1gr`F>f; zxzCv|sG{TR>DQfT&RykP`nkwk%eUw@;)|YDi~N0&#)B8Y9+a~lG$BW>zi%1N9$QR$ zqm3ne`>i53{<#25aQ^M<>I>gz{JCfa_J#qc(>&yG$KTZ-kGC-AvBc16rds$Ix+YDE zj6%qn1~^tnmm=BnDP3*gP3WuG<9SQ;O1E*2tVJMv4FNf1_zZbg_tbbC{!Y7L2(tr# z5SZgee??chJIp)I&-Dn^au%T673n6(BK;n<1X?)bSfjcQSc%2j90b7^u^dVwr%i8- zA5FguiRKG%6_`V%s|i9f`;*@e?uSE6!(MfGdH1S&oTU%Jj9gqdml^zEzIDa&i>|b% znAYr=?YzluJq@oJUIsICS9Vvz(hlT)b})T#D*V9xN$)+XHG5@F-$*vc*3llroUT9d zlQA>?a>4`Ms_nUdRlXNZ^eT8s)T(PElerPVF1@Br(@zbwamOJbrl+*DTf85Z+I=zu=19aoHX zIORz5w^7OeDs1`wnSCLY=p}q@;nUu6@372zewx#jUe}B*&z_k$NbJRZmv4}Dfsbw>F|^K;iyd7;TvQH<}l6@XRICOvqrmPRmn14bX(<58@szLd*lBItoxuCON-t) zmZU$O@xf(DNKJpI>yAGe8HJ`IfanG_am9{wWGeMEXy>e_48b=Yjoz;@dHs=ldFAx_ zo87L}4fUye&Cv|E9J_6|S~1s*+HY!zl*OhZQMe33rs$8|rH5#<^*CH9lm${OX;HxgxNn&B)6 z5-n4ADaq>78cf5Hhq^DJo6#E38#^w4mUFctU9DQ8bLh*|1S%aQ?6Zw5v`ChTRcc7G zL|TyiNCU3OAIVBEuTCe1uscSNm}z(hQh4RD2JVgS1-}++5&DH9)-CU`lWMWj3ydH2 zL10%u>Wy6we*iy|&#zlwAoDKTbQO%@gXk;D5CpjptqZ(J33J~pe= zfYfq5vFmG)z#Y-OqW13u?H$3HgnP(0TP2-l8Z*vVwydCDmT(`R`zw>T*quzj=H@?e zg>patMdCz3s+I1pFKZpr?57&gkp*PG!>7u_yRlx@QgM2BNBc(^r%RiMym{mWacIXD&ty@(GkS~&l zHc6kItUkwa!*a>=()7guQV}4NSn4a)&_D~v2*4nwY@wU#ranZ@K^v|$?3}&Wd{()I zmHR&julcV3$qBtYOlHr7zbH4N-)U8Can%}U;@0E8=z%lB?AgYmB0qwhaiYM7F%4CF)v{hp{?jFZzXR7rnl1wT3O%Z9*rYhxoqSiBCkbk*od|d5v>M zAwy~GlcUa1Vn(emFp6g26M9NluB^vOxe*ZyF!GDQb=_UDLT|@Gr_NZWl^fbb8q6$J zC0S13S4<~jDG8SitogPvTYCl?vu~Nt92a6@cVp|&6FON5I-Uy^fGAi=yo|lmI+2g! z7>V(+p*@<3jS6iFrre3HuV{ zA?-z!G~7e{Xg=7|_QOx0erXF>ch<41re^tub&?&&9!O`^axGiyR>zbZ@VJ;{s8db@ zAMP_{6AJpv!U;zs`>D}M-;{1!`G4=ltF)@WVb8&KoT|ZUFEaY@RQjoqN1#W&TJcd1 zcUL^k$$A%b0Ublrloyaw=;SMvZyea=Do+$e_bCEvnW1fA7Nl9~2^X9W=6yUmYFv_9 z5K8{Q?;$8}C4Xr?dsZ3nL z-vTn)S-6UNg}$RsT3+a_jyW~i_!XSda->11hv(HE<&8p9eQ*+;XIzlxsKIua-k)s%;voQv+_^<3$5X zh+{l_sVXSEE*I(6()Ct#Reca!mQ(mNT@~xce@ZKWe{%zVZ)p|38RwWw+8Myv`WpLi zaDqC{zB6}G^LVA}rS7_w#7`SasLRG4grO&;5(qr;xOa-mcM0jS>Z6h9#l6cOJ5%=O zJ(3xo)J;N7(F;l)`;>hrX9yH=OTX`Iuok3ZNzJKGQvC4)2~WsjV^4HN&Gr_B`@P?e zoRRb4Ot~$#uH@{4$Nq<-7b1r>mOft&84ij_3{Tck!vjok{@8|LLZmam2~OQrP$)okfkGKq12 z2XEP1JV^JxwrQ6Y+jv=v1zD7A2c%lw@pNReJGyWZ{#L^AB&;lSx^E9LlIA|ozc9L3* zSxEQMC-F0|uu58&^ne`K&k+UWDg7H@;9bPCb&Yy8c161wOO$fqIXMS(kE-BqatBao zm(d-%5#OR7!MBm1jPluBPjJjP?o0R0fgbmczaH4RJ_{$6T8Y$_-eFi}o z-jlWP7M-WR3i{p^Q7DEfj_^M4US+_abY0LV{Zn-g{}{geq`?m1OBA~ z>J9wf)B;k76q*F4N@`q-0kWKNTJ(403N^^|9_C3BTgEYD1aw~R#m3|nu230ZFGuU6 z30@})c}&dX(6acF^Fsr%R>gx>NPA#A!qJ1sFVaIct67E~c1~vpYJ^wlu5{gXTAv7* zvG?M;6VG9zj;vT3y1*mKY-C@UXC@=tk)+Uv$ZT+f84f$RhmkgUG`gcJR}-}+oZuz= zo1CaK8E17J@gBpzW7+Z?Jz;#!2ele5ja>k5%MDSLD}>JR)rNL0+n9&_q&Bc>qy_5` zl68PEAyyJQu@3AEc~QtG2U(|D5*rh*skLA_e_Jl$%cDUE%r+3W=7{+qYphrWjVA1s zxy~_c_<9UHn=CJUb{S>v`CsUMgo5-%?XK}Mg#sV)2Kt#yhM(wfh|94@;nMKi@XNy> z*8%2k?fwD7xELbSs2y?Av>%~h6h5cCH7{b>#uVDG@6o?S9xJEy6`D)mpz9%qVFy)- zZ^8G;46z+4k@A(x>Xw=(%|W$MBz8|xq_6sSfOb=0c*#4Vm*NHPC)nR^0Pf8Oo1-~{ zwbArQZMa@u;_j*#$TU?!JIbe6DqJeg;G}%Z0Jc0-A8I!*q7z#O@3Il*mU-x(}g zrcjZ0NTPaPe;UuiMh(+=FWm;8rgy~S`g7c4{$_L;aEs4`5i~^_(|uMtp-#R6pA|mi zlHR3dQ+cr;B!r|J$MAGJ3wWiu%6qg$mlb6nX9(7h@h@VR@jCBB_~cQ+UOt=e8;%r-OW|oDK|;7qG+Vw*hA?0W zpf{y8eV*DYbrF7X!~6hFww$BZ3`@pq`YU9kh9aGOf_m@hI{WirU|){h-6_Mj7?xJZ z5H)Xo;JE0>On8~{ix~R5nsbuntcjTshC(lx_Q(RrNZ!z$I?A$@s<{@@nu-=XUP9BB zYp@HProY<1M}5ZegG7GTy|kICmTxRs+atBsE^-F$ria*cgbB4uYkZ5ashg7v^)I0X zsa2a}N~1f<>+qJnT|1f3;J8N@Ixp!zU}w-RS98QlwK zi~PdeA8v>DdC_uSv??9T4Gt7dxInV0?}DGE^%BMGHYj8K#! z3?(r{Q4~oOMG?hN6iE^z3PnjmQHm%MLy5vr@{+vtQvB(ur+&57b=SR{*}0$jAHRq7 zsC4(3V?Lkv`}L}k$4_sAn{n>jyjLm_)ZUDT2;O0g65cn`{#=;EG0gTkT1TX??g12 zvI&IwfiI$VVpRC7^_=FNeLg(=FKDamDF=J5Ojn(6PFNOt>Gyc4ebn+g(qSGrpJuI$ zNj*Q!Ub--DtU7P_ri|62l;b;RNjtX<$59sjQlQOUcnSN2y~30`w?x17)!!-h8W zB!BC8AI=EimRg0eui>RkHC=$4$#OWE`XkrSM_e*`LAb5hv=4HbepkJw4@hySCSEo- z!qN6&_CD*2tRu%A6w+QfbsiB!Tk6-Bh&smVTRF6`kN5%TNZC&+w5HOAJa;@Bk7ojg$Fu ziTYKdq@gpXne{Kny(G4yvtr!nd~}~zAb%YMIlEgq{VWs&PLOY6mw8>Cv-Kkd^cvY> zc+f$7MBA`EC3cDT5k-M&y7zP-JQ&ys0ep@U4D+fVWGmB21Q|o)&{c5%%fau1rf|YyfMP{v61_g$Q4srEg zx2(6%|M=H6)0k}+TG6}o4tYTd_*5GTXPFWcNQopItyg^=1gU9$jjF7(HcLv_HX~f#2dKqzUOm zJlIDSGy}Y4P`_*1XA76Q0U;I4f)nT$fYH!xd13Nkpr06aA`Se6@L5ifM8Ix|R#yO> z>>*Z;))So;o~p52H0Od1p$FM8w#eIX0tOVIp)73WA3uM1RC{s+Tu!-STLA0=`BCSH zvHS0#h@JEA;&0L^(aWKS=!=7N@6CT+?zy>Ym)}&ZgYRO*qqxKv+E(beqzd>2pU6-8 z9(f<~=D-^0r4I|O#&f_9zN}o;8z~NbYah2hw?su1!t?Ay5oBxmWRUV$KXYNZ{4n;( zm{#5cela8oMznk#{-Nh0ExOmVt-rEYkbP7#8zao)RlX-eO?ZcQ81K->`l7W(37Sjv zB(xij(tK#Ve3xldQtk5yZ|MWZ?$>ydR*v5D{nCG&{^91u(Lf9VDenNQje?W45^6}w zH~H}f`KC45y@D%eOX3%GLT=V~)os-gsDubNK{`WAYzk;T??=ucug^jJoW<@#jXB;M znn6B=Zn3@Ep9qDnVP3P##vt)l+)%59PhuKyet}U8up0T$CA}WWCfA59EFSPl?!(XY z4xt-~5|-f#5s<&ataLy8HW(D5d}U!=jOMGT?|Pv%+XC*I{%pUs;Z-V-uN!}xT4VMX@f|Ewu(O0GJ@A@ft z(wr`l#VUjq5^3r*3aLJ*6(ca45!;d90Zd7G?IG+-h}tdE&((rdeeXS2N^z0pWPM7*-D+fTj*Vs>Br zGymVX|74yGA8yNvP=wCYjg~L=y{KkKVI1VB|5tnDwqxsDK9pn|J9EkL#|@U>@l=fnyCM zk5P>;1?1N+mPc5OEy})R9(I5PB^wibf-{E`oZr3S%2O7-I^ed{NkrN=19`s!kZiVVYFYqg&igW8Q3-Uk%=x_EraE}&)3HKfCo25@#L@tUlxcBnm zb@1k~AwLWRjXQDyo{cq|dYLVg$NZIEp@xWh4464UTcU-#6KeD|^C$j4QV%yPzm-OX zBw(IzP^;P7*hyS_3=p$<%khH89`md2AfR(ZV+a38twROyNKsM23#x}knz5p4}UTstS ztn`E*h}Wg0@HkYU7oj}ejOLko$jfLkVBqyyT+jsb2<<}`u#4c?{8Jwz_oRMP70CbL zzQte(m*M(`tew2EJk$D3y8RN8;ryZfAd9tfrCRUgZ)*>@EI|oD!Cyfl@I0IlS~S|= zU*y;GhY_3q=STeFc`are>q1lbCug+(==e$CYv7)ksnrm7@hSU7OP{?uVhe0lCw+OC zw)4aP{Xf@_o_VjkGmNX@i?(d2BQDOgd7g@>HdWa!0y{y5J6fnZdvZ3fX9Z#{F3k?w zT{VoKJ~FzI))2VI`wjw$a(-ArUgOIKZ_YIO@grJ?$H3X!Vd=D`=r@@|&z!pVPp+rW zd-Lcuy5a**C&Xd9!Bi261mLoR6XGS9?A|vfvu0ok6JSN9ZX;yzsbFp%HSf!ZW_lB%ZRCrX*PEN zw#L%g5z_fjj*#t=eK$i5XSK>>?+zU6p;#hxcdZ94#8pBc6mK%cFt@?(bM-xB%$Uc(L8Ty23ye;PdCYjWI>;-XLJ4wF0L zj+V<#NE+6rzkvGDS4bL4frhpYH3A~%b-mbV0p#H#wG|yXZB+LEnRBy#{U`|@<Tn;5m1-j|t+QMPyMJvg}j!SU&qa+yEyCB3}x}$S#n2PXO-I8M#P}5{vlX zq866rVWZp#;yuVB;fKdC(V$R9dj*|nf5b|Bj(bXHYFk(x(QI5G+{QhmhJFGkM`RKY zEEUWobdSCyE+d=Ll-7>+>pkY@c%9{lnLt)deDH_ibzcmwpE|wG{zHF?=oNmUs8Pzk z!AnhbrY^n~qyJ6?f4Og*T$C4s0!bqiHk!$cShLvK3#M7h1K)+}en>^gTM> zv_>uA?{o(|E5|5}P-QS4yXmck%z=GXR`#??(-brjHH9IuGjwv)ZL^1Q(97sYga&=` zBI70SEjX~Foz{TsFl)crIC3R9-|O$37j47DTU)=FO?&`PKVNVcdK{dD3&dwi0#+WL zW;%r&=DX5JzcJpEGl)%n1h;rat|joy{S4g*{WjI(-{1yQu3*FF!1;NB+QIG4u?SaG zRE*;EM6H_3Z8gwm&{oieX0=2z2OjDfyC?k8=H?N5(6m?2RUIud&ft}}&v;k#)yQe) zqC=q)EgbQa{iEM9@5v2ttue0P$dJAOU4lB%OyIJ(30x$XhKx@wY0NCB2nox-$u2FB1(+zuu@S_RG($Sv58DmgtDZziBaN9 zaa{9?S@@iC0V{%s^m6>Uj+@fZQR|Y)LB3)W&$6J>|FpTbju!S3wC90~=1+7r(P2B{ z%b>kbshgrsTvIWnT7u(7M7&yUzwN&UrRk9P#~viUM%+KQgycJ>I2T};KJjj;pc|ye z=^upxboMMof8=cl%!cou`n1O!WGv}`-HYBe@l-m?+A7Vj?YTs%`M3T7tyGHTG!)|B zvscwodY;Z-lvttvu1KO$CI(W62!{rJ1*0?2nE=4XH_l4<`9wEMl@3`5ev=^vuOW~-eP1Sn@IEC)jcQG{2-W0J(q^VEbw(VLcfF|yqcROCzTy& z3ro=la1?RlldyxTLMI6w%*9_>MC%?|YQ93|BLr~~8dF-0524F~DE$dMMS|kI@f_OI z4z$~*aqU`U3-ibHH5w21S;suI))S!kP34M|hiLktUZ_725BW;|l7GebJh0|^;JbF( zak8jy`8J(6QU9-$^TEje^E0MC(;xb+USMxV7aWbYIde;tEZ=Z^*^k32HkVH1Bj?WN z@XuouaB9CuQ_>e?N}QxR;9JxQ_1^T6OtJEqnccxkiOZN*dkklS*+MhyLIteTw1&-_ zWAOs!62a0l2nx>BoA3o+UND)z;YyT~Pg8}Pf#*tW=(FXTdJr?g&RUz!*|i>a)87JB zowi9U!Od_Ek*hs&CNh(@L)%064tbe>Djx7p14$Ynv};*Pzg8m0!^8Rqz@ko+_J{@j zp{NQtWiBMc;}~Xp?7RW*c($kk&pN_GnOLa^b?&ke4x0s>YBRho0wh{ldzANnn za<#{yKjB`kP_Xm9@I&q1nWoO1CHwD6S>9&k3cqB^SC1@f_)lQy8q>#_OXzcA19O<} zij$^K?vLvFDeD=7Zn)QDIOW%cDQk{%F`@^1WU7;18hdhuJOJ3%ZKRWVie#Ic?XE1?a&-Csx7ih%WqZBxIPQIH4N56>g{z%v zvk?sCItTU`mTK_`x)@%Q^EoG<8D{-%sXZ_!EeZGd=kmA&46x=KDsnE_b~1MZTSC6{%imL^TmgU3v_un(NT@fo@-=hV#=a) z`>%70NUAMOylgZm$y^r+JgD|^tlvgi`iNx96S<2V3EY4N1N%}AU!olPYoI#dj;->Y z1Q@8uUv92Z_VKT{621;vdx=~E85h>sIQ#O*(HY1ye0egdu z(}Q%g@2yzltvzm)aMuDAC$G?{5qGs;k>7+eTvLnX2E9m`l}bU*>zm*Vr}C9TG*_-H z@B(bt7Kt~+AeL_4qc_PMa+o@Py zeU83iJBoY~zkpu^zo$~7T=yFJGJ}+z<)|Zn3Gcpl{GSCq(R1I_YSf#{Eq$g<`v)@J z#!yM7m-IXQ9&Sg=&<5=uGok%9{iK(|+m;!3j8?|m{5$eCcjV*vF3-r>wlNgAaQ+5X zbMa@?cjtEWI2mne(f2|3GYvm+mC1XjmBG9K@B@d-_zDzs*=cGBYRan%#@)o=gQCK0Cfc_*GR44s4&;c*F$3r=M>)CC3Lm#(gJ8jI(NO0pO z6+TB^3I@F$${+Wp#&M_;uXyQNRr}W^=1*)^Y$H7%y)JZ7t^RstIOG=!!ozARxGx`} z4Qe}k4LPw^Qbnc#;v)RsaE9&Dwl|p@_JYkK;Evjs&I*$dOPtSK|A4 zQXhmoGg6tL8QJK(-a|Tt94IOHnrjt)`Y)4PVqMf5vh@55`*viM?X7is5110wJ3aozVh{}d1t+$BRv0fujU#u%yXIzU)xld%qCSIG z=KvE_n~gqUFi@kV269c=>gDK4OHah5xNUVivervzrDt=e@4{1_i(qG40J@u+T&Ndd zIF?KOG`GNYmMQH8EJHyPtHdJx znX(>A##RHP%#!A1?we}x3QM_kg@l4{tP-?LKD#c|0v zaIpc)SC6uzT@xP2i2rlwyI=N1Y017KbFVsRb210C+x!%YL;K}6(JS8yw<(vE3t-oO zPb*NifWbl!W$TUnYq?b$mKEk3+!}p@y&d@k{4_2yql_J6$zQ}T| zFSXpo1Z+z>5fZ{Ictd|1YUkby*MjL9NTNY?(hc;x9!I{!w(uBdCNcf*cn5y&XWSU% zwpE;M%X6O3z69|ecNcBdbIBAyK%NFx@eKWi=mV30Z-GyM4*Qrp5^0H$uj0AJ4a1{1 zsEg5E*1@Ql7$)l8xncVy=T+eE?B-sDdEl8RLf<^)0w0RgQNZic>G-o@s{Ygs&c8{% z8-Ey1vBt}p)~CiR>M`6;*BMz6l{jafvd_rt)?Ka>B&D9|C9o3#@88g1XbKEAuLi1u zbAcB^Cl3KS*sXK1j!et@=r2kuej-kA&){gG1#d<65f1xctQtkqRrOP_UL4^shp%Bb z6|Xak+>FX|OkoX|Y;2Mp4ycb@BqGiCY;d`MIs8%CbjeNmAwC9^0 z=5b3kTF=Dmu~eu04I0qJvs|R+pk1sx-8^IU?(j2e6JIvPv(wBMcAF_R?Sr|Frn;qk z?q;wyu;_goPWFxK6H+homH3FhGk-&VFb(K5SxH0WHRdIKpSXu@BDcYuZB7PdX*J3J zHM|`bxemQpPd5sPO=A?Dfl9R=-7E${yZSl0sg&at#3DLF&7mxsiRXc>(iYN(&0_*y zf`7uy#BXg4nc*pQ(BCY`-kI>^nIGJ*!Kxh+1-q#d(u zP$2gRpZPVd=p#0IJ`2&4RW@2wxpFS7~+#L22DuG0abkzyXh1;Z5m5{EZ zMF@p(lt;UVE6}XLk!BG%$70c%oxd?DV*Z4y2r&=9eC4PeaKq7jFsw29QTBH!U z4^<-Z=nLc{au3|5V|31F6JHq*xNjP84@rk0<h>bR5 zmyPdef_6`Tr#;jbq#B%%`psA2Kc)@34$U;Zl~2%F-==c&bT8BqE&%?pO!cXKjV`rv z)?236W;@b^z6h6wD}tbJEf=3sdyU{%@hy3S#<4nfh*`5%I!du@N4@Y7o9A=F zV^UvmLOtY%^#ZLD{(*MW^;nLx1n-I5F-_2n*)QJ4Zk|$7iEGBYI3>&=CHauSJ61)bLJ_^SWeUw$i?c4cY@m(_MPMehGE!E$AO21DTI# z$A82On%_n3L|kEJ90f*}xl^tM2JT_LUc46U_0RbZ&KAx_!jLedf5-2^%`6Yqo43$8 zJdG6LN$8Uy0v6g+VG1NMQdA10T(a1C{9Z&1^4MC3HshPfJ|qL)MjxKRR}ziENBRTq zns6v?1~*ZEkT)NxrKS$*kMV?Q4h8Y)(=B<~dk{DX>!EFZSF3^rbPZmBIKnS~v&O22 zw!6qEIEztv9I6)j)LBC?>d8J+ERkZT^aqw!K|vSzJ+)b_k!pz!&5dMXYx0cV4%LgR z#4U)^*06irgxI95c>N3th_h9u2G~Q{2o1VwBG6uZ1&c>ekX*cqRf50qbGN8B?$64u z`vmN`c=tQ=V(3HE3eiKiMKtqQsH>qF9tCWdEh@!$4{hNip<#XNbT8QGz3k@IKd0jn ziTcQe!pP3pgMYuFtKypYW%K;sTIp~<=J>vQ>c4AB#_>&yD3+hQYWj6fh~8ws{Oc{2 zbFLf7vUDSvc(2q3{qin}(Pt0+%R;QL68aq!srTXMmgjmMkxuMrU3e+<6#YoFQ?H>P ztk2s|ZSB3}yocQf&y~e}B(gjB`QK$!^SLy~5;7W4rACWkL+g=5 z10sBq4ws8<@(cdC9>;&OWWc|iv~!qkiFt;3tTfk#UN~yya*tC^fAd#DU$kjpT3f^4 zlSM>_2_*rG8o5sF$ywNhFb=;HH_;gV9(JEj0UW~_$W8T_S_#GSgnkQu0G<9f(vYXl z>k@|oeMmN(1K*}vj6d)+G_6EIqjJ9XS~(D(YajV8?H2z?iIOtJSoE7{XT~9~sf2V; z&BP6I96cazV+$a`QVn^b7U1yR=D#YglNa(ucW3x1@TbrOiaoXFS?m$0y_31jJ_4+y zcbG?hMdYeW(2$m`zmh%h1^oh)ho?*1$cb1lMH&9^M>tzcFjA0y13?l275+W}GPc0p z^+e^=n_9f&M#kZ6uyO1P)iKLwZ{*h@?QFrg?PsYjxqz5NZXgtP0xh77uA$5FPh$e= zmA2^yWsv*=je(g_y*j5ILbs3%Gz+DN~j~XYnXhWJ(e#TNm!b zbC_!B0lXpkg$u}-wvYFj(urIvVZLdhBNwe%5f3Bt^&kt}q*9cp_IOgbeA*><@hkrJ z@Qst_XHWeO_iZ>e_|&q2^jOMlKZx0ge#FZ(!TW$VIjkMRfE|QvfJXc$ES22DWRUF2 z(w{Q&T#_!U3t|&s zZe=Qca#|=hbT^#tdxoLH9kzjJWiA6cU9@f6L9<(tc*H{lvgRLmDsg+<-{`-e|9Rwp zcg10Eps<$UIW09`N7TZY78ZJBT7^Soy>>3J#`@!~;A4hwhiv4wE$CF4_8#~k# zT}-m3Iy8v_?quYm-_NBAUwq5(|8Bs4Qfo#MQGyLZO>7LY?#QzrMSOMsWLIsAFlTz< zeX5E_vwwdF=>JAR+rA;3zz*>wmZmeTL)J@HpKXZ!Li@=rgV%DEG4N^Hksm>oAj<-* zXCV}3Ln~^xTBh5PXJD$m1^4Jr`5pMcU!#t3DdCb}o1EY;(ksKu$~URR@JeY6k8e7D z#XPltO0eVRm<~P_pEyB6oky2W)=$13MXad#q^(`N0t&=ah|74eX)G9IAMp(rf|Y!Y|WD%7c_U_H{;l;F1q(pwEWroZ`eGj4Atzg!^`G`bCd~{*MZ+Z#g91)%^N@Z6dM;mJD&Qif zlgtKYx@3MudV5;#?R0;1xdKC;2H>bqML)qdVvc0!9}H_QWLs#5r5|z=TVlM?D6Y!a z4MpMTairYtwe(xMoj)ML(!@=u9|PS!zjW8ThID|wT#I4@)UMlnWAF)0CN}E zuF#k0EmOM1r{%F%{fi3AwH~i)H%|+p4zUXDh3Cm9rbqaR^#R!90Uj-akafTvHLP6| zHSw|69WtLW0YZuu^U)Oii>cP^rhl88kqQig2E~uYJFZS2_R?t6~BQrYmG?$Sw@)qoAFmZj@kblE;wGGzpK%!ALqDV%(HHg#c#Wiwp;Chcg}2BZK2EF_oxWOG@d@F|;5J_nC^vp{4yFiAV-{_fsgJ;< z7|T@Qou(EehX8d{0s$Ew4h&sI=FNKSs?;u@pSzQHpxQ8%~+#_=7IsAaV z4o@;``VJ~0Rr)wZL$}bEC>1VOKlz2T870ee+q9+hQ3dQpK;nxRQqV>rN6IvU+;wxV zoC}z`j~%US0{Y9G64=p-eE>5dy!2lMGo2xEOGWh}H5Y4vHj%qzr~a7vr4^e?4T4Tb zar72phSH%LC632^yPg?Jua^#+dUWuL4h|6Wmjpaa;uRML|(CAs?CzH^EMk zhBg!eb{k9Z65R|>MqHZt)N_MYLP z$zYP74%UPi|FZ9Sc*fm>?)q)Eb?8RK8|x5SZrk#IF;32k&PG8pa0}c`t3U$Btvjh2 zV9nXn-x-K8XnZ!(k>}bg;w5-S_CmGl789+cTE;+s?2zmSH``G}cTzzA18lJv1(N%?hkBfRMUF9U0$0_(txeJ|ESsXveFKb)achG+LwbBP z@K-xq{d+@Be9bYLo1MqmmR(Q9p^PqKJ$MnarHj zVfh1$ySbEE>Hl%qUd3$u zTQNM5ZT@28@a${I^Bd;@tJ|@C>XvOsSN`^$og9dUHz+cGs)gx{xQHH_QBEktt#J!;0dAOFj`5%ngLrRHrlq4&i4{yP6-f8_6`zsEIgX#7Vk z35`b-q5#+|lHunNVSrh#^i~~|7KC*4j`)f#L{{yGYzgxtLV*rU8sDn_@!+BRr^D_8 zZsha=>5;Nx;;g=ZXI(I#t4~;fYNI~6+}iwqat=RvZvIaUed#3Sd>gJu#YY!1JI)he z$NP$~crx5f+*9A;oLCH=+LRd2`}t^ojAz7_uq^I{vjvKOuYBMWsQb{Jh%dHPTg>?! zY}r}GSD|-Ko&Njo(tnb;Xa6X=9GHi<;Cyt8*fZ^sU+rn;3|lQQHlE1~aGw5CsPP7FsBis8?Lc(#cuU@GX?qlCT*V1hH2oDia_#9-%hjlx?ply@Sph~h1AH*y0 zG^`&fSCWl+e_Z$=Nc-C0Pkc4&!XMa=?AKY{@qiq#Ue`+Sk9-VB!aWEKYxjj1!^MxpU~wl15)ec-@2gv7Jowp0a5%K-1849qrqNaYKSHp!RBxS*%f~PGI)})jkrLj z=RVUAdCR_GU$d2)zR)E^8J$g_P_vnL zL5{DTC_rx^e&9Er!_D{z{9Qi*yxawB9Nc^sp*b}NDGlzzt?qY{-`^AXp!S60;M-6+ zogtZhx$= zTTVQ7weqO@pEh^Q|8#T6K@+;=+jU%pAN;F5A}MAjE|qGDk;O98VW<}DUEhoAf?p^S zx`ZF$8NOE~_(?iW>aaV}Ea0Je56-xY+6};vy9z#knRXU;S;w_FEI*v1)CXULqt*RT zw)uQYU;xg5*F#J6 zFKL&UQE|g*Zq{E%XOVt8#DWA8`OcFn9J;Q#d$|G65dKG-HeF#E__1||Ple|>ci>2F z0X(8%?h?JB;dB-t7>-)rg%?Q9pQ;6eZ^E<2RCt*MK0tPeu7Fa=n_`x-Xgn7_&@o6o z-DCzi7Uqr-ORR)aVB2YdM4z$TCvlYb61&n+Bn?%ZbJL$Fv$Z$uB_4C-lG|7fl@e>> zzIIQ&4zfc#!6)1!DNfndcF`?x+pC32;3SMN#>p}$fjU8!@j_w~xn^2})|mTH258Au zp^0RV@toM#tC0yc-^fRP*WjYp_WyRo8>B(I|P(h|(M71O?SLlosqG z%2JgkCmKWbs0*4b)rVh)6NK*~Di)J1>Nk4@<1u}V1l$a^1{2W-1c!7;f1qVgVaR*7 zdr~Wn`zl~v@xY(aF)ah0l261t>U*vOzAEuV5%S5rOPeDQy9@9b`_YBP$MF)Cg? zK%a1Z+?2o4?LF&r-wQRJo#-jTG`)!bVn0~tZ8L1Dy@uwjpNLHJ5)NTqNUHE$N$_TK zU1v>Pqwp2FCEv9=#7-*%y~8F=-OvNl4rYqkyj!PzQ?Qvs$Vw&O)`c>5zx5jAh?+P{ zXKtTWD!;|zFa;$8qBH?g+m*sEKf(6}hq)s4x9EY3;Vz^X?X=7oE3rR`zL=mRNDoBL z3741*_XQboqo=lT`^h@`g>zfdL0|o=b;x|#`2n3br$Gluo&H^`)RIK-9>%>jm8q#X zLKh1eROMNP7IWGs+&sG}XxgBhZCxOq*t#Q@(La`?aFcQnw0Xe(?(Bu7-)OKMu;0lZ z>jB(KxKS6hhUCINZBlE4CP4>iSAv9f<^I_;n6vGM{8ESFMmLG?n9qu9Pc1g(F7zJR z4VT~*f?q2Z$CQq6K3obub2iehx6vzd9=f5gsdZGdUTx*c99z5fve{`VB1aJ(d#j{_ z&7`cX=r{N|rIJgOKM57a3n>mu)>(9cm_!Rqz}-ML;%gZ2K*4q$(MPpmXh#J^9(V{U zAk1MMo$z<6PTtMO7%kiaIxem0>G~rsQ)xJ*f-di@yGDECYXDvF9$TFw&omg#kt-1? z^fl`MF4JE95fr6gRB$u~x`}+mcg0%$J@?}5GBkVq-M$~bV)rpC%8I$s`%pUMn|%$` zU3I~B0q|G-Q3CqZo^2#rR<&t*6iUUeXbiLq_M5_~crq{4{-sQVT#>zy@>2uWYsv`u zJ}|0m`dYbEZY$)Le}$jJPGyR&h6inj!1z<(*igZrLO=Mf@O$qEv^CrkIY{jOdkk1A z|HNGusw1BK&jj~;=V+@*pm!!LOZ;v2E0Y4xv3|LcbRwx_khsl`Vi^_$e~qIUh4o7c zddcSmJdH&k*s6FG{jq-pfxwe;O!*DJlJ-bKDFb$t*1a z`X<#YWjmLkJWDHa2*1%q;|)kyr0dyy9`ySZ?1WFd&qjk|0nlgzv*3ATfPG`iwcWOi zTarxz;Ut?C5yOL-P*$j4z9}KnZS}TDp@L9szHB&{D)O_gU^<7YN_b!VqrcVt=vPc6 zrhsh(!XY9D^{a7ON5~N-e9uGg!WXz3)OV@ZT7nG`b<~LNLK~n4xDC(4@=Pvrh%IDR zOb^Vr3>vEd`}Ntt3Xh)kNYUOn@4XcO3r%(-!htsW3u!l@8m~Z4bC^#Ru9n7{8tj_jWy@!>G zP26f|$FmZ=;{L2T&${VZwTrrA%7%yN2Iv-ChNl^0^gI@AzF^`_HOxb(n7VZa8Sf5$ z`_ln&EJqTL>&+j;6WfNVp2)Usfh5M7J_n{z+gKj_5}P)L^#Np1q(MS++WbkcV)OA6 zdX%OhoL&nrU_nkX1i_{!2&3vI_l92;C(qhYHV|h?*PKMHsl)%8di6I}`Vkxs_L4!( zan51=5H}hF*$Sf*q&EbhKl@|3s=u!xJO~n|s33F11NAd>gLU|&U@auU!C+x1;HA09B!lsnLcZ;bYcM)_Qu&b^)1SWJST2g+7Coakb9qS06x2$_;pxe@SHW_ox-)osmJOgja~8u-n*E zp6GcB0a~-4#2{i57A=>NK{nIsgPyW(?~KNrWP{VKH54Q?!p02PTTMapf{7wVh)eKy z1s7X=fEavw=a3G5aK(X*aE#$MaAOaj)_Af?kE1rRDXPePi-~7N)2?Y3e?s-a&5Qz= z>Cu)Wy57EnD^wMC%iH`!tcZd>Z3xOL)ivL zOLQ)FVD>8uDhFSZSg^ZnRd+3jzYHx26@(kLKLVn?*Q&*NsS(^8o1l2(k&z6Zj0G49 zJ|h}=h586T#Jy^pnk{$pV)#!;;p}|2G%lgFP4I8_6IEf}qrYI!$Vur0 zx#atxZk=)A4%sL8vCD88j+hGIOH8tHh5V^@ATL0#vRx|?+pt#o1Nj}D$HwUiZ3AEB zw`CNtXo8&R?~?2IOte!*Og`uja|a)$NAX=0kVTaP+$BV#)8ejPC2^`#EmC%{kBSFS zp{_A2bOp+iHYFQg2t6?FhG_jn`>BqaDxd@N6dp_O{_iBvC^LQ<-CTv16hr_SB$mI2 z4$I)K4rfP95$X0vOfB}-v=OdHi2$mm`-g;F{}Sg8wS?}f7eF#?N`Fqi#rAMuOh9MJ zcq)q&ZA+$A`;?s{O6}7+$epV1;m5*`KIDHdZgVy+1Kt!X@LIS}d<^ZJ-uD*=+y04$ zD^ACWZ6yPDVvC?B`;D=)_sB+PH=JpiCLX{dTa6T(TTLa@6V$G9#^(t?d|K)M(ajd`SWK=%jo*0Yp z3G$uh0DHcS%CSws_vtJ0y3!V2@U4ZbPcLaX{-oM-QX~Xp~2dpTbXN5OJz^ zh$yrP%qzdB*EG%W>z#5hJ{B^gbNsBDs*7?W^If|e$>E8XL?%j{(PPdUP7xk)11bsd zo0VWC@NG=A0E}kjFuP0FvwtM7-p4%(-Vv7gXYxDHh?oT&wFdk)F-p~1XtQWOU|*qM z=vDZm5u^m8og5}g01+1V(!9@O^IYdXdUK>Y;MolFdtsF4q#E9fzEl|NTk?xz&rxLU zijE^UK-*Qv_Ki12w|>9!SD|iXi zM>IvWAg`Q_$aVHT-Aq?l6X{vAMl2Gwa21@PCnz7(pTR7t@Wd1HyDs>~LreavA zTpK-iekKZMUqy?m%T(sW&rVUmCHP__+U5}k4FUXt$T_k5`KIZP%m$g*HBKM(Q#=;+TknIGN}vM z$NlII+m3uU?L+aPzjjA{!~Nk)&R&BYUPs_iR=7#xk+DHR%s2d}gk=y$|ToW9`3cy};%X|c7 z;4{Vx@ijKeEt6e}7nPCU`Wg}qr9pr2`>2cFq(v&%Qi}i|uXGJf3lz$_Cp&o0cMG&! z8$JJ*qW5v7`~Uy{AHRQ|a~wOKyuIv8eCDf(CJ}9IEo<5$Su}~JEo)gsBBDvw7Fi-| z5?PZavS<-mv}m$OG);^6^5N~t4(He7aUQ=PkMHgE4{SJ(^SIyc*W2}axthd~cbHEC zH)jnI1?O{7Xmp4f@*%>&c3f#e2XHzT)MW3mIO(+s4+9teEUid*N{RYc{w_Df{B{=M z5x~$)BaewYCS%*zzB!7`J=*~m3Q7A58DVdqr5ofK<2jcWJqUWFmFmZ4xAI9`M7DkH z46csZ{$R<@Oy;@clj9ljJLI$4L&hk>a7%h8?_e{?rum6HP|9)8SRdmHn(M97(xFO#TcK8o8 zr+7y@)etG%a)YN-LN~Qs`z>tS8O>b}ZREBb-CQ*Jn{QJcbdDTqMO&seO(k0z^8zcQ zs;j)kdFgDd@rp8p@rnFNl^KL*h62_ zab{gw#AS6weMZUBCUaO{g>4bb_ zl<%hURQ(}8r6SA{*L!B=KULxB|CC?-O(%twSQXSqV1<1Y_k+*<+Qp<2=avbZ{1M-x zPlPdM?&7hU5{&heNR5<=dST=KOl8Re=`~jm)XGyD3C59s1X+EEwJRmgIr5IHFf`kl za%GsS3_aK7kd=!E*iZM?P@rD2cCG(3E>y}(G7h8i8d=RkF|%~z#Ggo>?$Gw z4YV97F(mwkK8|OQ4~Z71o3lA%Lx=HB`%_u7?gzU45x%;MdTH9XK)kdV*5;6~M(44S z$NrakS%zfj*O3J6wjrza`htR+e)W~fn0dw%D^tt2ertD-b99QBAs++LEP^rBn}(=A z5fUiqymbs}SjY@s&Ga%7lFxdL12V&4k>wsDkA+{JFBdz)+U2%h7-%JbXsy7L zo5t4g8124RZJq{goDD1B3$HlL$k2zvxtR)mN{_J_DUH1V=TRKHMD#-AQ7Si&HBnxx zAIa7el_eufOhwe7U~bDZMycjU7O>lNj_rt959RS*yI*&qIXW;<4Zkl;uM$2evV2vo zG^2Hj7=V7wCiy0E*UVLt7?1j$zX?>zXk-I9)OWOO{f)Y3L2oQIVZ7os5!|1?0(o2M z_T|yNQtOqc*z!Nm?dxog>$)_|KJ*<2BeZ%?6J05{fa5|n=YfC!i)aZv(SNIZzz(>n z8Q25O$!XeQ=oVJxsNiGqVZL4Mpf7|Q_@X$jzA%r1zhE!8&Ua9cZ1CNz1HwpH#M;bMQo_T~Z? zq)Dy~SP<>xbAuxDgM-Gd_({#t_w^AbAJam*Ig0sehbC4WIou zbcyODbCDA2hSFfVeYb?=%Yw^8?~*qj+?Z>`nf&z1DAobZtTo(p$T*VDg&Dng3AD#H zA_C4^J6OHt*1NGnwFbK|?khiyAO3njP(|G&yQ@CpD)|mP+a9CW5$VAv29Mnu`hog&$4#`HIkcQQ77Fws)qCSaWkXr1w7R^5Whn}OK%a!;i zeUOQ#56P$8G`@v@#c!aUdJn!Kj3B9Eu?dt3^uC^fW{_8rr}hdWIiwueV95;hJ)rlj zX?aMU@h0hE?r5~wlc9U$k_%j~{nvn#bVBYiiXgdngH;`$>~DEnNGs@&S-`n{W?q91 zp*v=r-iovY=ky`@iCTg!SjF5h`-3~R7ZJDFLVXHYCLK}>`XM;WWa;Vj12h4-j#lbT z$W^Ns8zPe_mZ|5yfXf{;ek(t?AUx2Lg&Z_a=ZQ&d3m+ihm?Rz;wTNGPq|ZXT$PSu- zO9*%qkp=6Ir70aMB6kG)gd=S@;2=)aHFAyE1}4<7+(pER1Nw~6B&F-Wg3a7VE7Dc& z0GfIDl%p(SnoH&HGuk*3sd(0RDo`)ZIj;9A)z2SEbs&ByMWW zfjoPO>2aQhtYLjulErLtRlrnJnNn-DN3dyL(w;i+>HSgXY^n=DlxUapelXQ~@1F_g z`4Z%1!Kv>VA1s6{z-p;nG?~paOupG*sfTEl3N-}cA}UE=tqQG2AJDcyKOluq`ik%n zUr@7nmhdohe61eEWU6`EI@zLB@GaysN(3rZCdUgUh$ch_L$$bImij^65O=}vH7L%a zUlliX1g&Og><;Y*-hVx_zyP%q3ny&WCuxr z9p$<05X8uLM8WTLq~eg0dK0XaA4?0;1L2x=D_B96BV!~&pOK@)4%3Z2w^dPL{0G}( z!~?VKG}5M?O36gL(N2xf9>mRNYI%5$wxpAgFW)dPjBBQ9^c#I<7~-*RkP`Zw(l8Z& zZe7I+wFo3yD={DHNqU?y0W(OZRil^FgZLrU?r2coJAgQB&0D>~h%HoKpaptT`a)h6 zrXYv<1o~=o%mnQhxJY`GH$Z-PN#Il)?55t58nuhSL@gg^J3-mcA{Bzfu3CTiKGsjy zbGzV*Dy2@a_lS#l>(4@5XPd%;`_^ToR4V`z38tt)Pzauop>#F%(z;0|>lgnm<^uHB<*X29@Om@%+`zMC=yWTq&$#}?o)+71Q zjx%dLG>Xg^S`0K$OMb70>!b2J@QswHZN`0zRi1`yn~{;?GolE{e40D@ z3o)K)RAt);^_kzcSF=qaMQn|;hbst;<-lf8teQi}p%*>fcl<{EZr- zO)5pm9W~p0YsING%zHJ~R*9`4nd~=@A44t{MM~cb7>-utQ}{i{Py4p>i7`w67H;U0 zbR@siN)1C^HxbF9KG5f-b*x;!g_FoFq}LcQ3$zil-S}*tS|0rYBsAO9DKkwzA`H2Z ziqa7@5oy%6@p1hb{RiXuhwNjU#*T8SNFSac0*OvCFK^-FQl%}0V(nG7MYNV>eEUZC zMYs34oZ*WnBB0;SMyK0P>~rLxGu*gsn^Gx?2d_D(85U_PK(Fz8L^fHAH(0j~QJ#j| zg4^@%V(M%w2snnx?qMU&*n1jindqAS+R6~(g_>Zfw_RNkH;gx0B9ewo7!^dQR!$6I>o^-KFu7qV&Nk9v zkCqK>O4BX}VMn3iX=obJ$fZ+XLvQ0Q*O0NyIJI*1hFTJ+k|%`-S(0yRF5^3ri!9Kv z&E6r_%!kAcvryDj$Dt~JG9^zmd z=y^U3Np!A5uV1XwFsp1~>I=PB3k^&eHu0`?p;j9wRhphB!~73}*R&n!knBPQ z_K^L-4#Q`X$Yh&USTe4f?^%s5Mc;>P2M2&$J1rlhx0OVsS@-H{aMdUalxT^PLrzy` z)fzn$xdvOUdUBptYg+oAd)c2B| zffZ0S#1b7(&k{U!3xVeY{AS^JwmCqS}?zEb0=`qR$iaMjN=2my}6qBDm`N z7zmZS0*6SSR%omtpXCH~8C?w4ISZl9;;r*)NZJ**JSjE%Hc-G^-v0 zK{J9b({F-XVJ&RKev3_U%mridWUoW+7ekdai7{7%ZuzCw?0G}a2PifLIfN$3IiJFL(eTv(GRq+SC9sKzZ$!>?%gq@KIcF9ac9w4uE3@b(Vj1KIDT%adQ*Mmh$ zt8m{~6aSENO0qKtzp$4%QjAbXwYLEc6N;r=b3?(wBfL&x)GVFKwUGCLvRcIC>rONW zh~7!kj(^EK3hc5o`g%wMUBN$u{l7unlrGdy!d=NJ6==u$Dx3ht)-&b;dyfBNBIQ`d zdpW5$U&MO9cq1?GOMQWUf>Z}xn^^XLuG+Bw=?KXSowiSqrCckpW2(TbQu24t@4S5C z4_Bu|jd7Td?Cmr|;_N4_5j|JqwVy~VyfYq9U(Byetek+g2FDcAd?tEr7fS0t^-P#8 zKP*8#c4*!LYu)dGDHEL1W|7a0>;(Ln!-%4%87EWVv|)Yr5wjDVOMaOm=H(~UvbxPV z(4X`)pRT@ge7yXO*I&+vUxg}Z1Lo> zMx~_JR*`<&kxjT_a>JWrv;JQ(l=(kDv^7WQMYD3%-S6!cp9ph zt_mMvdJu4rsT*jjN03|GF84vO>)%#_g5=6AtkM?EpF65-U7;QJceXsoO=6X~FeUVb z(r9If4~ketKw6>*e0#G9ou?OR%tkp**ke0rvbYdrp4|Eh6)s6Zi}E8oFo#xj!fqKV{Jh!)^ss ze9+yjCk4`jPw}tP!>~ta{C^@GYtF7K<7Pi=^Q^0{-O;`+c%MZe-_%9wCH9E!qI1ni z+8O+AJ~2!=%>D*_19Y5xgK;$f?Ns*uT{vkM#s7PZ#|WqFOL!Y)+si^oUJkFbrH386 zVkm#8O~=V_CBi_!pStb;4e!z&`HjRYiNRH+B#;xVRbB;h$!zTpzsgi`tM*sSK6R5_ zu-Zt`j4{9IyV|H+ZOO_b;v3|kSC~6!0sjGQgl*teatYbNmputu#?dXe?Ih=acYMDu zZ=)~O!w?tQ5uORmm;BIjM-%^m$fKOW2Z+L5h4>B(6)zI$FG2?4Rym>OSYdd$aX_c)`_#5pk1gttbuW5X@ltnMPL zu-mpqZUb9{xVcP?U2GadXJY~tc3I2IqJ{9Upy{v-1%G6>+7LkAnW)oy3jnp8n8xlpRL5gAm_Oa zceDufH~3lC(Q&$!NU%TWp0jn19W|dVyl`nb=Zt5-lXg)TsP>=vN%5wv`B{pU+>UVk zlsjOrVjs!Z=7O1wB^nr;k6*PVJ4z`&tX2PR8&Nb<&~M7MNR@mYpVt=5YGedHlTM%+ zj7k2>9W+k#*v75L{~U1IKO0wOxm?$zQoyRd_v#%fQ}}AE$OY!1(Wy096_O2|48Fz$ zNH8y$XR72xb3m^2WuQ;|8nEOT@*Ct^ z)-Z~bh){meHc34W?Zp!93#f}MM52&Q*d7+?e%*%df|qigm@s&nQoE4P#&@X|kpi+p z2C}^Imnr_JvnA`PFC08sHs)Da0k--NsF5M6xWeT+xr7}||KF{3b>I)XUm9%wObNs~VJy zG4nmMWx41Y^cEk1mzl5+lqgUTDw8Q@KY(qW%({a;He&{=MUV>pTAIGODFssu$d4H*F8Y z!=0Eb%{4@QyOJ*Va1+oocOP0(-FoHUPW)aV8R?aC)okDfe9`jJS!|wK;yyE>4ufgr z-*S+@cI1)o`1{*s^QU4J9&ygw-vGG&z^rLcc{OXicm;itPs zW@CL^7Ws-Rqi?eF#8d7WmdFia(ezbtyewl9Yyni^y529f>b#MJ3dVO(T%Z}x5T!!v zoA%QhLQBy~a)@vfhss$i8OIY>lFTZu~2Fm(SDwU6K;r zPW-Ksk6xpAWs`oVj$y5|fh~vbao&(;&Pl4=X6PeWzceF%S4;fWsNuhbf0JtQRjm!Y z&Aa3WGRqnz>$UG#l|kYc)=j(?X|~>3zqA(Pr3Q{9J=E&4y3kPa1QTh4h=Q)-bNq(w zBiTnKu|?uG8F3n?#JfkmPqa2^4}qjRDCCD|uh>b8Y6+P_J~Zn{S&uOf5swm&m`aM; ztK>+K&r??sFY<~+mQ)_jDp?FQ3tBu2Mcl`n=6S%o_`Hqv0v$PmQI} zhmQN9Ij%E%s$+uC$P4ME{@7a-aQZtu;cBhGp!KE)J0xCMg`_BDqltc-8W(skc4%I? z9^Osyb{m^z?`FR-sW8EuST9tUHV;kfcTp$!F&~pf%02KlgqihLk(G?9qs~Vl7>+@00J1LfUEc(c$Pbw3~Vfd!+{Tr}+ViRZ@XN zvWz;>M)=qAjY1rDLFg@{0KIKbqrZopgrtR3hZf-7s|a!S+~j$V2pTP=qaTEZ=}p{8K)Wd=WA#i0sMnxmX8KW zo8+(+8DAZbVV=vT-WZjT+03@4y#Wk>%boE( zSK1s8L+h?IJJ%iIA@dx|U?DiU6;j5pfOD==`Dub)D-1)Fvt4bJ>x4BaHtt9^jUqjSh{>H`W~J?NxNcco(9 zh~IvbJ32iG3dhX9G3U(xZ4LbTcUfH%-e8cRa2_FvQHfk)*l}nH{*r&I^yqICCTQx1 zdJ%F)@1U5y8u`jLTkGg7D2`?3Q^hM|N~glBtDx=Nqn{BUuzgC_USn1ID2PBoKv^<8W-GGchpZ`aY_s;3x zgi<;kJGae-l<*Z-Vp!NOQ6KqoBbMX6%jnHBHt_qh9)5T7Jd(;4-`Q*NueL3FIuRO@ zXD%~P{fG|$?{i!S2N9;J4b(6?4}B=j#&>*6a_N3)!+)ZSJ__y7Q?L*8eM@HUYb^Rw zYgG>PU&C?7Eq$d0&+weazp#|ZEu4BhHpgWIq^PYF+-pRgy{^<1~HLT6z2^e${t z9Mo|o7n(GAe9aewoeEv*IC2+qk~ZSZswA$O35X3zGH(%ny`Mib_pcN&SHn-Pbh+}v z=cwwCl|Z?%cfN8~e%XDz?eYF)FH610!jk_48`Q5l8X0$JT*wJO78(Ybjk}@@dGj=d zB<`6nuDrZk{pxgxrOo zm3oI>VCJGJXcXivpIMA^op{REuy3t%q8MoIKLg%il%fT{YX^!)`Kfj(@3l>}z`~8! zSUTE_-=ltEvur9>NL^rYdXF_2ydz!HH^n?i=)SV<(Xo0IT7*58r@0!nlB>qbu^g&H zJ|N_P3q4fdTctEl9&k%G7rDm2#-CzenPi<|hmCcs(mD@r0nsQ^oj@yKx-Z7oj9~;3 zqe1{I4U-SPt|8^b+x#QdBcWK7TMN9M{U?=wICenf!SUOe9&QQ6| zT6%ylV_S_>vOmD+W8S0St;?oh^+hZYXu#TF-SLmw#?6K+N463Bx$_gc!j#J^+GKD% z;DWPc9Chmmox#;$Raav5ZTo8=QT%Xb;$2s|7(a1?ih*p@m{2IfychgKjl*~IK6%6H z!p5vy(A-WM8TuXdtC0q$cM&YB>Wu{2Ja}EoweY5VK|#GfE)#16wX% z>{z58f$lqJRMDUj61n(}xrujb5$KjCScAqGl48}NP6XKd=ufMJj73s``rVGzpm9Ly zcqQd4J;DLFYhL(P%_LQWr?uX=MwVNBK>pvf4ubErVWCfWZQc@kxlOZ|zsVugbAAqg z%!tS}c1qcTUbh7+%nAbzN3wB`$s|Y66CxigMn|ZxKv`+R&yA}_i{cIJtM&c|#(nv= zHD|OTcQGfpsa51U^$Su2wbBK0RX*2d^gVSOrF5RHwUX>*)IDm5{iBp%RbsVdXoiqT zu4#4b03Jh+(Bo(vbD>w0DxAGZTC#X-3<>$L(L2{(qnl_M@sWHFsVIhOfGx*8^tam0 zWLTf54C*fMvEscs`V%h@Z6rnwLmybB&|ZMqo5-8?GWI^(&FvGrL@l&FGFq=hO4ot| z(l4peXi_urFlf2BK(8ZN_)jDWJHpbiQ&Yp<$%PSFge z11H%g@*P9M?C}#_ux=6#t(K}YM-T>w-^wh3e%w#qBq7#68<FDOmps#Ai9Do#YhPHpYEEfNN{bx7-z4L!Jl#R<(ejI-qu@x20sN|B9{(SYT$cp{&UCJUttv8H=%wta&hKQsO)j0DD@S?_$MzM!m#g^zXM}q#; z{$B9oOH#l79;?)&ZI3~H{mPVa8k@m*>0@A;otl$K7Wzin!|T;jWx>FpuX^lntJ`l* zd**F3=q)B9e` zDiYH5+WX*nU^f`)>oZe(eT!Vdyy${4WvrN++74-;Gfb)dJ~HEEgh z<;sFRF|15|!FGGsm6HGze5t?1F0)3NSIgxxq0V0_$|iw%%Rg^YLBOe@g560?toPg2_4)KdgaBW@2)WF z$u%N^?N*qPV?8$Gi8T|Ps`v=oOO3OgbR2MF!r2LCkh)90M~9IC{e$`gc`8+KKdc!x z4RS=?A-LE>G2*&Wp`@u-jb&|1sWTDZZ#nJq&c#a!`}>)EC+*vs>7TX)2V>u}53@@) z-nvFM1#{#+5euvwu?8sk>%i@A6f>3U;!nd9_=tT7 zmY_>;s(sZ`fveVw*if8YWs>-P$4JPRE01m6S3;?0wqCNEtf1e*`?VY!4P4g{Uz^Wq zX#Tf!Bs7=3WV`iK@`3zHOVl*+s!=5s>zVRX^P5x-`P@!!)w&OTcL~fpJ{G;>tkNDh zJ0*-S6!OqeAtm@k9`UYNzx|2iN5}@gZ3RUR4J!6=e6YUvqr3xCPn)Jt)fm;~GB@<4rXH&CI9ayY0zn_Mpy$~QY78c#x8 zffr~?uv^+N%j7?VSKENx-v-Q_yJSD{9qXYQOoL3(y38fb9RPLKJA{n{MYPMRHs2DA z77zVh=h%q(8QFtRUEnf^PBxzWjVyn}684dg2{8BZtT&0lzv z5swtZUAU3>jpX2ui8|{$@mT}KM%>aKc+vtcU$=WxpZ1-QHHeEoVOO~}cEgp$w*Rwa zUt#l{xK$p*eX2;jzLd+ALv-K@}WMe4M4Y4HwJk$vr-?Fx3y^%*LJ8RZYlTnv7FvgoA?4g#xB)TR6jdj$K}jg6zThNA$Z(Ih{w>SyJ5PC9C!wQ zp~W0VHP8zoh~y5PJPX53_o;7M;V-Y_a$uSqQ!=Pyy#m~@Y3wq2LKf4p*eoy--jR%T zmyS?|iFabO@m_Ju#|U&EQODRI@GpO{r?$_?3KymRF)1S{*lA+&s=A`&N&CSmc=x!a z439y=#oblHxSaAoRd@&N4oo~+$y%hS4qF5Nh#O-%C(TZ-}v2y|Qkf!b|P@whn?} zG`!O6Vkj(&+-2wVPr&=j(Q?6$a*oa;UDg}=frJy`;ytwyZXU_hAa;wZx2<6}?X!Uh z^u4>vQ!5RgeP><;>l}}%7j!Liq9$>^JdO zPVYZ^WbXfX;SC+{uTqxP2Hy`xk|%)WeOq6m=A?1W4Gi34^15NtAFSJSfwfHJqEE33 ze8sxJPJv$Kk|iZy?@^v(Pmu!BMfZRo^cCC8wbBo4zwmReos6PC(SuYv`kRo{YtV|= z6xha0G0pO;6=II^{qjX1`?AK@?4J{cl(EGMkW}orcKf^RM=@>=cag|Du^;x+E`t_$ErXflUq%rrk6!o#;G&ig-C{KFH zkMsl^Mckz{^HBF|jnG#v$R7n>Qv+Fgp?njxv>V7bJOe!-%B&u`%QP7;K8l~yxq1Sm zeRqO=_>r_rN0F68LdZGt&h{FcAwOfWSSo#A{&?bAC1PXb2*6=atd8$1p?HypwV?DU!)$2`WKaR%}lPD(@V z0#1d^`&!Jpzyq)RiT)-eBRFVZN8dnmXHz61)n43w%SUp?wwYoPhoB=biC2UF&a+a8eJ(os! z7dB>h@-mOvQlP(S9Q{IeLX%cyPy@x}n=0zZ8cD@NQ~4OxO>FY2JdRXjno#`DRnzg$ zw*4wzY(EP`;{Cn|q9gloyy!cmbakY(t}j4zb8+6R(n4W;d~jZCOo_IUUy= zWWHGn#DE4gn%$Le5%JJkzp0-n?Z_I|tH0uEpo?ct%-5b^ZNVF%%jPdv5!=Y80*N;p zeT~lQjj(P0q#Wu_AUrwLWN3yRLY#UAmTN{J@g^{Elw9pl9F{ZX?^><(8Gp=fu{PH* zFGTk7Wsw!O`yr#eX&sZL0;`t?n#3LH4Qzwz%sq1*G?6AWJV5Cu=cBMM>^;8`?SO+RZ(no7q*WlxfAYfH;;+Eg^$gI#G}GfGUib*NlGQP=>ZG z=|^zOsDjS1LTZOCa)fck;m_>Dq2*V)jPJbvqCt|pZU2Vr^MAAPeA!7IVJ2EfXDion zNoms^L=tkF-Ua?*7_kVh?K@Hp+)+OSm&szJktUfee1NUd{*bJgXtjx}a*ci@KEYY3 zk^ZjavZVQwe22GL)5JS{3XL@@%u- zml%6WGu`pumRZONv|}H^|B_-tBPK9Q59xSf1h2r-%q`%-Jy345N04BRupeN~kVn!c z74OT?u6srAwy*GPLy9|;2pjBB7mZ3#KhnkdV3FS=xcwd(o-S}^c5z!| zf5;~r6SD6JV-s!D;1Bo&dRQ%R+9a9RTU960tFEEH?F=SSGm>bpgtoU*CQEjbwHI-! z`{Fl{!E5~8hyfk)o!9}L%zVP4m~O2b`zSOi*}{tNNGl0ckULte{VsF_WisdXZ`@n{ zGnZj|!jI73Y=5LWO89pS|i3R zHYhfilam)?+Rl2&n_aIn1cIo(e5+z2XN1h|<=u zUKYfR2mUXj3h&xPn7Ut+52-jjg3iI7;t|v>;0@#w>p%;&`5u~W{>6YpW4tbWN?4@7 z8RrxQ)a@DIC6wW&eS%BH%A94MSgPl|P3)2%`S-YdWXw5xrH8uvKV!-$x2@F6lZ;94-g<5KV%{tIwete~&E+|ED3N%cb)=VKL&1L3l*+9bYX%%s z&&XC#?|YRb=o(lQM!7|`fy+bVsT=qVHjkg_GUPA))-vRn{8T%BjlZw~J=6Zi=qKjn zU8UFE8)k-s80U7$IK2NV- z%2xYd?Q&9*&Rk5VRD30rjlOagA~7r6bL$w1GCI^U1lQxSQ4FR#`a)a9GmR7@6G_xF zkR)_pPbYKLkJxA9n;wgQ(|@B`Xsfo16w6-KslFEvj1r*^3zs{nSSyA9Nk&|`XDba` zyz+?qe5F?5*?JFR9C8RlcFu;J(GgC+F0hoWVwI3Nd?#o|h8r5h+`4X9n?fdZhKROy?-JNk|Cm8-K}QO`}8C{Z_PmpM%@v8&i%XpfoWsMkx$ zM_PiJWBTC&nD|23o)OkXd9# z?S?&6ExrvW&n&eIRC?1&!42ycf>NirjfcukAPbu3{H+Q>8&?HyBFwI@5ye(rTs8!j0JF=U)h04fdY>J4((n$(SAyTk>yaxwO z6rG@|6`Z`~yRT&n)&4My36|QQp%IRGGLCVfQRJbqO)&&)E^X6+yJVd^+$`i zqK)e$r^ypr3^LD+S!XcyJhM`eudu&JRZ{34Bb|*VzaUHGDda4Vefgf3+Ms8ZNiepc zms&(xoLO=vdoTD5Q{_n5pNyF?WHoe{MA2SQU>cDr{RTIt$A|pH+xTZ>74Zw+M1qX? z?)c5Wsh2-IyS^Uzp?V)rLU~&Ro6Tj1?wdCpFH{8ijcq8M^gh-DTa8uux>=>W0-@*| z;URXSmXrC`3iTO0)p1O^`HF}^qb(a=gG3mwh}__PtW25#I_0qTU3;qM8)I5O@xVG^ z!{|(UlyxH+;l$3yGE5is%Akk@@Ya08pW+$B z9U_gAsW03yKg6v%uEO?lOsO^tWw=WyUxj*U5?UMve3G>9YqI)+Nmzy+VM_X*)u54l z3)UP`=j&v}ztuLSCrX%j zO^OrSc)Rn8;WJGQLX$mQH=8#qyEsJi-Y#IgFa8KqbYWgowNJxEaX`$=0@O&48%k=~P6kRc@$lu5bmCN)~3;YSB(UQqr_8mOO z14fHhDwj$nVi+`As=*`erLhh_9Rg3?67k+@=f5%ebgw-Xjis8QnXiP(wW9Dhc&rtT ztBThg@UMyc;A-*ek1s2zKJAbN#5@HAH!aT|3%jW#y)FEAX zUlU*SF>c=Wi0%(Wku>?Kw5dd>laMHR zk1om#8fCam&`Hr5{1>&N_mZl#WUi|YT|(ZQJb7vjk|)+%;sa7myhN(;Do8z-o7u<- zP>fHYiDruyjhkd$@T*oUM2X`{yzqjg)MmS%aIz(ws@)=Lz3-*39^~SivhA+J`=t&- z#BlU2J%%2!TU2MrDl_i-MMO9zux!vV1my^LgnmfF9UwdCo&`)UYl=A0Wz3Sg z!XW8_CyDF2TbzQ-6p|NZW0ia5|t4*uWo{?bvJmhIvhO>RIX!(`JO> zF=#PNbZwwCbQ!m_MWfI-)8~;K;~dhI?btEdgFoUuWIxx)BvGC8GM-G9qE*mWyNG_! zCEcsOg!hVDc8Qz8E=88ojat1+y>F;ev*Oh9)n!A#czu$s)(&VJ{sGSpnWWBL8}<&z zOIsGPj2TLcEQ@EpGl>c$sxeAEH2KxSJ?b_!iS$vg&?+(yc|nGw*YI;@3rpx^SLe~pZ0}vc&yPwa*Yg6J20Z}!E-e)qS!q2ehZY6 z5yPN6{GkO?NV^NNRgJhS4SdO*CEa!`Jrpkambv$!Ae46e>F5he3Ke><;Vb`Z z3~TnBI}r!{hH`M+-RIZAjdDu(4p(yY=R4| zgLp_bdZFBMI!J-23REc;x$ITO#8l}o{DxD(i8aPkcmXOyJ3L4{p+DHaf6Xd6j6HhI z+0n1CDPA7l=E_tjT{-A6NyG8n<9>qfYKzKi@Z!%u6K>I;}s_3;AxUNA zM8v1bYvGgp4NN>!Kti91!0I~>SW8hQ@FLH;it!v8S8g7ZI)AriA3G}CpT~>F6}3q{ z5Z1#!nBSG})C(xEb23sdsFFPCx+`Y74Eehlt%kEK{9oeamwxqMpH2Q*XgBbhczBsq2o3vGZ=F5l ziHDsJ7=uuSd_amJ??2MB#}ylQP*AH3QOA0KPaYW_nSO}tSaoc z2i!-lF6#yCD?MfeYog!GGeD+`w`ADq-;s1{SpAO6h+i4AO6Av~PBde_rw6#odKWh0 zwEr*Oz37dOYEwG?SBO(IXzZYNAk_Q}QDY!f9^5x(jz8&N0~7x2$+Y#66mMld-T5AeZ3yUlt;3Y|iw5mLAozDJhC zB%UZn8>gMW!KYRi4X5XnF`>!(*X?&jM(hchz!Zedm7T4BWy|_QyWV<8B{PZZp%l_* zJ`{`5Dag}h10l65beF?v3U1@YPK)?jN>NhO-*StbCS;LS`h;)Vv%nnrXx&#JVXme) zYa|hxo0oY@=&n_70y)9C&L~iKuCjXUrjw|Xj)RSF7|8C;tX#ZEv)!G}LD(O)UzZU0?#b^V%L%{P@8<2o%i_$bzSeILX29g~3AS4_Uqt3h%SVC_@Oo^iToj^e6DrvpW z28q#P4FpU8l@ublDdZjNk7+O!bc(o)c>HZ*mkl zZ#UvJ{cMnuvf~>kip7VnkKse$zxadBigm(w=_PGe?gg{aL})&^%bpy?fg$aOHgETP zro|X{kvob+hIy?)^*tE1=4m~o4Z9&TJMO%eyM$`#3O?;*q6+gO{bQVjC#yH~$sW?b zS}nlEk99h%1?MrjFPzeb-qeG7Kfe*w^jbR*+;?5z%~4Oo2E$rTHaZ<)>1HwOw)TUc=oMWDe|x^M31_i~ z7IggirtqD-ML!8)KUj^GZX~eJ`a@-aO^1I~Mo*-BG3?>;>`CQys75HF;7j9_bQ>4R zUeM5ISp3mzF*Wp>Tx3s#EawWo?r8WoYUGKS>z%0c_#9P@1=x!8I1%EyJouk2Pe^xu z;zs&G*|R%56XbT7cIs(Vr-}Z{!FF#8o5p$vA_7QJ}6v;S?z+gN-M=q zo~}H>?J&DZK%9+3zUQ%gQ|`j)u6Dan+Jr>UEa}84LXw&rye$}qiGFxI{hO9QTFYvu z@{~ML|2kPXk>rBm{j}|kdL(}He)AUNzVIefQX|28DZzJ^I-^#T-RF>_3|_cb8{+;x zzZVx+gGz_kDgF_!2?p$BbL}fa6RVbBrmU!PG;m5bA+z<)oTE>V278*t~l&Ymcg9(X)X1)Rf+ zAmxx-I!g^>0a(`6{27mic3Pyc zBj-xQ-LB0kL2c9N5$~}pkhWl~T4BJD@5IschFu@PfrLOmq?%tHcbaX+s&(70G3WS{ zjvQd2IOFnfav`F{^XA022wf`lWC-JMYO90BL>0_>>a76%Y57f{DOfr7ALkc4BZfnZ zKLStKvAoe9v~D=D_BEW0#z~@hAIwr8#4_ofa$m{R*4#I=Ay2*X4qQHM!iH{yR?S!c z_67CmE2)F6@+8_dPLWJtid_lbgZc3jVa`kurmYHA;>;S9G(qz5ErYE&7#X8+G0eVi zJJ%p#{~4@k>Ac1E(mIr9?n&{^p33Cw>Y|oF)|Fc5o<6e2aJw@~uHbi~CHy273!?o0 zp6b4z{-68j_u_)tyXo3Ws3&?U>~WO(|Go6gN6xEW*JpGfehmcKobOL)F*vEOnF0C& zd`RbMT2Lijy5)X`<2@~&LM(eS42H`?Z>%c%%NRnt6pI?_mP^IQidT`8ui_KA7_H+D zltEV@36c*E@O{0A#p_-0TdarH>ySJL_8*@*00|?%`5xU04gv#%hQ{F@SPO)qBsMDk zfHz99xPb4%M#(FEvkTQH?1Q$1*1<6x1yi#XA%Q?gn*@(@9rw{k=us|0%Bhm&p-+%2 ze8c~S-Isxn(C`|=pB6Yk?jFjbujsiF})#b>O`=7?~YW-CR) zpleQAcKv`P(P?lgHOni;kZ{@BV?O$nf7Sb$9N5s$8W^TuTHt|NYZbb5d|AAsj#Dm; zTDhnmL1tc3@dUgLW65uE(SqhosD{1NNAmPco>yn_Nl3y!5-w?ASPdwFD|`(v(JxYU@EpD!TA-DJOyk`#PDNN2*0db)H8=qZ{Zm%O0XxbIUOk?} zJFHs$qFfOYwRie?m;+tY52Yl%)P2k8f!k9I^9sAxBzuKY_;2!+oMSUGf=>NcqeE{e zV|oYd72bNsT|H8jE77jTMQoS#gFmfQ@GBF>9U&&<(HrQ+U_9=z;-muffmFhz=RKZ> zxzHFfSz6V{#+F*>@V7E$BqAbKn<@gi2 zEJZqRgi-FXtF1*!^-plu-=sfjN;E<4M?55i#3 zuhv+%Jr_g+Y%ZtSqWGJJv&TXPE0ualA8cgjZAln$#_hAx61qX2$U)jH4(J^WnG5E3 znn-`zaWFCQp!L8T)^J=9%44^W!##a0FLDK%WxWxt+JJUdsS+-!^{7ZbOLSUF0=~x# z`!5>@=3S~=i6|???7P9m&?&n#6rt?ck=`H5P4^z~MX7h2l__oZ6V~s{1q}K0aZA`a zTH~$~&!P+B&EvQ9!G8MjxqsWxBy9>l13UU#c}h-|egdofvr-PMN}rkx`=K9N3s03l z1zW9%P~ov*yY&q5JSx^olyum)w<~R0it|(aZoalNSeXHqKNd?ah*#MeDcSgqzK1%Y zVH#o9uzsrp_cAP(I9GwS+Xm*&WmZocAYqcD_Dds*+r5q-xw4$E(pwH(Fcf7s;55pJ zWH$&e?Ef6qU+lY1BOR76n|o@JzJ#Yk$zXoV)UjO2w>*&=cD?ZAlRcTEK6G6mkN_>@ zqu|zfe%u!74)h<*()A;PWA$)yi>)H~E(!*&!!M*LAx&N27u8ergFI?P;e9@88?K+w zS)37?T(ja&{#y70uAhfNRexrV>)FmSYsZqbDHbVk7?w7G9M$D|r`4mc>YgzHIg>u4 zjRB{}%4cVwt9k}XJ)hxuRdk}#ogVh;#34`9mX112cDV3w>G+(l+n5N-Jk@F!de~b` z`Af2aZcFc^IQgY(LhRBir2$d^H_&p}jC2PIaJ>Jexolq4SIAwvRL#ZxlAk0BtvCpb z+tc=n(`0?H=ABD=ney1~R{x4gq+O|Cvyi#Uv|sT?D-KdrQ|JNP-5)&+RGE!vsD{Hhjw z)&UyjkAyrNBVU&~T;H|(T7+jFvLyrNnA3I~53QEvW7wjY>r$QAt-N$`$mCvN&C=R& zuibt8+}|SXA0?dFb#A$*JUcc#-2?YSJ)yVY`|JsIiQ_n)ENjKKC4&u)Cpv`&*Eqd! z;;%BVl}5}8vEh%MZP=||Chwde_!jdJG9NO?M(R)5?C~dbDfnKvOyh(LXbi2RTDA*B z+5ebAF`*p#Fq9`HJCQ0^5AmV4?)b?QI1TQ@=T)V?lB-FH`hk{98RjR)vY)Yd;k2W=W_JHN5AE|D3vAN(K zD@xDQ-N-V|x-taAUF+(XrrlLSg7gX4{D)wfUh~GdUx`(ohR|0M{SWIgN5)~Twc`Kl zB+@GQ=6cOn4zaS~^GbmR-v_)cpI7shLTy#KAjiuA;Tt$z-q0mF8%i->K*u&5_Wzef zw@_tYCNn?^Y_qmQKgFB&X{|#_Rfe^zz&5W#X-cD=0ZrRvIw@kiUunPzBulQg{lX& zqW~zzb!^=9Im*qyP=G2kIYlMgtx$j%R1AMPpPi3r?Hw z%>$|dcfM7)Lq>%>B}4k8ymnv3-6w)pI?PU{ogVv_H6l#V4O!z6svn&ri^4by@@RU& z{sM-S2f&Z;ICr4+SAqhHffC$F!aXeorWX&$C7{Y!pQhPnT%ZFz?^jhb9X_^M1%4Y_|Ky}d&Yq@ zNfVq-@`**ts&fwa@+#PR)#Ddz(i!LXLJ8Irzv^Ey{~Ya+JN6G{Q>h_O-1V$ien;QH z{l3u&T3!_6WC}xg7hi%~>KagAc4YShfmE8$L~ z8jJr3Q#jdL6GlRrf;W`yTsvMcqx`eLU;6T|6~7HGit)}U{Js^Z#6`{ZQk`hLW7R?28cJ z8*e<#gsX4leN-kaq9*&Ic8Ds&-nx6Ggz!`=N*xK6Q(|?6V(f3$9xZn)b`vcL7CJ9H z$7KwtXVB31Nf(7`$U$C*-D4}iLSLIn#-OpGZ?pF_3uwcUs9Wi>TPL5o7Aq!y63$U=ZZF;3(xgiKtXN@y;MK( zo6sq}Wy48He*^TEpkB_hSqJ;UCy>vs70>VoV6?ts?$U1kv*91+7L5wVD9%5Nnd zS?VM6J23w8X_~vm$vyEy%apppQjEJ&e`wLHbS~&Ug@K)le3t7yy>^XzB=Csu8!N$LX$^QpRK9;gI*|>WurrV_+@$$D zTmKlW4mBNKweI};BCH4ADe;&Ad-E|L3`?`x@ER?IHo-;fEH>B{{)1b1G_XRN$TcI2 zm71D~^#pw@I1q@mKLvJ36@4Y`3B9nZY{XHh4mYA9@&L#_n%G0UuCwfohnPR)6jKI@ z=_i^dz2{Y~Ug?f9qP`X?#V?Q)?iPk=toWH1z&SdP{CC$?g*;O3yq08X7I|H(hF_|I z&Wzt^)*m@#MlAYB%gw9S-=H3NNDl*P@PruxO3!ccJy_uE*dNy88WQ87+fgN8>#_BYz^)uP^KqDmabsAz9jdc(&F_H&o^pH>jCS+x zE;g^dllPoy-^{S)zH-OYvFY;JZy?RJyE8NA1*DNGrc@jBR>VP>qyiECzo zl7V#T58jtxkq-BZ1F=|4mV#22yrFu4y9Y!JTx;|iw`g(TKp26ucC&a2OO+IvbXfO3xKK;D@!|KxG z#T5QSs{kMJIoEgRqj<(yc3$&a4zZ_sHoXR)ON7uOf0UYCBicLg9?Iqv&o?4MpM+<| zuA&jQn5kZ3UXo82Xg@!+I!QZZ^fsg|8c*E8T(e#;4qR}aSzk#R*@Hay2+UIMvJ(3| zDWRQOtn=DcOPg48qZbvr}`MuBWXNdxXFthZnyJsozv$>GocuN>ak>R zg&O7O&a##w>hdriLs`ykI|!$w_jZX~CJw4Tca%8ong>t!L)dZcnwM!it+WP(CX)e8 zq*Pm%vV{TVvrdKn<2G6uDlk9Ve<^GRoRfkq+!q><54wi%=G3N8q~_--;=0|#=Gl9_ z110KZ&UNbo8=|irX4i;4!j5uFeyX+r%OO&6!=xzH$#;@boB(87LTD3s43~ja5{nGg z68l}x<(txX9I*GS2l_)uz&tpf3RDK4n9)WmIL3kWtnA}?&Fjoa>AVa!#cQmZVALel zis4FwlBj}LQ5gr~h^uTcv6#4_=&4sLaNU_wYtYpsPFqZcFvTs2C$NqHC|5T34ObEVf%U z&`G%h_S|ZA%gJ><2>IY?yai3Wd1uXOx2FWdK0|KfNSv=U@T>BGzQfD?vw?zO=}{Y- zG2%!TIC!Jrtv`ne{03@aa~}<yH(7?=QMy2Vadtr&#PO&a>j@O92U=VJSpw}y&ou zKd@Sstp+7v`Cv;hf}?SaS>Zek7SL34%v|B;ZSJTjj=gqL>_$2YeT|2>kwpP7$xmA0 zbag{$BR;e&cFNySojV>*zIUK&yh~o7HQ|YPmQJ87yUw_W-@pG)i^;6h2V7e5GrHV&Lf`2*_rXXkNWj%(@ zAFmo4ftll*R^`zsnh&%|JJxCKjd0UtX#>j5@GoLI5TK^C$6^QEvi491n3JzEZ2vOL z>{7d$<>55Uafy5b+HPO?46w$k>}(NiCnO8qvY)e7|BiX-uricvw(Cu5Ecy=Y#5&RI z9ss9UgVAuj1)haI=Q&U29nvZKL`hyf+5Pc5&7B->H{m;)1T#3ORdpNLt^ugLYydyjho+VFNA1Vq7tV*>XBWX;wPnxRhrt&6_VEfm2XoMT z{WV>%Vr_}9+nez3V&G9{C{u1gzoj*}?^cQ`IwLpOjp8Sk2KV>^r&?~pKQZuMoO#;J zwv4kh*Y=xm{;;NmZhHh}^UG`o`bZw}jg>Doqc=je%xNUJ-XEc#Vl=-Jc1ZTU*mKF% z;=PP3UHe9_aOmp@E&D3|U82jrR9SYovgnbdniH+WuN4RsCRu0s2df@9c}vHW>JwvH zd591AJ=JYyDcP2V+i5YsWi%N(!RX`bMykKoz8t#E-_ze{*clMtl6W~>CGwW`L)p=C z)J4~0U>4Qu51b`|96Xd|Ny)D`69Um8M8td{VB*zoftDnON*x zK{uT&XwW>JKSl8?HSG$opQ)cT_m8;BZ5Zu{5qDty|T@;3P* zR1lBV!Sv8cz0|G>4$BqRVb~$A536y#A{WB?L(i1qbtcg>UVt^JODGPeI>AB)4ucwfAalB74FFtmcv#)wm)zf@-h z4V=pF`8&e+4Vdpv(G6h<@+n153u|(|TBX2SJ7p92y+)FDm_7cLde9z@K+_HucAeis zGfEVTIFak^XORBcfS%|{`w7psBVb;)Ih zd#m6`2QO9uNOlby5|F4+`XWb2AKX8cJ~d9;<&~tu>b5*iwAm~kLd#(fFQZeCZ~ARd zz$qK7dUV&mf{N@SY0-Eprt9z62OFCRPPD(|ev}C`o(oPIdk0(gUZIg?J3g4QE?ZrY zDH}kokjdG^ec~{=1udVqQh^+$zIJWM8DUqP1$9D4yxh1M46yB>=0wxq^fc_L%2}7_ z#amjx>#FoEtk{NMiZN-e0{8SfwSpgbg_$AjvM8ZS$U?EgSpmURECw2V1=1_LD&B*p z&I9;n*4n)^*QhYwS>?fWaovo9?9(0m*afaPxz}z1+e;jn=AJuWu$RAeqU-~nX?uAx z`(fwudF!up+Wf#@(zn)t5NjpE{xl6$X;XTI_RBmed{hqE<%l`*+^wk}*kiE<_{WpR zJK8Nw17o!xcoN-Y-+FB3IIYKv$_Jy+&3Y1=21E6T-3Dzl%q!u{ zb(wrr&ne}=RM@oK@^auS&{v3&X7^D@La;Y99G+--p&}`tmEf!RuA@2W!hJiJ6d+E5 z&|KUiLAjk&K$qvTT}IMFZKy1?V8^p@wnFm2B0a76oo+a{q}s(w0>7bM5evjNm~df~ z!0z+Mwk*72?}>~O#AxWJKj67sWyv(wB-Sjr5qE-9p-pCQz;GIa{onM_oxgz zOZ74|Y6HiGd_DA@ey4ZrF=#DNJChpr8|$vK&vMCmQY#I^X2HOp#J>&`M}>>zr1Zj> zAotiH*vBL63=YNzK8QYo52yhgO565rUH4Y>*qwK~ig;<*7!ewWUAPKhUb+1pc7Msi)CZ<*Igzq_{r;bE-|NkQ#xh&<%Hu zljgpC3VKQXbi)2@%jh00pA$50=0=Vam0nr6^ZCm12!@ zUA`(^5D%5xR*_V2{E(LFIP?L$mHjvlHqO&PFezaL5+ zPG-N^X*Omjw|?m z^FiQ}QehN@?Gi8S&i!URYty&<%jTN@xAD?^AG!l1{35%>X{Vdud+eo;5I7(>H$U5- z&=u#2v_~wtPim1S#4#+Bhd@04ExZM8(L2-Qc+63!kaY@|#AGt0LRMTIB0+H-Rlr@( z!+xV08{r5pqlb_IjKxVPlQhAf@jbFB-WQ`G0c6Q=8-&j1o*B@6N6%4l;D_wz4@IPo zu3UAz9!A&0Uz4C_#w|wc=OT83M-1)*Y zNC(_QcjV7xOo$adG{Em0&BjCUVQ&FTu+Cem~sbp&F}~2dg(1?h5n zoHfDEx5NVs?G0&_mykT51vfeCeAqn0FCTXpw?bLR`A)rlK^S+oX_hl>EgMC`y!k_V z3GB=u`06#7*6pDh_fHHNH?>N6;F{z`;!FDlJQ-HlD7^9KfvGP$?E+zS&V3+awNoHs z{@1#B=trodH2ym7bR_R|E%vj2yU_sk1hkrpI;kVu% ziet;x3g095fh)pXOB_gCK%%`BICK1f?*FS+QUX6c9`sR(QU{$K)w0r6*?OV$(bHl9 zr|cd~x;x-cIMd0uYTyL(T^^S&NDthz_^pyEJ_c_6HeYl%%*b%Icj?ySA$;L)F zyRGj#8O9o!fm`Mcfsr9#nyj-N+hZHY(>Tlj0&W%8wN62kXT)3hzRc}q=^i+@v#m## z4^kUxs)U~^(b^jBaup#J&c2P(7>7Ql(MKbKHU1aS@_&I7t^0x@XBwZBmg9K)620dK zzC@@oVh|@s%(>5bGs3F0BuJ11WN)wlEeCq-W%IrRJV4Z744E&1CenrKp>uEnQWGD= zE*!2trkzp_Y+qXJYF^|layR}+Cz3YGf*P_=sbrv=`&}}+BZ7*ZDUsm zXV(Ra!dW5uW%%iqfs8h%z*tpv{?zkLT~>o(Jw);Z`KsJ!wxY(+1M`XXIhaBEtOs(8 zR3Qv#=h+9b2AxFvq)K4WXYQ~v=u0*ed_WG&D4|Zc1KSxHNJ;U+J}MP6h)m}33h*z3 zbi~YMPmDS+%Su8guvFfF@$pbfk-7aeV z$wPfgr1;D0(=NEu!@ki4sqHvIUpCGi?xFL6Oq|KuV44`~5L6*vaX!0Z#Z~2;`>Z|f znmqR6l;F5^ja>#iVLpx!uF6Gh3GE1DR=E44lj})!A*{MHLPbai2eKbd3T^TjC%|{` zz+S39;PJn3&V-g-5mJ|1508*?X(1FRy!GGJ zr$dqcda$cROFa%yw_uYuC0)a9f`-3=bz%ZKM8(2wJPvuiyW${h*QbF%G0Y6%5&LNu zp=GlHHrp|Xz-$5hMDYE(%`{-tei90S9D?Oh{0XL!9rP2+G5W1Xp#d`|bknGyy51}e z&`HlTe92X;)Db2n2r@~=0cg8a%h{+(o^Y;1D{NR;gZl?IE?HT6wV_$J&AWE5-2*4% zBt8qy5N?gSW9_eQOBltq(t?$YFWF!DH=!K0;(eG8ZVD&OA|7v?27kdxpm6s(7Va0@ zoNwX~y!A5CA#YROI+splOFr+G%YbJo4t}Spfnoou5M#Xdd{N+gAHEU*UfI8@K)UV$ zCrX>HkvqVg`wh3>bud)RLW%YncR26SeM5t$`B`fL+)v-_3Zxl+6d!1?ZyBG>cvQyw z!8-QCwIkmElT@@8t6j#iknYyG#`b9^%tEsGK`0J?0M5V{*62LPGocOKaXjnH8K2k_ zlU^=MAvussI&A}P4?El|UWO+O{1+;B&G*tH^A}L5x9M%ZqQ|0`V5!gq9Mu$B z0KM--ICT!Pn^LQJn_L0Q+!^4FjPnKOP|O#KwE-~f8qoSr!41Nwa9#OHg3vHL?GA`u zc@vNDLH+=m$>)P@!3O`O5cBT@hOM#V8ms{^qE1L5Bk~WDs&xo|v|Ji4f6_~#19ZdO z6x(UMryB=cUFu0(qEwovohe{rLYqkMHsbkPN$Y5LI1iwmdqAuJ7tgesFuoKDCoguo4 zVy!DU4t#nK;A~xuPMXc`PCDf^gj^+;T;u_M&b&ci8TU=YzH1Jm6-cqS0+T8U8rIh> z=qaF?@BvS@Mk8KY<=Rs)8-Mce15a>Mp9&QlYxb6&qz=-N@CETg*c150A$83zbmnk2 zD{v8URej=0g!GO|-vV)cjb*Yd=Oi6-N-Q9eg6}$<`OQNi*T_>!X^N5|{19^SC%b~j z(-=FSU4rbf&$;ak2v_YqFlxp*FUUhOA+Ncv;Uv##yII_&v39nQ0rbBI&RuC*XcA;p zZj}3ozXx1M+1O{zN)qH~Ai0W$<KIZalDE|Q8% zq*~JKo|n&u-*KAw5-`k-%BmWZmq$xQM&Q`7BMItGMFtdH3 zPCN0+ZQ6w9=nL9xx7uk|1s^a1Kx>V&U)t;ZJR3l3{4Y;OSL{}BVE_}v{3@Se`R-fr zdkko~@;&!9n~^q*UEXRY!!70Y! zsZX>Eazq}z>Pij{^Od9Fz)Ilj(M2{DS{9%3U&=4CrSwWU${A@)o+iE0HK1**62H}r z8sYSH9=zl2YM=ZPb*cOMN%F|>@C9_0Ux6LTXSs~~oeI-yLm~Sx}F*@m5Jlu=%IffxRIs$CpH(#Q+@Pu*d=ksHKkmTykaVf zztgs$$1e3(@~gqqkPyrydDu%zq%t%N=BT&gD_}h3If-Hv zx(12<74l1nCH24#dZq1)DzLg_wF&a8Gp zFT@l25Lk`h(-Gw6)957-Hg@bjVUzCsXCMMQa;~^6U%;K@5;Rq>pa=W`JG4^4BeEo~ zvIp{eiL$Tq8my((tfwrVH}YEEHY;=^CEN^t%8gEzH=Wqm(xxq z@rw&efooP9bCl{;(QqIobl^B?3Mhd?R+3)K+I*EH;rK0nVaMu= z&fvdM{j&bW4=Grd8C7s1GwjRB1>WS%HqIf$^2|K^1)2qWXdF6IzpN@Foa|X=)dgWp zx+1OfQzY4n;8j+;)ef|Qc;bOv_YLtKkCNU|Afs5t(EiDXoF|6WBdqB8Rhb3B3nqjnn*sKBq|bPp>SchV^+CMRyoR({LXe!O0%1SZcSsgqOBW>PGPRq;NjCt;X>vtw8?D zzsPk*NzChOI!cF)YK|ubIw>>Z=fy|i(Slcr!KaWPWw2p(ihiMumO=m62`mEL;unRt z%tGnb2wygv&0^uAzN#TUujMFiQmr=ezi_ImfSF|$5XwHQRjAzk%^6VOX^zK$q1VZO z!v3)U=2=y&$~cI(8iW4hD!KRF%WtbUjQoqxxG{CH9hW=*t zz;%#=>&MT7&;Bj**S<#AG&}7DznS_9EVE!Kf_!uX&T&fd9F|ax6v2GrC+fvZ+<;8~ zQ|AMQ3Apu=CkL#+sD96vj=26t{7sgHYBi5ZutC%LPq7^(%ahWKQ!JgdE-|=khL*(p z)?a0XoFm2RCHuTo4;__6$P`;d5|&AW*oB(KO6Q3Hu%u2W^)G6$^a;HvOP zzov}wabTy{KudQva9STQBG1L@#f1k2$aj2LI=>cwKl4pIif7ci!_= zI~QmJBVg{ci~Ko!nyq|+ykpPQI^cl36K}vi<6WTA%nX(URrU#-1KDD~oa`xrQo4iI)8iM1#wpB3K72?Eew;a8K3RxP*SwaUa5dxb3E9J($oANz#@;{t;}176@B zB`1~Z(B3E%%Fq)#26n$YK;T+%GM!b6Iwhf9UKBWEe+33Iw65VDo+zY6l*=EzuiQ6e z9Ci-~UCICLUd&80*_aDV>luL^V_d&(C9q=qEJ{VoV4{8CWRg*66Stwi(q}RQ{mKA( z3Ba*^{>XXCw{R8^syL+4 zzmXqWx0t0=D?glC;h!#{F#*DN^(|0S(JEpVrv(PmvYJa@eP-drgytUp+d zFCS$c_psQ1-R_I}1NTe(h<_!K{%QKgcQxp?fMy`+;3$XzzQKf8FSIyq;EU@}ZjfecY?IXK52Z=%c0+2ZtVpASgA%T`(|xJ0_c|V&=s$| z5AT*byz$DQwx(K&B^gqjV}MEFTIfaK@F@Ja-G3!88%VJ#jCSFGuaOn;JNU?=NiELM z&XNnBGPy;O;HE7J)h4vXtUlea{XjLi;KUf5Uj)X$DbeHXdlu9Kc%BX@E8Z=vLz^NO zSVn`^A?#QW;Z(ms9>Mpt2fqp2F8<5Bh;v{*0H1K5edl#xa(@f&;t617O|T8ER9JRT zDi}`WK5Ig_7|JpK9CrlW$G+gLV69O_k^M}>g2!8-J_>I}rYzE>% zioT%q+B5FY%2{FB-5YT?Z=$eo! z+&~BnvOcX&ex)&213sl)qUQv^nL^{??S0ER$7)##KWo<7&Bmhnft3QKuvdtXTjefk zLwZftu!SN8kFyKkxP3OrZrSsePUEb63aJ+O^yAPCiNI6mu{6)FlU7!TBJjF!MqZY# zC_m){$l?a&b-X0T;U1WB+%hYzwSXM_6j zLugoCq1VJpo-Uk$f8!psnFe5+o+YG{xA1$ag-s$YQYXK!#HNhfgPk!O{CDcu!?&M8TBg#Wc* zdIw$Fv-~@F48J?mU}9ZHKUgOo1`2xwnL{xB76|IarO^6?*|4xAXksQFA)kOf^no;l z0(L;ZXgp@IbQ#B?JCMBiE3YVd+^w7rK7m$tgTGY>Kk9eAhBH^0-ZSEVGW3XA~1?Q^7?YSII{K&o~A;+MG6*%Dh}lDY(0n!jMW z+(P5P7Z^vs`AhQ#pY_$4XAU3u=R>nc^}qp3*Z=r>`3uPV|F)3|-gi~k zwxm}YOs0T$_uEQv;>;}m0J#6l><*8D zPTyuX`AK`t&USLFa!5Q>!D-rubAh1O0-MfdwcGUpc8C%@KW;lIw2M9gXZl6p^R0_J zWLwx(RT~&}^bQ$z4#*ZHBs+lAHXJO{GxX}C_dLbF1D;G3?39;yE4xVVLbiC9-4na< zQ|OfCf}?1K%u4UYtK>DLxrc-TdD$G6--EAFHr8mHeHVO5QP9Zsn!}LMpK;3BBqYaP zvMWLw-4;fTB|Zk(jK9t}@TFje?%`UW+vn}oD&T4H7+RV)Ipm$JDC?$mQolrL=$E~x zL;t~ChqvtjxT@-Tg1cKfFMrgQooCXrv+m@PGWc#SlAnAImjGL)63+u2`HGVW{G~0L zXO25b<|0_yu1n`}9$^tw${PsO;8`4alN#LF9a>KHINoO zpp(IMCBRZod{dLc-g`aLq~|=Fm$Ix2oZ8i3x6L#cjhoit(HVVT|9tG0Cryv*jpRq$ zYCQdep1}+*QEdel;vMOf{8d>H3Y0=2My|vEKSyUDQq}T@`&l#VZM)5r*GM8Mltc{0 z5JgdpD2k*A#YjXk5+jTxi9{)iPz=S0q%b5&3PTLV5JOQEDGEc8q%fi=j6w>%`m_DA z)|xdl_v!v|4(D(>k$bN-^L=@q&+}S8p|xqhWR^H6Oc0Si$nQ}~;@tunT4wAQ4an%)fy9;K$N@6WXW^ww;)G(BBma22#beT}_3P!< zq`t?_&`nIX;*jfJpqKkS^t;pKq00?t(FymN>J!JM;M26+H%+7<=(C1HD)nb#Ki$V? z$Tzo3-GKtRM|iYRyNGS%dox@A!D8ulRjs9a$R}~H;X9(JV^IyVp-7^5J^V@8~Ctvtk~~*_Up0 zlttqB$H=r-(&8dnvJ7J7*nbK9X{g> zL+$i3IwumHWF!qtK?QUMB*3oNcfs^+jsGRb4#$-RtAeRkz5U&P#y0;q;eGwTC0oOx z=Kqa~-A;vJlM#DW&ow{kZ?&t$Bx8OydFo#wJ+eTR(r?}_^Hg+P-wvJBAo&3jKL@We zRy}aJNJQd80Qrv3%}TAw95T|iHujXi#CMV7uE}|KG;oDJjk^?gz)Fq>Y1VA}JK%JL zGXEZQKSvJxabQ9G_HD1&<9@fZXe|rz-|j$c+{=@L!#U^11`cz}M~x%qTL%H&RLF zwdeXM_5vNM6l$h4Kd5~HvHBT)2jX58)zKdE(9fY~v2&e7!pt0nf<-+w`qUNZL|=*; zl?m3%Y3~oJog0`fXW0dmLZcSNtf$*(Lmv2RdpPDBJr{Ta(&5@hfm8oKvI(Wp-$vuS zd}4pmyWreh5Z9o+I~Tdf!=V+VDJ@#<@W8!7F5O5VgYPwNc<;IMJms?g)L5%rZ{_j>s*w^_xDR;`Ss z%WUj1j*?68_7$jEY@ zo`N0hU7GDyg2?no6aH1Plb8Bq?j2dpKhb3M*vw;9pi(4i?dBuz4cqHXs#S0`TcG8< zY4;g-%pCg%8Kh+(ZO)24$V!U!2cS}D)|Y~Z3O4vp4ZEaH+0!ZXRUM|cmD;@ zpQ7TMVaU7YBDt@L=xhaZ9TOciX@za6j@}#f2WpV7Oi0!*ldbbgCYeEc0m#pEdgY zXJ)PT!3Y|q_HDBwcFjI&hXb~FN$qI7ljE|;Zf^6hQA3;v9dY-&?cp|ak305X8QTob z2C{Tw&C{FgF#TX$Lp36!1+>O%lw586OO?hw83(;~KbX@OFuNLzev@rZ2Y$wV^a&Cq zbF?w~8_uE)b`mVl8(tH+6{+*?hea&PRwFg)VEC~+=Z-r}*dp6MMvi(NBo=v_-=WptDKE<+byP`$yaZ!_ ztOkO}j~LYVo2&FFohL>9A2kh6!=n3AZYO! z51UKaS;W(FazwlD9rLeo<~Cp-K97p|q&jJ(cu={y2a#XVhYjf&>?~v5{rpX&Ky^E# zdJc%t>t<=-aqO^V#Dy3Ma&ZtDtsYr+hWuFhi;vS>;b9)_&|3AFz9S6V+X4*wv<(q#yT>f_`dehl*(!9&4are1-aK&9Vi5d^K*`7TfTcmYc zul_mv;dv-wH|0%jh8__8?r*kuur(Ds5*oQrCzB+_7*&62UpeC^#y@cf}7(gF3*w+ovSFWdZh;ms!(<#q?M`c3$wT zzF_BI*K%Bb#9N90rN_pr}PBV{UGzow01L)<3w!GsLL zH+2|K=smhiUB*N zFy^)QP0#vY4KgB5gp2=Pja-l$U_VT-<(OV;!K^fg*bB0xmx*WkTau?53~Yw<33-J& zaG0jboixqO<{x=axB$)x$IhhBjMEnM>w0&z!=H@AIUU|zRBJEPZLOMSKqs@rrnNeQ z&=>SEIU@qt8y|_3U?*1^c%<*Oe{QQ5Jof%pFa5mvJNhdU`dcY`!sRT*J;x-xHPs+^ ztou{wTNX%-{>%>{-1MfI5V;3`+M1DJ%B zhO(l^+-B$zz-EYPX0QJ{6SKCh;=eoWMeI%}kXM|K&Ldvv4*JbdWW4aDU*PAX+k@1~m-04Pi62OxHiZug2$Vp?OKA!*2*;Ip9D)}$h}U(UX@*8?9^L=w|Ip)5y?XT_1wKIUOFAf zGMzPS*+84L1k|dD*iJ5!0&*6KKDSjZX5$PsIm6WOKB6KNHE+i`c3jHBJohwjgcznw@c?NpLy=srSY+kae zVjq}Ev3rcy_A%D07s5w2M!V7P+$Gn=bFIUDAR8RUpGNaMGxFZ+kEZY~QSPVe=VXZ$ zmJ`-bxuO42O=OT9mzksvz0V}6(yl36OM&;hJaUGIBd^_lct)x9P`wE(LI3^BEK>&h z;d1=`x8-r{P}^7{*kbqeN#uB+0a3m{+;gAkrq>uK(yrNq=2f%DiW*<79KFjvtO~45 zub7s*9dOsDBSAb{91WlHXSRMu&B(p*8mL7_XrWAmoBORfq(${pY*^l=_58kABmwZR zpzkq1Yd2{olojLHgB&sLvvGTsw%cd0HGi+&(c7@wiNfhLt4B$T4hk0PRU7?AJRb@l zlVSH5b}u9RpzMZ^E#$06Zo7A#Mm~oPQy86ok`&ticPtv%>Y}Dw7F%al$CYfajIraBjIY5ZQfyumZ?)t8za7C9 z{t5czQ=|vGjYVEefAf#}O_hyY+$HZL-5d49W4`7$!$XBUP4k^NL#N%}NWVN4`l32O zE(^&QS{2Zo>yPqH)a zerWp(QJocervhW*=(a9>N6-#*vLbV@|58Lj3vUKHpqY-!lVn!^=#A>Nk$z=HuX`sr zrroH0!*qxt2?NQZRd%l0W&D&6oQ*WiJ(ADz-^czKZ|bEh(9p3t;hfK20Z&Z zV;3fG|56P?x z4+YZA1J=1<7(S!`*!Ve;s*~{7{$Vqs*y^IoG~W8^r5e|Gy;?A@tBklslUkub15$Ix z{#WaL`a2xi?mxnowpUz2UD6)?1d5s$tx#`y8W?NegC$^TjK(yY-PQ+fmV9Tu;)Okh zY3@G#h4v2f{$_M92g2)-{ZO@U_@|@!E1I_&;$l|ZqYniQm2Z`f`HpvQUzWrT)ZgO*6erAuIJaN*C_Z+q4H$$Vn z>b6SnZ(Fn`Jhav5_k`cja#?O{=*Nu=aMkvr|9DR3?L2lH_vH!WvArO789R7~y3Gf8 zt@!S(_;>vbcUAm}w)&^wE-#De)5d}y>_Tm~^~U)qf;`|Al2$MPPU$E8VY?>#W%B)oV!cFc$n37ROAeey2T7@_nw}iSuv>>}HAT zhPI+T)<)M{s_H>_KuzIX&#{RaN{nk0)^EYe9Nl<$=sQtER|#>A|Ja;xE(JIOiIX zD)1z5lx|sb#v~ckEB_@F@#}CC@AGey%b3BpV3XBgN;A>yGaJF;K23_`Nf~rM@JrF% zPKg%|zm$W~Qf#fqNvf8p{$K(zt3S{^bDf?DOp6|~N>q?|xUsU329S?j_-`(@zTrbr zyqW*It6dGnGwR>P4cMdd;MndpxE#>GL)R08PT-vJk-UL=;3u64q{!oV!`~u_{hQha zg6)jx0K@ zls++UlQks1oFseHS18Im#hCU(Jb|x#dvF0Hj~eqZlTaDf$$5T)|0LB&cUaQ?z!MY; z4}2;5Y}4NW<=~B)a(~J7aKL{RUX9!kuR^cQOix(N^dwC&gxpI9wGSky@7L!^hIQKC zF!Dq!YlY|cEam^m>FSsN$IVnAQPOs(#E#H&dW(5mC0pm*MD3o};UYW48;vP4gk8C9 zSe=jA>zp9FoH(z=|LlE|o#Gifpo4tDEyKQZFeXDhib*i0FoDX7{y@rYjR$g~zZ**U zPsp8f$aZtmy{~0Pb7Y0nC?4^*{u%g6bG0AxD)~S`5oCvbP9@7L+A!NtSE!9i?q&HXbjvvq&D^Tir^7?2ULOU|ZLcML+fF+mR6Az$ zt~eAuL{srbMU6WCQhx-Eki*+~B9u7+tp+sd$H;&yA-&ohuizTJ2z9_tt;9V?`kYI`MD1T-HmZ`CUfhV+jUo^<40_f2p-xz>a=*R{ zseS7_>ZkaH{*XXLDnZ!wpGOD$%J3O+@1K_xQ{NPDwGw%$T*Cy*#++%$F0sD_7wDrP zl0&Wi>I=P(Jy8ku6s7P((%_w07(lJLM#3iJ$Z% zaKikyr|6xS7fy;k78>HEP;Tamb(hGHGtSpSyZtYJi)guLf`wliNDnsXC+t6F$}?$^RooQDZc2j=*fMVk9bJPg&jUSuZxOcgspTd3-o zQBWM71uto*gTFkK&$vMlP{=vO6Zgih_&ASF_46@n+>HFoAicKNA^s zvLatX7r-z7MGANVy(~*rqkJz;$OKjc$IPPrD)xEYVOAJSaVE*HP`6v_UgagwWf^J) z3aLu*UH)(z*b-l{9&5X-WTePF)AJ(>;J0*ztNp^rV^ZbsBz@33)@UQ9P3K~g^lI~t z{@YI^Pn}czyLVC4`~9@dZ=`~xC>#E>Td~8&4tv%*qS?kK@(#HF30sJI5{!hr9g+6X zlIZ?>Jn)V;|5q9a2A%kzRvQ=V9|Wa8jCsy^{|>n%ce??`W0(&X(7r%T%z4w;_K@C=Ss@?HH9WUM9F}X|ORvG%<1&{!2~cWI$lLxktzX?W zQuQ482)fv5xHfE6uhKkE`wiV;l6J^DFTWvU`iGJ0FWY;}1sV$U`q@UQcZ}R|-io0} zmghwuMkf8Z=sZ4&D@LV%!}4UNHHx?Wqjif$?L_UN-7Oca3hwBu?n8B%7hp1V!|4b4 z5*cM$D>d|c>K!I47kQEns;|M2D7k4Rdau}+`%)B&WS%20df2}>`*~lq7FF^+){I?L zGjuJF**E!6UB_gml~wEe>5YJpWic=PTJy2|MXK41s?!O3Npke>(8P6uCc24C?-7~6 zPskhY3ve&5fNH-N`8-Zwlg*ilF@0jnJP+3S@4v}Tk_S=|EmJ4Vb~9Bk3!KyXO;k~E z1^fb;{S|A{*;liVTF z=Y9hHqD8)B464jG&^w)1CuBGOL(2IS_}i865nShRql*r=n5_GP%xNQV@Gp`KmIc*& zrn;})gz91ej=}`&eonIje$2YU!xnBC^FDR}PvIrGic`MDPM~LldyyW&U7Hp0EzeL( z&Le1X=lncW*d=}d8_f+h8MzH!+pK-sZeldZ#9`xB3-yNz@oh*sm_tT6GWLUn$nQzmEN;2b00;Ch31 zMKi2DY{`0S3jMgb4no=oyVV#D%mx!!U+kQFM(+xLbUU5V@ILX`+3@f9t!^pzoX^pI zXh4?rWN*=aFKf&$Z4&#A`=mi#)_UnddDJ}aEU-T3y?8?RNU|;0S`P;Pi>jT$)$kel zDdL4&WxQL*0$Nym#-M^!ryUN}M8N$>T12|us~u;9?c{&hUOuK)v$hAsF!Qk^wYGBeb&?2PyH4?l?B!9S0a6W+WQ4u z00|A<>=wC!@1%y6nuYMZRk_dkljwT%BlN(dY(qXaLUfQWvvyL)@@b|18#;}R{2Nek{XhC@FyO^X}c=QoTu)AzfYn+|03xx`Uy!z zPeITph$lht)Hca>R!SbS zhu|EZBe|@EcGD%=O{PenjQXF{61TPY>WAM+MTdB?o*sQk=G=ghr1cu$Y5q(70Fhq0r~I%t?;PYEAbKT>Cek7c zP-W#9InaTuiHp!!Y=W;=WJqviUj(+GA5BBPn~)=H5|v7RsAj9!8{cYF&;1oS#tz7@ zTA?;4VvRI8feen2Rt-&|iG;JK{#}0Bx#b^nQb<0}whzG*zW(%8&$z$a1|0Q zlbHIrR*l@iU&uCE3V(7s!rot#KZ+!X3UrHA{?~9^bQ!gIECpAUonW7ld}ttzXh17R z4qdYT$(jvB^~Jy$@FU;*9ytuJL%&u?NA+f_k^Tag@rKsz?e-peCnI(8d}JEbqy2#^ z*r$DiyFbxPbNkf`XO}m}pSuC*W3xf-{@@k59UgJMp{l$9f5JVx&svW$V@kmeuBK4Zr!UxGjX7M_(iYJzwQ--uR#di=F@T>Ea_#EE{zXohTZ!=4qCE%G(^i=Rij zjHmuHE6Kb_-vwrnCUe8hc0bEw&OUuvt{6vHvmvx8)~Vu26%qx@33V@M(~%`|E_zVl zboMq(Ccg!SjV~IKvItW{XTcw^j0+WipH zw2$k3yi9uwCe2IjIT$-Da!K3ElKq|fYj=s960PExHYf|pW3ABNf$uE<9qKdBQ`^xA zW@snijQ*}~XM=Pn-JyQM9k2u6Zn@ZD{?S&jCy$MJYxcxcna8YS_6PrT9g31jiMlX4RaH1Ru|CWcsgX%zJ1|4srb&ECFeKCXj$zZjrU`Ir{ zcUZ-{JHfD^S|XV3op!2&q+u`U_o_i8s7|UsS^;TC<#kjoqmw!=M#&xci;rkeQG0v? z+ZNH| zXTXbE@9pyU@lo)1caS6cytqxD$gjMPmAN@)rA#w^Bhxu(%m+)%&bVL53A+({!vjJ2 zZ$D29N0GQx?WFUNx9aWW2DBk(yz8zZcJM*%x;SY3Bt`H;ENfHdtlVcjz**m9WP*#3 zp-*c&*$(J5iFW%QiHVT0(f)sR-=|u}I$EL@zHqf~j>4 z=ALER99dQ=aJt3$NN|#A$m7g{7x*3X=rxjM%&0j`qSk0y@QPW6o&8U-&T7$pyc0?C zrQAtQif8htNavm8IheZN;fmj{HH){{U53R2>jd<`1GIn!>3O~?%iJV?l0%J(T(Rd! zp}nqV$y>dREn}_{8yL42=n(^cK6TjL?w3I``Wa65L{aGzzm0GD4_rwO@fB2+Cy^~2 zb$)xv;koc`=V$m7oCxEwwRUUV&;K^8gWEP#yWYhM<#~TXd?$t47yX;Q#k!3yQAabQ z!~R6XfFt0Kw-cY~TYC$q=Pdj(=d@j@Krd2>x4#~_->Kpau|+1P3zd8lXpMXB_Gm$* zSw7=IkEZy6$?jd(~4f)zjyoj%1##iIldsFnb*c%d%n&FzRZ$$!kLLH~#Li`IzaV9Dn|>Asf_ zvllX+O7c#WD~|hhnw--**jsZa`D{=fPoTJc%^rAv^gMnHl(1uX zqb6wx=iDKq&t9^I&0~Rmw8%~XAbr9e($0Y^v>Sw&2jZ-XB`Kgi&bx)6pBM5E?lQD8 z0aoDrv6}g$Jx88eZ;c7PJMdN>4K%t9bkchY)y9;U4NlE~vqk@G<%lccW6lw|#nf~MG?&Aqn$K!C@JX-mEAoVYSoZsEnhjrHgZ{|M1F!!<%wwF2 zX}GyEWQ)3oxm!6Dh9l}dD2rs3TX*WP5vHiXDVLqS6@IGWe75F6^0GqVx83ZOm@AGqne15X|Q>e*tRcOzeIx z>6b(g{66RX_h7@Jj*?>_y|>Y;a>;HZK*p#MgG;5*0@OlS@w4FIZH?*r(?6|x;^6FUNl^oLoG{KNxL%O=YOCtLh*ugi7s zj=baVfx_T4U!a%dJ9*$#5aycdW0>J^y`_TpoGoYt{Z`he;O z@Aa3uPy0z8z0NAd+kYfm_*}>Q72~_S6*EKY13~kH-fzvS9Ba~l&#s9TnWGB)-7?j$ zhJ*Qr#78yc3tIP?Nbrofb`8I^pMf5D$X9l4V_>Zx{Ddx4(r z6?D^MDh}!LiF84WGcaq17w)IF=GXgsWz;!Erksz+-%B_5sg}SCqc}Jpvk_Pe3RV|* z>DlaRsM)<1zVr8u^CE(j7XPTX6Srzmrqk0Tgr0OK{PQc=iS8ijS{^^}50z%;P?Z+llNJzyZ`#vys<{Iyvliu)QGq zY$_q^$cWdA2_5GlOgLgeLC&UA#$okb-z{tCYmu%Mf&o7S9ok2F6`cC>{*a&PO?j&k zR0ok;{-Apki8~Y9B~#q@B@top7ephw$<`{cJ)PWOPq>P5rOF-)3%(|)hp z*sWsqSaKWOlXi6%9e6dKqT}Q~X3dv*6`ADI@`*J42kesHVN8%`w1EA=^gR*x+A4@k zxgbbac_Z4Ca}H$nQfQe3dYFfpaP`xWoK|~Cm;6NRe-20NBDc#{%<;=vxhm1h$P1Mz zUa>TPzx`PYn=4ipyJVZ%j6qd1z2IGzOQCb#udR*fVgwu+aT6LAiJ3o`o&P3c>L72Y zvEF--^oF$#@UE|dWVveIWIF@*v|lENM?Pp@Gb)3(E!$49_7RURdi#+|u>#)gEm7&* z;z6efgn-jdvzX_J+AOjnD%8(Ft~wpqP9ADQ+XvC9`iNi+(APdFt2Ev zI?)ZIjZwXohP44aQM-t#*3~dSucdMURo5i+Pp9N@e-r)NG$C>vdgtVSGbhqSzo~or zV|ZCJ%}>S%8?q1bH)c}!hb)IaY)oEp^7Wv|G?8Fp?V)eX6Rd+e6z*|V7_H$oZrC}9 zjgD;+a@4#5;@$*!uJ5cowUe#NBv7G`BHg;s>y#(NQ@27+xkp4HiB+@u2T&Laz!QB9 z!a*<30cmp$KhrRI%N*3IbE;Gwz@+(weuXUPpXdUdsg3k1IUqssiPVUSzq>IFnT#CL zY0hL28zZg*dd$f z_h;x6twCE+H=yU~6G?u)i%pyR19=HaWIs}_8|fAAsG0=N-e!CbZK#U>J&Tq_Ui>eQhC?MWiRv3T^40nx zi?S^3ppnUz>27nsxU9d5Zpshg8TY(*&uK!A!7r=9n4sO}5-%n-NZj$XsC>t|^a9mt z40xX~d0OUQv{yXASd&mRLUlP!&eQ$)9JV8i`k^Z0e?*I4E&Gw)^HEFDkJ2eRqFn~7 zt^tm;9CF-$El#S#epsszQtOdbm=2gwo{k|yhG8R7q1VuII~CrWbt^!hS;hVVX1ML* ztb5dx{ugALRLBhQJ0IxB^!K<44r?K8FWpbl^jY$TrO;P0K|2}U=db>K7v6LahQ{?} zUTdeAgr2s#JzG8Senj(;I{MMd*WzMM1fE$twsGwSGWZ@NIrJ@F%v)ZIIO8Rd-QpmP zg3}0JFsY^4{5aVkUFT`ht4`3%a1M(n-ljY+*5M8eVmdizozdUhgZ3ud6NtqGq#XSH z<7TPf4NmMo+RJf}YkJ%fY%&MTUK^6|d;hRIQ+LNp#c*x#o z7h;*30cTV%CKR{iI@0ZaL_5@C1o~lr-o30}QG?(V?9>aaU$R157@pDZ-UqMBDN!p<2K}en^vF$Z z9~8`ssE&egM_hDvsHl4dz338X#;=vsZ^=Bc_fFAgNRO;F$F((W7+#A4QG-n1Hk^Xf zeBH0Y9rs+lLR!}e{~YvACrQ2PV^uWP>NS2?yX*=p)m}B9n=|lowz33TMW#WCUKCH< zpr7WQ}L}Al9%2 zO@K;um)h-aYU#2Jo5%oidMn^1p1^GRnU+HP$eOwA?}Fxg0F(9+K1a8M+HzRUKo@Zt zgfc-dfD$sS9RLd~RXxE(rb%t#s>!8c#^Iqwzi{3xFBkD|aCRx?gO z+b>eIU2IeZt#SXikpRs=x47UVcR*}66Odrqho`WCY$Azk+)eWC@IPLmddDx&>td2# zhugFZli?BC#0tQ{pP_rr{rYi`1;_s7e)ySm6Eub++6j`R7D%)ASZ;SN!uQ)8ea{~{ zA+h3LCZ+gk7ukY7$M)%U^qH2YC97Jp1GMO7dIWm38``>g)#%Zx%>%p(6z*K-j9Lm~ zhU~q-ZFSnupnu#!VtNlmthgdBX@|9=@bcH0U1peO>lALEIZ@_y(mVboqnje#T>lEb zORg9J!KQ+&ssrqvCbdLkC$jbWwHaOLld8&0WvzDyLg~K0^7O{|MxGg&EG-ly{qyeeDUx295kp0WsSb6ZX3H<3)D%)(8JWL z8IT$Rs#WcR&c~tP1;|Nogcn)6Zv=MHM7(noqErK$UXAs}TMm|LQM=0;#kY9b zNkqC*8g9!vbxQ3up!zksy;{s>emGt9xc8N9f|GC%e2<4Rq^giQKgMtmC}#zTxqpQ1fAqhK1>S-u;G_SFTnBabfK~&NOMoV_L-K)o&&QApy5yGVzvN|W zz<8q%Vg9&j#5*f;K3eIVL`uOSp5?TAFWp|e6%IM<9k#O-kNIu=GKOMJRcx=wOznhO zqm^$9BHeOj+gVv_C4?%xJ)zdW-@Nu{F*LZn@-zJf)ndm#LXBPqPh$>9p|Qx3K7a{E zlR7|}$c#Kp`qUrsMcWG%*O0tUeyCsKnVLYpPdO^IGTgfB4EDgTaXmH+n#Q4^Gw=}vEg8RaG zV+^6Pc>#^wNqok|;387=N=J6A zD&8-J`xHGzllKeLu?CQcSH)g+P5Y(9iNkM(ZVMgEX#ISTGcsZpX|H7;A9F{L=d zI&kj9lNLB(OQU1Xb9X%&tD;^3e65?}x61Y=;S%4?8^tlP=3ka2V38cczG_s~`P+?H z(rrIysm8jV@2`=K$d=p6pJA(3LW;~=_Dwox|C9qDW_tdle%bG`&Jn0c;om((-l7A{ zVav)fE+GT1(aJOjts-b3ANbd`YyML;BRjMad4hfQL*%)ikInpTKZ}=%{gDN)c`Gw4 z{|^3dg@6CsV_xKBTep5cW^c?9)@CQEqcm4-iNorm%!YRG5q6-bwLWZ!>M%WQ^#|ei z{e}FHNoX&gidu1xl;XaLs_{UI`Q4h1Sz-?Y4{5G32U_)vJVAa%Zu$wKJ<)nD!gI!o ze;gTqwO~6w^^3H7e8YP#&=qNE$V6(^4J$dYMgt%NR$yvbBktjCPk|@$lDq&)ijAt^ zkX&|$yh^vodFsD%&(WRotnnPg%QN~gv=&uJwNxs2P0v0B((emX7vR$1cA7rsgP=~}7c~cw`mE@ROCnt4BtQ!AZGF>EI zJ;CqvLfLFh&=Kk;9)_s3X` z^ntT{-7Uv9pbxHy5v_~uQAfp2`O=*hUGPfQt9M=o@|7E920WaURy$omI1OT7+6AT^ zc%zo-782AmLnqv-zhAoIUqMr$52774-bc&;(gI(s?S{`%~&!rT%F|luvnKX#%gMrRoN*lm&6_e^kpRnR=-n(o0MORIen}$h!S{ z*(0t&~{+M?pEeB)DKuN{Qba#FYLDfr$}MF`uX-SP+dC0FPi zr~=36C2&j1Wr)v_d49?mR!7apnERbFhIpLz!F%I}q1%0g)Rt;+Rc&p-=5!rHch z1Oh$8w00ZW>uvv^Fx13PL1UlkXZfS>i>`@*NV0!6`q|lolRSf(^itrrbvkZG%u0aR zQIW6xj!2wJx7>$XGd6c`Sr75h8P13(rmRh5Qr-X~=%9G2E;%=OD0(e2Atu8aY{DC6 zqwvj#@x+uGqhP!pgnupFVC$Rg@1S+{B-U{9D4;wp}grnrX zs->Oq6&;3tBHhf=PSd@b0Y10mmhr1@5(xQm{zLDKnBlt`P~9Delop|>7slQS|yI_M9Ng8aG;ZPy0B#J*tqbO_Yf`|Ki83 zEs?|M(#M@@xfiaM$6(YxQQhJxo28}jp&!!Dus&HT3uS`;1%8G~H3(hGD{T@vkx9mV zYY*Pl=lmvW%v$FxYLEt!r|p-hdEk6|&Wer0#^t~f?S-B0muauuE_cI8jqGwiggZev z+n@*e6YGXHY`+GPk#EFd#7ft+O@e6U^lIk;|D!AKc%@4J<7q@;Uu^r~NJ zz9Ki6U~B3LL)Q;otf8OLxAgB?g$^Y=I}XZ;gIRkl?x9Uy7cJzkqkphV8UUv>kv(Qb zc?2gqg zd$9xjMTguj